(self, type, value, context)
Add a token; return True iff this is the end of the program.
Add a token; return True iff this is the end of the program.
Add a token ; return True iff this is the end of the program .
def addtoken(self, type, value, context):
        """Add a token; return True iff this is the end of the program."""
        # Map from token to label
        ilabel = self.classify(type, value, context)
        # Loop until the token is shifted; may raise exceptions
        while True:
            dfa, state, node = self.stack[-1]
            states, first = dfa
            arcs = states[state]
            # Look for a state with this label
            for i, newstate in arcs:
                t, v = self.grammar.labels[i]
                if ilabel == i:
                    # Look it up in the list of labels
                    assert t < 256
                    # Shift a token; we're done with it
                    self.shift(type, value, newstate, context)
                    # Pop while we are in an accept-only state
                    state = newstate
                    while states[state] == [(0, state)]:
                        self.pop()
                        if not self.stack:
                            # Done parsing!
                            return True
                        dfa, state, node = self.stack[-1]
                        states, first = dfa
                    # Done with this token
                    return False
                elif t >= 256:
                    # See if it's a symbol and if we're in its first set
                    itsdfa = self.grammar.dfas[t]
                    itsstates, itsfirst = itsdfa
                    if ilabel in itsfirst:
                        # Push a symbol
                        self.push(t, self.grammar.dfas[t], newstate, context)
                        break # To continue the outer while loop
            else:
                if (0, state) in arcs:
                    # An accepting state, pop it and try something else
                    self.pop()
                    if not self.stack:
                        # Done parsing, but another token is input
                        raise ParseError("too much input",
                                         type, value, context)
                else:
                    # No success finding a transition
                    raise ParseError("bad input", type, value, context)
def addtoken ( self , type , value , context ) : # Map from token to label ilabel = self . classify ( type , value , context ) # Loop until the token is shifted; may raise exceptions while True : dfa , state , node = self . stack [ - 1 ] states , first = dfa arcs = states [ state ] # Look for a state with this label for i , newstate in arcs : t , v = self . grammar . labels [ i ] if ilabel == i : # Look it up in the list of labels assert t < 256 # Shift a token; we're done with it self . shift ( type , value , newstate , context ) # Pop while we are in an accept-only state state = newstate while states [ state ] == [ ( 0 , state ) ] : self . pop ( ) if not self . stack : # Done parsing! return True dfa , state , node = self . stack [ - 1 ] states , first = dfa # Done with this token return False elif t >= 256 : # See if it's a symbol and if we're in its first set itsdfa = self . grammar . dfas [ t ] itsstates , itsfirst = itsdfa if ilabel in itsfirst : # Push a symbol self . push ( t , self . grammar . dfas [ t ] , newstate , context ) break # To continue the outer while loop else : if ( 0 , state ) in arcs : # An accepting state, pop it and try something else self . pop ( ) if not self . stack : # Done parsing, but another token is input raise ParseError ( "too much input" , type , value , context ) else : # No success finding a transition raise ParseError ( "bad input" , type , value , context )