【问题标题】:Ply example calculator multiple expressionsPly 示例计算器多个表达式
【发布时间】:2016-08-23 20:08:14
【问题描述】:

我一直在试用 Ply example calculator from Github

当我运行计算器时,它会在 REPL 中运行。我将如何使用 Ply 使多个表达式一个接一个地被评估。

例如,如果我输入 3+4,REPL 会这样做:

calc > 3+4
7
calc >

如果我输入4+3 6+2,REPL 会这样做:

calc > 4+3 6+2
Syntax error at '6'
2
calc >  

我将如何修改示例计算器以使 REPL 能够执行此操作:

calc > 4+3 6+2
7
8
calc > 

我需要修改语法、解析器还是两者都修改?我已经尝试修改语法以使其保持递归,但它似乎不起作用。

【问题讨论】:

  • 由于示例语法已经左递归,您尝试将其修改为左递归的声明需要一些说明。 (为什么你会认为这会有所作为?)
  • 太宽泛了:你基本上找到了一个第三方库,你问如何为自己的目的修改它,这并不比“为我写这段代码”好。跨度>
  • @Two-BitAlchemist 老实说我不是。我正在尝试使用 Ply 编写一个简单的解释器,而我的解释器目前一次只能评估一个表达式/语句。我不想发布我的解释器,因为它比示例计算器要长得多。我选择了示例计算器,因为它具有与我试图弄清楚的相同的限制,而且它要小得多。

标签: python parsing lexer ply


【解决方案1】:

示例计算器的语法允许像- 42(或-(4*8)+7)这样的表达式。如果这样的表达式是一行中的第二个表达式,则会产生歧义。是:

calc > 4 * 3 -(4*8)+7

一个或两个表达式?

使语法明确的一种方法是允许在一行上使用逗号分隔多个表达式。您可以通过将 '.' 添加到文字标记列表中并放置函数来做到这一点

def p_line(p):
    '''line : statement
            | line ',' statement'''
    pass

作为第一个解析器函数(即,就在p_statement_assign之前。

随着那个变化:

$ python calc.py
Generating LALR tables
calc > 2+3
5
calc > 2+3,4+6
5
10
calc > 2,3
2
3
calc > a=2,a+7
9

【讨论】:

  • 谢谢!这正是我想要的!我什至不知道你可以在没有解析器操作的情况下在语法中有一行。
  • pass 是一个动作。只是一个非常懒惰的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2023-04-10
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多