parsing - Ply : problem while defining rules for the "c" language -


i'm trying write parser c language able take care of expressions, assignments, if-else , while loops.

here rules :

expression -> expression op expression
expression -> id
expression -> number
statement -> id assign expression
statement -> if expression statement
statement -> while expression statement

everything in caps token(terminal symbol)

when parsing string "while h<=0 t=1", seems consider "h" expression (using rule expression->id). so, expression in "while expression statement" becomes "h". obviously, want consider "h<=0" expression (using rules expression -> expression op expression). how make sure happens?

building on previous post asking ply.lex module, snippet below seems partial implementation of c-like grammar. haven't used ply much, 1 of tricks seems need define grammar rules in correct order.

tokens   = [ 'id', 'number', 'lessequal', 'assign' ] reserved = {     'while' : 'while',     'then'  : 'then',     'if'    : 'if' } tokens += reserved.values()  t_ignore    = ' \t' t_number    = r'\d+' t_lessequal = r'<=' t_assign    = r'\='  def t_id(t):     r'[a-za-z_][a-za-z0-9_]*'     if t.value in reserved:         t.type = reserved[ t.value ]     return t  def t_error(t):     print 'illegal character'     t.lexer.skip(1)  def p_statement_assign(p):     'statement : id assign expression'     p[0] = ('assign', p[1], p[3] )  def p_statement_if(p):     'statement : if expression statement'     p[0] = ('if', p[2], p[4] )  def p_statement_while(p):     'statement : while expression statement'     p[0] = ('while', p[2], p[4] )  def p_expression_simple(p):     '''expression : id                   | number'''     p[0] = p[1]  def p_expression_cmp(p):     'expression : expression lessequal expression'     p[0] = ( '<=', p[1], p[3] )  import ply.lex lex import ply.yacc yacc lexer = lex.lex() parser = yacc.yacc() inp = 'while h<=0 t=1' res = parser.parse(inp) print res 

output snippet is:

('while', ('<=', 'h', '0'), ('assign', 't', '1')) 

Comments

Popular posts from this blog

apache - Add omitted ? to URLs -

redirect - bbPress Forum - rewrite to wwww.mysite prohibits login -

php - How can I stop spam on my custom forum/blog? -