基于PLY的解释器

今年过年回家本来要好好放松一下的,但是闲了几天发现很无聊,于是乎想起来了以前想学的东西,但是没来得及学的,那就是解释器,但是我没把电脑带回来,大家一定想不到,我这篇博客竟然是在树莓派中写的,哈哈。废话不多说,现在开始。

首先给出这次的代码:https://download.csdn.net/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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值