You're not propagating values correctly by assigning to p[0].
For example, in the p_statement_expr() rule.

-Dave

On Sun 08/02/09  6:20 AM , matio [email protected] sent:
> 
> I've been using ply & have extended the example slightly:
> 
> [code]
> <code>
> import ply.lex as lex
> 
> reserved = {'print':'PRINT', 'quit' : 'QUIT'}
> 
> # List of token names.   This is always required
> tokens = [
> 'NUMBER',
> 'NAME',
> 'PLUS',
> 'MINUS',
> 'TIMES',
> 'DIVIDE',
> 'LPAREN',
> 'RPAREN',
> 'EQUALS',
> 'STRING',
> ] + list(reserved.values())
> 
> # Regular expression rules for simple tokens
> t_PLUS    = r'\+'
> t_MINUS   = r'-'
> t_TIMES   = r'\*'
> t_DIVIDE  = r'/'
> t_LPAREN  = r'\('
> t_RPAREN  = r'\)'
> t_EQUALS = r'='
> 
> def t_NAME(t):
> r'[a-zA-Z_][a-zA-Z_0-9]*'
> t.type = reserved.get(t.value,'NAME')    # Check for reserved
> words
> return t
> 
> 
> # A regular expression rule with some action code
> def t_NUMBER(t):
> r'\d+'
> t.value = int(t.value)
> return t
> 
> # Define a rule so we can track line numbers
> def t_newline(t):
> r'\n+'
> t.lexer.lineno += len(t.value)
> 
> def t_STRING(t):
> r'\"([^\\"]|(\\.))*\"'
> escaped = 0
> str = t.value[1:-1]
> new_str = ""
> for i in range(0, len(str)):
> c = str[i]
> if escaped:
> if c == "n":
> c = "\n"
> elif c == "t":
> c = "\t"
> new_str += c
> escaped = 0
> else:
> if c == "\\":
> escaped = 1
> else:
> new_str += c
> t.value = new_str
> return t
> 
> 
> # A string containing ignored characters (spaces and tabs)
> t_ignore  = ' \t'
> 
> # Error handling rule
> def t_error(t):
> print "Illegal character '%s'" % t.value[0]
> t.lexer.skip(1)
> 
> # Build the lexer
> lexer = lex.lex()
> [/code]
> </code>
> 
> &
> 
> [code]
> <code>
> import ply.yacc as yacc
> import sys
> 
> # Get the token map from the lexer.  This is required.
> from calclex import tokens
> 
> names = {}
> def p_statement_assign(t):
> 'statement : NAME EQUALS expression'
> names[t[1]] = t[3]
> 
> def p_statement_expr(t):
> 'statement : expression'
> if t[1] != None:
> print t[1]
> else:
> pass
> 
> def p_expression_name(t):
> 'expression : NAME'
> try:
> t[0] = names[t[1]]
> except LookupError:
> print "Undefined name '%s'" % t[1]
> t[0] = 0
> 
> def p_expression_plus(p):
> 'expression : expression PLUS term'
> p[0] = p[1] + p[3]
> 
> def p_expression_minus(p):
> 'expression : expression MINUS term'
> p[0] = p[1] - p[3]
> 
> def p_expression_term(p):
> 'expression : term'
> p[0] = p[1]
> 
> def p_term_times(p):
> 'term : term TIMES factor'
> p[0] = p[1] * p[3]
> 
> def p_term_div(p):
> 'term : term DIVIDE factor'
> p[0] = p[1] / p[3]
> 
> def p_term_factor(p):
> 'term : factor'
> p[0] = p[1]
> 
> def p_factor_num(p):
> 'factor : NUMBER'
> p[0] = p[1]
> 
> def p_factor_expr(p):
> 'factor : LPAREN expression RPAREN'
> p[0] = p[2]
> 
> def p_print(p):
> '''expression : PRINT LPAREN STRING RPAREN
> | PRINT LPAREN expression RPAREN'''
> p[0] = p[3]
> 
> def p_quit(p):
> 'expression : QUIT'
> sys.exit()
> 
> # Error rule for syntax errors
> def p_error(p):
> print "Syntax error in input!"
> 
> # Build the parser
> parser = yacc.yacc()
> 
> if len(sys.argv) == 1:
> while True:
> try:
> s = raw_input('calc > ')
> except EOFError:
> break
> if not s: continue
> result = parser.parse(s)
> print result
> 
> elif sys.argv[1] == "-f":
> f = open(sys.argv[2], "r")
> s = f.readlines()
> for line in s:
> result = parser.parse(line)
> if result != None:
> print "result != none"
> print result
> [/code]
> </code>
> When I run print("hello") it says:
> hello
> none
> calc>
> 
> 
> What's wrong?
> I also posted it at 
> http://ubuntuforums.org/showthread.php?p=6698006#post6698006> 
> 
> 
> 



--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to