'LPAREN','RPAREN',
'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
'NOT', 'OR', 'AND', 'THEN', 'EQV',
+ 'EQ', 'NE', 'LT', 'LE', 'GT', 'GE',
+ 'ABS', 'EXP',
)
# Tokens
-t_NOT = r'\.NOT\.'
+t_ABS = r'\.ABS\.'
+t_EXP = r'\.P\.'
+t_NOT = r'\.NOT\.'
t_OR = r'\.OR\.'
t_AND = r'\.AND\.'
t_THEN = r'\.OR\.'
t_EQV = r'\.EQV\.'
+t_LT = r'\.L\.'
+t_LE = r'\.LE\.'
+t_GT = r'\.G\.'
+t_GE = r'\.GE\.'
+t_EQ = r'\.E\.'
+t_NE = r'.\NE\.'
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
('left','OR'),
('left','AND'),
('right','NOT'),
+ ('left', 'EQ', 'NE', 'LT', 'LE', 'GT', 'GE'),
('left','PLUS','MINUS'),
('left','TIMES','DIVIDE'),
('right','UMINUS'),
+ ('left','EXP'),
+ ('right', 'ABS', 'UPLUS')
)
def p_statement_assign(t):
'''expression : expression OR expression
| expression AND expression
| expression THEN expression
- | expression EQV expression'''
+ | expression EQV expression
+ | expression LT expression
+ | expression LE expression
+ | expression GT expression
+ | expression GE expression
+ | expression EQ expression
+ | expression NE expression
+ | expression EXP expression
+ '''
t[0] = (t[2][1:-1].lower(), t[1], t[3])
def p_expression_not(t):
'expression : MINUS expression %prec UMINUS'
t[0] = ('-', t[2])
+def p_expression_uplus(t):
+ 'expression : PLUS expression %prec UPLUS'
+ t[0] = ('+', t[2])
+
+def p_expression_abs(t):
+ 'expression : ABS expression %prec ABS'
+ t[0] = ('abs', t[2])
+
def p_expression_group(t):
'expression : LPAREN expression RPAREN'
t[0] = t[2]
import yacc
yacc.yacc()
+import readline
+
while 1:
try:
s = raw_input('calc > ')