I'm going to go with specifying t_STRING after t_NAME, so that the word "string" is taken as a NAME. Try putting t_STRING before t_NAME...
-Bruce On Sun, Oct 11, 2009 at 4:09 AM, matio <[email protected]> wrote: > > I have this code: > # > > ----------------------------------------------------------------------------- > # calc.py > # > # A simple calculator with variables. This is from O'Reilly's > # "Lex and Yacc", p. 63. > # > > ----------------------------------------------------------------------------- > > import sys > sys.path.insert(0,"../..") > > if sys.version_info[0] >= 3: > raw_input = input > > tokens = ( > 'NAME','NUMBER','STRING', 'STRDEF' > ) > > literals = ['=','+','-','*','%','/', '(',')'] > > # Tokens > > t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' > t_STRING = r'"[a-zA-Z0-9]*"' > t_STRDEF = 'string' > > def t_NUMBER(t): > r'\d+' > t.value = int(t.value) > return t > > t_ignore = " \t" > > def t_newline(t): > r'\n+' > t.lexer.lineno += t.value.count("\n") > > def t_error(t): > print("Illegal character '%s'" % t.value[0]) > t.lexer.skip(1) > > # Build the lexer > import ply.lex as lex > lex.lex() > > # Parsing rules > > precedence = ( > ('left','+','-'), > ('left','*','/'), > ('right','UMINUS'), > ) > > # dictionary of names > names = { } > > def p_statement_assign(p): > '''statement : NAME "=" expression > | STRDEF NAME "=" STRING''' > if p[2] == "=": names[p[1]] = p[3] > if p[3] == "=": names[p[2]] = p[4] > > > > def p_statement_expr(p): > 'statement : expression' > print(p[1]) > > def p_expression_binop(p): > '''expression : expression '+' expression > | expression '-' expression > | expression '*' expression > | expression '/' expression > | expression '%' 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] > elif p[2] == '%': p[0] = p[1] % p[3] > > def p_expression_uminus(p): > "expression : '-' expression %prec UMINUS" > p[0] = -p[2] > > def p_expression_group(p): > "expression : '(' expression ')'" > p[0] = p[2] > > def p_expression_number(p): > "expression : NUMBER" > p[0] = p[1] > > def p_expression_name(p): > "expression : NAME" > try: > p[0] = names[p[1]] > except LookupError: > print("Undefined name '%s'" % p[1]) > p[0] = 0 > > def p_error(p): > if p: > print("Syntax error at '%s'" % p.value) > else: > print("Syntax error at EOF") > > import ply.yacc as yacc > yacc.yacc() > > while 1: > try: > s = raw_input('calc > ') > except EOFError: > break > if not s: continue > yacc.parse(s) > > when I do something like: > string a = "h" > > it says: > Syntax error at 'a' > > why doesn't it work? > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
