Example #1
0
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
Example #2
0
 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()