问题标签 [ply]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2470 浏览

python - 如何使用解析器 python ply 制作一个将字符串和数字作为混合输入的计算器

我想寻求帮助来做一个计算器,它可以识别 Python 中的英文单词和数字,但现在使用 PLY (Python Lex-Yacc)

数字和运算符可以用英语单词写成字符串的两种形式给出,“加号”=“+”,“二”=2,“12”=112,等等。

一个例子可能是这些条目:

“二十五除以 5”或“25 / 5”或“二十五除以五”

结果应该是相同的,一个数字 5(不是字符串)。

“-3 乘以 4”将给出 -12

除以 0 将给出“错误”“34 除以 0”将给出“错误”

如果我键入数学符号或键入文本或混合,这应该适用于几个基本运算符“-”、“+”、“x”和“/”(减号、加号、时间和除以)。

以下是我的代码的一些部分:

#这里改变了赋值 def p_statement_assign(p): 'statement : expression times divide_by plus minus expression' variables[p[1]] = p[3] p[0] = None

我的代币是否有错误的定义?我怎么知道这个数字可以用英文字母或数字介绍?

表达式(p[2] == '+' : p[0] = p[1] + p[3])必须有一个字符。为什么用这种形式写无效p[2] == 'plus' : p[0] = p[1] + p[3]


我已经添加了 sfk 建议的代码,但我仍然无法识别输入为文本的数字和运算符,用英文单词。

你知道我做错了什么吗?

0 投票
1 回答
677 浏览

python - 使用 Python 的 PLY 库更改词法规则

在我的编译器课程中,我们的讲师告诉我们,我们将要实现的语言的语法需要在解析器中进行前瞻。使用 flex 之类的工具,使用foo/x.

我目前正在尝试使用 PLY 库在 Python 中做一个示例程序,以查看 Python 是否适合该项目。我正在尝试实现 FORTRAN 的 do 循环的简单版本:

目前,我的想法是匹配DO关键字,向前看,看看输入的其余部分是否匹配循环。如果是,则返回DO令牌。否则,我想“倒带”输入并进入标识符规则。就像是:

0 投票
1 回答
172 浏览

parsing - YACC:停止解析特定路径

我正在使用 Python PLY 来解析特定的语言。对于像这样的语法:

当我知道condition值时,说 True,那么有没有办法停止解析路径stmtlist中的?ELSE

谢谢,

0 投票
1 回答
1030 浏览

python - 使用 PLY Yacc 解析组树

我试图解析的结构如下所示:

和语法:

每个父母都有一个孩子组的列表,每个孩子都有一个对其父母的引用。如果没有 shift/reduce 冲突,我似乎无法让语法运行,并且它没有正确解析。

0 投票
1 回答
784 浏览

python - 为二进制表达式创建 AST

我继承了一个 ANTLR 语法,现在用 Python Lex Yacc 实现它而无需任何更改。我的问题是,ANTLR 通常使用非常高级的 EBNF 来定义语法,而 Yacc 使用简单的上下文无关语法。

我对二进制表达式的 AST 定义感到困惑。从 ANTLR 给出,它们看起来像

这个定义的存在是出于优先考虑,不要怀疑名称。

在我的 CFG 中,它看起来像

其他一些表达式看起来像

我想要的是我的 AST 仅包含 BinaryExpression 节点,如第二个示例中所示:

BinaryExpression('+', lhs, rhs)

但是这个语法给了我一个因素列表。有什么办法可以用我的方式写吗?这 ???是我需要的地方,但需要一个表达式来构建我的 AST,但我想不出一个好的方法来做到这一点。我看到的是用一元表达式列表定义一个节点,但这对我来说很难看。还是有另一种写语法的方法?我不敢碰它,因为我担心我会改变它以解析不同的东西。

0 投票
0 回答
963 浏览

python - Python lex 和 yacc

该程序的输出是 -

谁能解释一下如何t.lexer.lexmatch.groups()工作?

0 投票
2 回答
2471 浏览

python - 用 PLY 解析 python,如何编码缩进和缩进部分

我试图用 PLY 解析 python 语言的函数定义。我遇到了与缩进有关的问题。例如对于 for 语句,我希望能够知道块何时结束。我在这里阅读了python语法:http: //docs.python.org/2/reference/grammar.html 这部分的语法是:

我不知道如何用 PLY 来描述 INDENT 和 DEDENT 标记。我正在尝试类似的东西:

但似乎 PLY 认为带有空格的正则表达式与空字符串匹配并且不构建词法分析器......即使我设法拥有 INDENT 令牌我也不确定获得 DEDENT 的方法......

有没有办法用 PLY 做到这一点?

0 投票
1 回答
1393 浏览

string - 在 ply (python) 中解析具有特定格式的文件

我有一个 ply 问题,我必须接收一个带有标记列表和语法 (bnf) 的文件,我编写了一个语法来识别输入,它几乎可以工作(只是小问题,我们正在解决它们),因为例如这是一个有效的输入文件

(在这种情况下,我们不关心模棱两可的语法或其他什么,这是一个输入示例)

分别解析每一行工作正常,但我想用这些规则解析整个文件:

  • #tokens 必须只在第一行,所以如果我们在语法之后有 #tokens 声明,则它是无效的
  • 每行“代码”之后可以有 0 个或多个空行
  • 你可以有尽可能多的语法规则

我尝试使用循环分别扫描和解析每一行,但我无法控制第一个(也是非常重要的)规则,所以我在我的 .py 文件中尝试了这个:

我定义了 t_NLINEA (新行)我也有使用 \n 字符作为文字的问题,并且使用 rU 模式打开文件以避免有关 \r\n 或 \n 字符的冲突,所以我添加了这些规则:

def p_N(p): '''N : NLINEA N''' pass

def p_N2(p): '''N : ''' 通过

def p_U(p): '''U : RN U''' pass

def p_U2(p): '''U : ''' 传球

(正如我在上面告诉你的,我让你使用 N 规则,因为 ply 在我的语法中不接受 \n 文字,我将 \n 添加到“literals”变量中)

T 是解析#tokens 声明的规则,R 用于解析语法规则,如果我在单行字符串中使用它们,T 和 R 可以正常工作,但是当我添加上面写的产品时,我在解析时遇到语法错误第一个语法规则,例如A : B C我得到语法错误:

有什么建议吗?谢谢

0 投票
1 回答
1035 浏览

python - 数字的 PLY 词法分析器始终返回双精度

我在使用以下程序使用 int 和 double 的 ply lex 时遇到问题。DOUBLE_VAL 返回 1,而我期望 INT_VAL。在更改 INT_VAL 和 DOUBLE_VAL 函数的顺序时,我收到小数点错误。我该如何解决它们?

0 投票
2 回答
667 浏览

python - PLY yacc 指定多线生产

有没有办法用以下语法定义多行生产?PLY 预计:在 ID 表示每条生产线一个生产之前。