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