Exemple #1
0
def compute_closure(I, G):
    rules_ = G.rules
    J = set(I)
    closure = set(I)
    fixpoint = False
    while not fixpoint:
        print('fixpoint not reached')
        fixpoint = True
        J = closure.copy()
        for item in J:
            print('item : ')
            print(item)
            if not item.complete:
                suff = item.suffix
                for rule in rules_:
                    print('rule : ')
                    print(rule)
                    head = rule.head
                    if head == suff[0]:
                        additem = LR0Item((
                            rule,
                            0,
                        ))
                        if additem not in closure:
                            closure.add(additem)
                            print('* added *')
                            fixpoint = False
    return closure
Exemple #2
0
def compute_items_1(G, S):
    FRule = G.rules[0]
    dollar = NT("$")
    FItem = LR1Item(LR0Item((
        FRule,
        0,
    )), dollar)
    C = [(compute_closure_1([FItem], G))]
    States = dict()
    Graph = dict()
    while C:
        print('fixpoint not reached : Items built : ')
        print(C)
        I = C.pop()
        Table = dict()
        # for X in G.symbols:
        for X in S:
            transition = compute_transition_1(I, X, G)
            print(transition)
            if len(transition) > 0:
                print('will be added')
                Table.update({X: transition})
                if transition not in C: C.append(transition)
                print(' State added, States :')
                print(C)
        Graph.update({frozenset(I): Table})
    return Graph
Exemple #3
0
 def closure(self, items):
     done = set()
     clos = set()
     todo = list(items)
     while todo:
         it = todo.pop()
         #print("item"," ".join(map(str,it)))
         clos.add(it)
         if it.complete:
             continue
         nxt = it.next
         #print("Next is "+str(nxt))
         if nxt.is_T :
         #if (nxt,it.token) in done:
             continue
         done.add((nxt,it.token))
         first= self.grammar.first(it.suffix[1:]+(it.token,))
         # print("FIRST("," ".join(map(str,it.suffix[1:]+(it.token,))),")")
         # for f in first:
         #     print(f)
         for r in self.grammar.rules:
             if r.head is nxt:
                 for b in first: 
                     it = LR1Item((LR0Item((r,0)),b))
                     if it not in clos:
                         todo.append(it)
     return frozenset(clos)
Exemple #4
0
 def __init__(self, gram):
     self._grammar = gram
     self._begin   = self.closure([LR1Item((LR0Item((gram.axiom_rule,0,)),EOF))])
     self._graph   = None
     self._index   = None
     self._rindex  = None
     self._table   = None
     self._states  = None
     self._sem     = None
Exemple #5
0
 def transition(self,I,X):
     J=set()
     for item in I :
         rule_=item.rule
         index=item.index
         if not item.lr0.complete:
             if X==item.suffix[0]:
                 shift=LR1Item((LR0Item((rule_,index+1,)),item.token,))
                 J.add(shift)
     #print "CLOSURE:",map(str,J)
     return self.closure(J)
Exemple #6
0
def compute_transition(I, X, G):
    J = set()
    for item in I:
        rule_ = item.rule
        index = item.index
        if not item.complete:
            if X == item.suffix[0]:
                shift = LR0Item((
                    rule_,
                    index + 1,
                ))
                J.add(shift)
    return compute_closure(J, G)
Exemple #7
0
 def transition(self, I, X):
     J = set()
     for item in I:
         rule_ = item.rule
         index = item.index
         if not item.complete:
             if X == item.suffix[0]:
                 shift = LR0Item((
                     rule_,
                     index + 1,
                 ))
                 J.add(shift)
     return self.closure(J)
Exemple #8
0
 def closure(self, items):
     done = set()
     clos = set()
     todo = list(items)
     while todo:
         it = todo.pop()
         clos.add(it)
         if it.complete:
             continue
         nxt = it.next
         if nxt.is_T or nxt in done:
             continue
         done.add(nxt)
         for r in self.grammar.rules:
             if r.head is nxt:
                 it = LR0Item((r, 0))
                 if it not in clos:
                     todo.append(it)
     return frozenset(clos)
Exemple #9
0
 def __init__(self, gram):
     self._grammar = gram
     self._begin = self.closure([LR0Item((gram.axiom_rule, 0))])
     self._graph = None
     self._index = None
     self._rindex = None