问题标签 [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.
python - 在 ast 中实现 goto
背景:作为寒假期间的一个短期项目,我正在尝试使用 Python 和 PLY 实现一种名为 Ax 的编程语言(专为图形计算器设计)。简要说明:该语言仅允许全局变量并大量使用指针。
我正在尝试用这种语言实现 goto,但不知道该怎么做。
我的一般方法是首先使用 PLY 将代码解析为 ast,然后在执行过程中遍历它。
例如,声明
……会变成……
...我将递归执行(我添加了缩进以提高可读性)。
因为ast是一棵树,我不知道如何在不同的节点之间跳转。我考虑过可能将树转换为扁平数组['IF', ['CONDITION', 3], ['DISP', 4], ['DISP', 6]]
,以便我可以使用扁平数组的索引转到代码中的特定行,但这似乎缺乏一定的优雅,几乎感觉像是一个步骤倒退(虽然我可能是错的)。
我看过这个,但无法理解它是如何工作的。
任何帮助或提示将不胜感激。
python - 如何使用 PLY(Python Lex-Yacc)丢弃语法文件中的非终结符
我在使用 PLY 时遇到了问题。我想通过 PLY 创建一个调用图生成器。在某些情况下,我需要丢弃语法文件中的一些标记。那是因为当解析器在我丢弃它之前识别该令牌时我需要做一些事情,所以我不能只丢弃在词法分析器文件中。例如,“IF”标记是我要丢弃的标记。所以我尝试做一些事情将其丢弃在语法文件中。就像:
但事情并没有像我想的那样发展。我打印符号栈(它是解析器的属性,解析器是 yacc.py 的 LRParser 实例),符号栈列表只包含前面的标记,但不包含“if”。所以我想知道在这种情况下如何丢弃令牌。有人可以帮我吗?非常感谢!
python - LALR 语法、尾随逗号和多行列表赋值
我正在尝试为由作业组成的非常简单的语言生成 LALR 语法。例如:
该语言还应该处理值列表,例如:
但我也想处理多行列表:
尾随逗号(用于单例和语言灵活性):
显然,两者同时:
我可以编写带有逗号或多行列表的语法,但不能同时用于两者。
我的语法如下所示:
注意:我需要语法中的'\n'来禁止这种代码:
预先感谢,
安托万。
python - Python PLY 多重规则
在 ply 中,我们如何区分使用了哪个规则 -
示例 :- ''' p : ab | c | d ''' 所以假设我们需要为不同的规则编写不同的代码。那么有什么优雅的方法可以做到这一点。手册中给出的一种方法是使用规则和令牌的组合,但我发现并不总是点击。
python - 从解析器控制 Python PLY 词法分析器状态
我正在开发一个简单的 SQL 选择,例如查询解析器,我需要能够从字面上捕获可能在某些地方发生的子查询。我发现词法分析器状态是最好的解决方案,并且能够使用花括号来标记开始和结束来进行 POC。但是,子查询将由括号而不是花括号分隔,并且括号也可以出现在其他地方,所以我不能成为每个开放括号的状态。解析器很容易获得此信息,因此我希望在解析器规则中的适当位置调用开始和结束。然而这并没有奏效,因为词法分析器似乎一次对流进行了标记,因此标记是在 INITIAL 状态下生成的。有解决此问题的方法吗?这是我尝试做的事情的概要:
start_subquery() 和 end_subquery() 定义如下:
词法分析器标记只是用来检测近括号:
我将不胜感激任何帮助。
python - 如何为手写词法分析器编写 PLY 接口?
我正在用 Python 编写一个编译器,并且我制作了一个手写的词法分析器,因为我不知道如何在 PLY 中解析缩进。另外,我的词法分析器使用了一些yield
这样的语句:
然而,我意识到 PLY 解析器需要一个token
方法,所以我做了一个看起来像这样的方法:
根据我的测试,实际扫描使用scan()
平均需要 124 毫秒,但是当我使用 PLY 解析器时,几分钟后解析不会开始。看来我的token()
方法有问题。
另外,我尝试重命名该scan()
方法,以便它可以成为接口。Python返回类似的东西
因此,PLY 似乎需要一种一次返回单个令牌的方法。
有没有办法重写该token()
方法,以便它返回下一次迭代scan()
而不是那么慢?
python - 用ply转义正则表达式中的空格?
我需要在正则表达式中转义一个空格吗?我知道它在 Python 中可以通过以下任一方式工作re.compile(r'\s')
:re.compile(r' ')
和re.compile(r'\ ')
. 因此,您似乎可以使用 Python re 模块逃避它或不逃避它。
但是当我试图通过 ply.lex 为单个空格定义规则时,事情似乎有点不同。
ply.lex 是否对规则的文档字符串进行任何特殊处理?
python - 如何让 PLY 忽略正则表达式的大小写?
我正在研究一个从 SQL INSERT 语句到要与DbUnit一起使用的数据集 XML 文件的简单转换器。
我当前的定义如下所示:
现在,我想支持 SQL 的不区分大小写的命令,例如,接受所有的INSERT INTO
, Insert Into
,insert into
和iNsErT inTO
作为同一件事。
我想知道是否有一种方法可以使用 PLYre.I
以便它忽略这种情况,或者还有另一种替代方法来编写我不熟悉的规则。
python - PLY yacc 解析 IF-ELSE IF-ELSE 嵌套语句
有人可以帮助我为嵌套 if 语句编写正确的语法规则吗?用我的语言,我可以写出这样的结构:
我写了词法分析器,所以左右括号是RULE_OPEN
和RULE_CLOSE
标记,“IF”是IF
标记,“END”是END
标记,“ELSE”是ELSE
标记,“CONDITION”是CONDITION
标记。
假设“某些语句”可能是我的语言中允许的任何内容(如通用编程语言)。重要的是可以无限嵌套 IF 语句。
希望这很清楚,如果我解释得不好,请告诉我。
不管我怎么努力。我总是遇到移位/减少冲突,解析器不接受正确的输入。
尽管如此,我已经成功地编写了没有 else-if 的规则。当我为 else-if 添加规则时,代码对我来说开始变得非常复杂。
以下是我没有 else-if 部分的成功方法(我只列出了相关规则):
我认为这是解析中非常常见的问题,我希望这里有人已经解决了它:-) 感谢您的帮助!
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
你能指出我错过了什么吗?提前致谢。