问题标签 [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 投票
3 回答
1350 浏览

python - 在 ast 中实现 goto

背景:作为寒假期间的一个短期项目,我正在尝试使用 Python 和 PLY 实现一种名为 Ax 的编程语言(专为图形计算器设计)。简要说明:该语言仅允许全局变量并大量使用指针。

我正在尝试用这种语言实现 goto,但不知道该怎么做。

我的一般方法是首先使用 PLY 将代码解析为 ast,然后在执行过程中遍历它。

例如,声明

……会变成……

...我将递归执行(我添加了缩进以提高可读性)。

因为ast是一棵树,我不知道如何在不同的节点之间跳转。我考虑过可能将树转换为扁平数组['IF', ['CONDITION', 3], ['DISP', 4], ['DISP', 6]],以便我可以使用扁平数组的索引转到代码中的特定行,但这似乎缺乏一定的优雅,几乎感觉像是一个步骤倒退(虽然我可能是错的)。

我看过这个,但无法理解它是如何工作的。

任何帮助或提示将不胜感激。

0 投票
2 回答
930 浏览

python - 如何使用 PLY(Python Lex-Yacc)丢弃语法文件中的非终结符

我在使用 PLY 时遇到了问题。我想通过 PLY 创建一个调用图生成器。在某些情况下,我需要丢弃语法文件中的一些标记。那是因为当解析器在我丢弃它之前识别该令牌时我需要做一些事情,所以我不能只丢弃在词法分析器文件中。例如,“IF”标记是我要丢弃的标记。所以我尝试做一些事情将其丢弃在语法文件中。就像:

但事情并没有像我想的那样发展。我打印符号栈(它是解析器的属性,解析器是 yacc.py 的 LRParser 实例),符号栈列表只包含前面的标记,但不包含“if”。所以我想知道在这种情况下如何丢弃令牌。有人可以帮我吗?非常感谢!

0 投票
2 回答
767 浏览

python - LALR 语法、尾随逗号和多行列表赋值

我正在尝试为由作业组成的非常简单的语言生成 LALR 语法。例如:

该语言还应该处理值列表,例如:

但我也想处理多行列表:

尾随逗号(用于单例和语言灵活性):

显然,两者同时:

我可以编写带有逗号或多行列表的语法,但不能同时用于两者。

我的语法如下所示:

注意:我需要语法中的'\n'来禁止这种代码:

预先感谢,

安托万。

0 投票
2 回答
1146 浏览

python - Python PLY 多重规则

在 ply 中,我们如何区分使用了哪个规则 -

示例 :- ''' p : ab | c | d ''' 所以假设我们需要为不同的规则编写不同的代码。那么有什么优雅的方法可以做到这一点。手册中给出的一种方法是使用规则和令牌的组合,但我发现并不总是点击。

0 投票
3 回答
3460 浏览

python - 从解析器控制 Python PLY 词法分析器状态

我正在开发一个简单的 SQL 选择,例如查询解析器,我需要能够从字面上捕获可能在某些地方发生的子查询。我发现词法分析器状态是最好的解决方案,并且能够使用花括号来标记开始和结束来进行 POC。但是,子查询将由括号而不是花括号分隔,并且括号也可以出现在其他地方,所以我不能成为每个开放括号的状态。解析器很容易获得此信息,因此我希望在解析器规则中的适当位置调用开始和结束。然而这并没有奏效,因为词法分析器似乎一次对流进行了标记,因此标记是在 INITIAL 状态下生成的。有解决此问题的方法吗?这是我尝试做的事情的概要:

start_subquery() 和 end_subquery() 定义如下:

词法分析器标记只是用来检测近括号:

我将不胜感激任何帮助。

0 投票
1 回答
523 浏览

python - 如何为手写词法分析器编写 PLY 接口?

我正在用 Python 编写一个编译器,并且我制作了一个手写的词法分析器,因为我不知道如何在 PLY 中解析缩进。另外,我的词法分析器使用了一些yield这样的语句:

然而,我意识到 PLY 解析器需要一个token方法,所以我做了一个看起来像这样的方法:

根据我的测试,实际扫描使用scan()平均需要 124 毫秒,但是当我使用 PLY 解析器时,几分钟后解析不会开始。看来我的token()方法有问题。

另外,我尝试重命名该scan()方法,以便可以成为接口。Python返回类似的东西

因此,PLY 似乎需要一种一次返回单个令牌的方法。

有没有办法重写该token()方法,以便它返回下一次迭代scan()而不是那么慢?

0 投票
1 回答
4453 浏览

python - 用ply转义正则表达式中的空格?

我需要在正则表达式中转义一个空格吗?我知道它在 Python 中可以通过以下任一方式工作re.compile(r'\s')re.compile(r' ')re.compile(r'\ '). 因此,您似乎可以使用 Python re 模块逃避它或不逃避它。

但是当我试图通过 ply.lex 为单个空格定义规则时,事情似乎有点不同。

ply.lex 是否对规则的文档字符串进行任何特殊处理?

0 投票
2 回答
1676 浏览

python - 如何让 PLY 忽略正则表达式的大小写?

我正在研究一个从 SQL INSERT 语句到要与DbUnit一起使用的数据集 XML 文件的简单转换器。

我当前的定义如下所示:

现在,我想支持 SQL 的不区分大小写的命令,例如,接受所有的INSERT INTO, Insert Into,insert intoiNsErT inTO作为同一件事。

我想知道是否有一种方法可以使用 PLYre.I以便它忽略这种情况,或者还有另一种替代方法来编写我不熟悉的规则。

0 投票
1 回答
5049 浏览

python - PLY yacc 解析 IF-ELSE IF-ELSE 嵌套语句

有人可以帮助我为嵌套 if 语句编写正确的语法规则吗?用我的语言,我可以写出这样的结构:

我写了词法分析器,所以左右括号是RULE_OPENRULE_CLOSE标记,“IF”是IF标记,“END”是END标记,“ELSE”是ELSE标记,“CONDITION”是CONDITION标记。

假设“某些语句”可能是我的语言中允许的任何内容(如通用编程语言)。重要的是可以无限嵌套 IF 语句。

希望这很清楚,如果我解释得不好,请告诉我。

不管我怎么努力。我总是遇到移位/减少冲突,解析器不接受正确的输入。

尽管如此,我已经成功地编写了没有 else-if 的规则。当我为 else-if 添加规则时,代码对我来说开始变得非常复杂。

以下是我没有 else-if 部分的成功方法(我只列出了相关规则):

我认为这是解析中非常常见的问题,我希望这里有人已经解决了它:-) 感谢您的帮助!

0 投票
1 回答
237 浏览

python - 解析:为什么我定义的规则不匹配?

我正在用python编写一个带有PLY的反编译器,旨在将mythryl翻译成neko。

问题是在解析代码时:

此示例位于:https ://github.com/narke/my2neko/blob/master/test_cases/ex1.my

解析器不匹配适用于保留字'fun'的规则,由FUN_T表示,当然规则存在,最后一个:

解析器位于:https ://github.com/narke/my2neko/blob/master/my2neko.py

我得到的错误是这样的:

重现它:./my2neko.py test_cases/ex4.my f.neko

你能指出我错过了什么吗?提前致谢。

这是项目:https ://github.com/narke/my2neko