Beispiel #1
0
 def from_cache(cls, grammar, data):
     lr_action = [
         dict([(str(k), v) for k, v in iteritems(action)])
         for action in data["lr_action"]
     ]
     lr_goto = [
         dict([(str(k), v) for k, v in iteritems(goto)])
         for goto in data["lr_goto"]
     ]
     return LRTable(grammar, lr_action, lr_goto, data["default_reductions"],
                    data["sr_conflicts"], data["rr_conflicts"])
Beispiel #2
0
 def from_cache(cls, grammar, data):
     lr_action = [
         dict([(str(k), v) for k, v in iteritems(action)])
         for action in data['lr_action']
     ]
     lr_goto = [
         dict([(str(k), v) for k, v in iteritems(goto)])
         for goto in data['lr_goto']
     ]
     return LRTable(grammar, lr_action, lr_goto, data['default_reductions'],
                    data['sr_conflicts'], data['rr_conflicts'])
Beispiel #3
0
 def add_lookaheads(cls, lookbacks, followset):
     for trans, lb in iteritems(lookbacks):
         for state, p in lb:
             f = followset.get(trans, [])
             laheads = p.lookaheads.setdefault(state, [])
             for a in f:
                 if a not in laheads:
                     laheads.append(a)
Beispiel #4
0
 def from_cache(cls, grammar, data):
     lr_action = [
         dict([(str(k), v) for k, v in iteritems(action)])
         for action in data["lr_action"]
     ]
     lr_goto = [
         dict([(str(k), v) for k, v in iteritems(goto)])
         for goto in data["lr_goto"]
     ]
     return LRTable(
         grammar,
         lr_action,
         lr_goto,
         data["default_reductions"],
         data["sr_conflicts"],
         data["rr_conflicts"]
     )
Beispiel #5
0
 def add_lookaheads(cls, lookbacks, followset):
     for trans, lb in iteritems(lookbacks):
         for state, p in lb:
             f = followset.get(trans, [])
             laheads = p.lookaheads.setdefault(state, [])
             for a in f:
                 if a not in laheads:
                     laheads.append(a)
Beispiel #6
0
 def compute_grammar_hash(self, g):
     hasher = hashlib.sha1()
     hasher.update(g.start.encode())
     hasher.update(json.dumps(sorted(g.terminals)).encode())
     for term, (assoc, level) in sorted(iteritems(g.precedence)):
         hasher.update(term.encode())
         hasher.update(assoc.encode())
         hasher.update(bytes(level))
     for p in g.productions:
         hasher.update(p.name.encode())
         hasher.update(json.dumps(p.prec).encode())
         hasher.update(json.dumps(p.prod).encode())
     return hasher.hexdigest()
Beispiel #7
0
 def compute_grammar_hash(self, g):
     hasher = hashlib.sha1()
     hasher.update(g.start.encode())
     hasher.update(json.dumps(sorted(g.terminals)).encode())
     for term, (assoc, level) in sorted(iteritems(g.precedence)):
         hasher.update(term.encode())
         hasher.update(assoc.encode())
         hasher.update(bytes(level))
     for p in g.productions:
         hasher.update(p.name.encode())
         hasher.update(json.dumps(p.prec).encode())
         hasher.update(json.dumps(p.prod).encode())
     return hasher.hexdigest()
Beispiel #8
0
 def data_is_valid(self, g, data):
     if g.start != data["start"]:
         return False
     if sorted(g.terminals) != data["terminals"]:
         return False
     if sorted(g.precedence) != sorted(data["precedence"]):
         return False
     for key, (assoc, level) in iteritems(g.precedence):
         if data["precedence"][key] != [assoc, level]:
             return False
     if len(g.productions) != len(data["productions"]):
         return False
     for p, (name, prod, (assoc, level)) in zip(g.productions, data["productions"]):
         if p.name != name:
             return False
         if p.prod != prod:
             return False
         if p.prec != (assoc, level):
             return False
     return True
Beispiel #9
0
 def data_is_valid(self, g, data):
     if g.start != data["start"]:
         return False
     if sorted(g.terminals) != data["terminals"]:
         return False
     if sorted(g.precedence) != sorted(data["precedence"]):
         return False
     for key, (assoc, level) in iteritems(g.precedence):
         if data["precedence"][key] != [assoc, level]:
             return False
     if len(g.productions) != len(data["productions"]):
         return False
     for p, (name, prod, (assoc, level)) in zip(g.productions, data["productions"]):
         if p.name != name:
             return False
         if p.prod != prod:
             return False
         if p.prec != (assoc, level):
             return False
     return True
Beispiel #10
0
 def unused_productions(self):
     return [p for p, prods in iteritems(self.nonterminals) if not prods]
Beispiel #11
0
 def unused_terminals(self):
     return [
         t
         for t, prods in iteritems(self.terminals)
         if not prods and t != "error"
     ]
Beispiel #12
0
 def unused_productions(self):
     return [p for p, prods in iteritems(self.nonterminals) if not prods]
Beispiel #13
0
 def unused_terminals(self):
     return [
         t for t, prods in iteritems(self.terminals)
         if not prods and t != "error"
     ]