?? calc.py
字號:
# -----------------------------------------------------------------------------# calc.py## A simple calculator with variables. This is from O'Reilly's# "Lex and Yacc", p. 63.# -----------------------------------------------------------------------------tokens = ( 'NAME','NUMBER', 'PLUS','MINUS','TIMES','DIVIDE','EQUALS', 'LPAREN','RPAREN', )# Tokenst_PLUS = r'\+'t_MINUS = r'-'t_TIMES = r'\*'t_DIVIDE = r'/'t_EQUALS = r'='t_LPAREN = r'\('t_RPAREN = r'\)'t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'def t_NUMBER(t): r'\d+' try: t.value = int(t.value) except ValueError: print "Integer value too large", t.value t.value = 0 return tt_ignore = " \t"def t_newline(t): r'\n+' t.lineno += t.value.count("\n") def t_error(t): print "Illegal character '%s'" % t.value[0] t.skip(1) # Build the lexerimport lexlex.lex()# Parsing rulesprecedence = ( ('left','PLUS','MINUS'), ('left','TIMES','DIVIDE'), ('right','UMINUS'), )# dictionary of namesnames = { }def p_statement_assign(t): 'statement : NAME EQUALS expression' names[t[1]] = t[3]def p_statement_expr(t): 'statement : expression' print t[1]def p_expression_binop(t): '''expression : expression PLUS expression | expression MINUS expression | expression TIMES expression | expression DIVIDE expression''' if t[2] == '+' : t[0] = t[1] + t[3] elif t[2] == '-': t[0] = t[1] - t[3] elif t[2] == '*': t[0] = t[1] * t[3] elif t[2] == '/': t[0] = t[1] / t[3]def p_expression_uminus(t): 'expression : MINUS expression %prec UMINUS' t[0] = -t[2]def p_expression_group(t): 'expression : LPAREN expression RPAREN' t[0] = t[2]def p_expression_number(t): 'expression : NUMBER' t[0] = t[1]def p_expression_name(t): 'expression : NAME' try: t[0] = names[t[1]] except LookupError: print "Undefined name '%s'" % t[1] t[0] = 0def p_error(t): print "Syntax error at '%s'" % t.valueimport yaccyacc.yacc()while 1: try: s = raw_input('calc > ') except EOFError: break yacc.parse(s)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -