I'm playing with Ply, my input file is as follows:
$foo = 1;
$bar = 3;
My problem is, when I pass multiple lines to the parser, it errors out
after the first statement at $bar...
<code>
#!/usr/bin/env python
import os, sys
import ply.lex as lex
import ply.yacc as yacc
tables = {}
reserved = {
'if' : 'IF',
'else' : 'ELSE',
'elsif' : 'ELSIF',
'while' : 'WHILE',
'for' : 'FOR',
'print' : 'PRINT'
}
tokens = [
'VARIABLE', 'NUMBER',
'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'EQUALS',
'LPAREN', 'RPAREN', 'SEMI', 'COMMENT',
'LT', 'GT', 'ET', 'LE', 'GE'
]
tokens += list(reserved.values())
t_LT = r'<'
t_GT = r'>'
t_ET = r'=='
t_LE = r'<='
t_GE = r'>='
t_SEMI = r';'
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_EQUALS = r'='
t_LPAREN = r'\('
t_RPAREN = r'\)'
t_ignore = ' \t'
def t_COMMENT(t):
r'\#.*'
pass
def t_VARIABLE(t):
r'\$[a-zA-Z]{1,}'
t.type = reserved.get(t.value, 'VARIABLE')
return t
def t_NUMBER(t):
r'[0-9]+'
t.value = int(t.value)
return t
def t_newline(t):
r'\n'
t.lexer.lineno += 1
def t_error(t):
print "Illegal character '%s'" % t.value[0]
t.lexer.skip(1)
lexer = lex.lex()
precedence = (
('left', 'PLUS','MINUS'),
('left', 'TIMES','DIVIDE')
)
def p_statement_assignment(p):
'''
statement : VARIABLE EQUALS expression SEMI
'''
tables[p[1].replace("$", "")] = p[3]
print "statement_assignment"
def p_statement_expression(p):
'''
statement : expression
'''
print "statement_expression"
p[0] = p[1]
def p_expression(p):
'''
expression : expression PLUS expression
| expression MINUS expression
| expression TIMES expression
| expression DIVIDE expression
'''
print "expression"
if p[2] == '+':
p[0] = p[1] + p[3]
elif p[2] == '-':
p[0] = p[1] - p[3]
elif p[2] == '*':
p[0] = p[1] * p[3]
elif p[2] == '/':
p[0] = p[1] / p[3]
def p_expression_number(p):
'''
expression : NUMBER
'''
print "expression_number"
p[0] = p[1]
def p_expression_variable(p):
'''
expression : VARIABLE
'''
print "expression_variable"
try:
p[0] = tables[p[1].replace("$", "")]
except IndexError:
print "Cannot find variable"
pass
def p_error(p):
if not p:
print "Syntax error: premature end of file"
else:
print "Syntax error on line %d: %s" % (p.lineno, p.value)
parser = yacc.yacc()
def run():
data = open(sys.argv[1]).read()
parser.parse(data)
if __name__ == "__main__":
if len(sys.argv) != 2:
sys.exit(0)
run()
print str(tables)
</code>
Does anyone see what I'm doing wrong here?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"ply-hack" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/ply-hack?hl=en
-~----------~----~----~----~------~----~------~--~---