今年过年回家本来要好好放松一下的,但是闲了几天发现很无聊,于是乎想起来了以前想学的东西,但是没来得及学的,那就是解释器,但是我没把电脑带回来,大家一定想不到,我这篇博客竟然是在树莓派中写的,哈哈。废话不多说,现在开始。
首先给出这次的代码:https://download.youkuaiyun.com/download/shixiongtao/12116774。大家自己首先下载运行一下看一下效果。
虽然功能非常简单,但是基本上体现了一个完整的过程。
PLY是lex和yacc的纯python实现,需要用到两个包 ply.lex和ply.yacc,ply.lex是把程序分割为一个个的标记(token),ply.yacc则是负责根据token生成语法,并执行。
###################################################
tokens = ['ID', 'FLOAT', 'INT']
literals = ['=', '+', '-', '*', '/', '(', ')']
t_ignore = " \t"
t_ID = r'[a-zA-Z_][a-zA-Z_0-9]*'
def t_FLOAT(t):
r'\d+\.\d+'
t.value = float(t.value)
print('t_FLOAT', t.value)
return t
def t_INT(t):
r'\d+'
t.value = int(t.value)
print('t_INT', t.value)
return 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()
###################################################
# dictionary of ids
ids = {}
# Parsing rules
precedence = (
('left', '+', '-'),
('left', '*', '/'),
('right', 'UMINUS'),
)
def p_statement_assign(p):
'statement : ID "=" expression'
ids[p[1]] = p[3]
for i in range(len(p)):
print('p_statement_assign', 'pos', i, 'value', p[i])
def p_statement_expr(p):
'statement : expression'
print(p[1])
for i in range(len(p)):
print('p_statement_expr', 'pos', i, 'value', p[i])
def p_expression_plus(p):
'''expression : expression '+' expression'''
p[0] = p[1] + p[3]
for i in range(len(p)):
print('p_expression_plus', 'pos', i, 'value', p[i])
def p_expression_minus(p):
'''expression : expression '-' expression'''
p[0] = p[1] - p[3]
for i in range(len(p)):
print('p_expression_minus', 'pos', i, 'value', p[i])
def p_expression_times(p):
'''expression : expression '*' expression'''
p[0] = p[1] * p[3]
for