class JavaScriptParser( object ): def __init__( self, string_to_parse ): self.string = string_to_parse self.tokens = JavaScriptTokenizer( string_to_parse ).tokenize() self.symbols = SymbolTable( self ) self.next() self.parse_tree = self.expression() # # Grab the next token, convert it to a symbol # def next( self, id = None ): if ( id is not None and self.current_symbol.id != id ): raise SyntaxError( 'Expected `%r`, got `%r`' % ( id, self.current_symbol.id ) ) t = self.tokens.next() s = None if t is None: s = self.symbols.get( '(END)' )() elif t.type == '(OPERATOR)': s = self.symbols.get( t.value )() s.type = t.type else: s = self.symbols.get( t.type )() s.value = t.value s.type = t.type self.current_symbol = s # # Expression is the core of the parser # def expression( self, right_binding_power = 0 ): symbol = self.current_symbol self.next() left = symbol.nud() while right_binding_power < self.current_symbol.lbp: symbol = self.current_symbol self.next() left = symbol.led( left ) return left
def __init__( self, string_to_parse ): self.string = string_to_parse self.tokens = JavaScriptTokenizer( string_to_parse ).tokenize() self.symbols = SymbolTable( self ) self.next() self.parse_tree = self.expression()