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
Post a Comment