问题标签 [tatsu]
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 - 无法在 grako 语法中定义规则优先级以处理特殊标记
我正在尝试通过 Grako 生成的语法分析一些文档,该语法应该解析简单的句子以进行进一步分析,但在使用一些特殊标记时会遇到一些困难。
(Grako 风格的)EBNF 看起来像:
我在以下内容上使用了上面的语法:
这是一个句子。这是一个句子的壮举。一个缩写。我现在不壮举。等壮举。知道英语。
使用简单的 NodeWalker 的结果:
我的期望:
我不知道为什么会发生这种情况,尤其是在最后一句中,缩写词是句子的一部分,而它们不在前面的句子中。需要明确的是,我希望句子定义中的 abbr 规则具有比 word 规则更高的优先级,但我不知道如何实现这一点。我玩弄了消极和积极的前瞻,但没有成功。我知道如何使用正则表达式来达到我的预期结果,但是进一步分析需要上下文无关的语法,所以为了可读性,我想将所有内容放在一个语法中。自从我上次以这种方式使用语法已经有一段时间了,但我不记得遇到过那种问题。我通过谷歌搜索了一段时间没有成功,所以也许社区可能会分享一些见解。
提前致谢。
如果需要,我用于测试的代码:
使用的包:Python 3.5.2 Grako 3.16.5
tatsu - 是否可以使用不同的词法分析器?
我想为 tatsu 使用不同的词法分析器,但使用 tatsu 的解析器。这可能吗?例如,在语法中:
是否可以使用替代词法分析器来提供NUM
和ID
?
python - 如何处理 PEG 语法中的负数?
我正在尝试使用基于 PEG 的 Python 解析器生成器tatsu编写一个简单的 int 表达式解析器。这是我的代码:
这个程序的输出['-', '1']
不是预期的['2', '-', '1']
。
如果我得到正确的输出:
- 删除对一元减号的支持,即将最后一条规则更改为
number = /\d+/ ;
- 去掉term、mul和div规则,只支持加减法
- 将第二条规则替换为
expresssion = add | sub | mul | div | number ;
最后一个选项实际上可以在不遗漏任何功能的情况下工作,但我不明白它为什么会起作用。到底是怎么回事?
编辑:如果我只是翻转 add/sub/mul/div 规则以摆脱左递归,它也可以工作。但是随后评估表达式成为一个问题,因为解析树被翻转了。(3-2-1
变成3-(2-1)
)
python - 如何以不区分大小写的方式匹配 Tatsu 中的模式
有人知道如何以不区分大小写的方式识别 Tatsu 中的模式吗?文档说:“在应该忽略大小写的模式中使用 (?i)。” 但我实际上并没有弄清楚如何在我的规则中使用 (?i) :
在实践中,无论大小写如何,我都必须识别“严格”这个词。
谢谢汤姆
error-handling - 如何从 grako/TatSu 获取简洁的语法错误消息
如果 grako/tatsu 生成的解析器的输入有语法错误,例如calc.py 示例,除了
我可以使用3 + / 3
的相关内容之外,还会获得一长串 Python 调用序列
-构造,但随后我丢失了相关部分的错误信息。
3 + / 3
^
try
except
我想使用 grako/tatsu 来解析规则编译器的语法规则,我很欣赏以干净的方式分离语法和语义的可能性。用户会对过多的错误消息感到非常恼火。有没有办法清除错误消息?
performance - Tatsu 解析性能
我在 Tatsu 中实现了一个语法,用于解析量子程序Quipper ASCII(链接)的描述。解析器可以工作,但对于我正在查看的文件来说很慢(大约 10kB-1MB 大小,请参阅resources
目录)。解析一些文件大约需要 10-30 秒。语法非常简单,应该可以相当快地解析这些文件。我尝试过的一件事是尽可能添加剪辑以确保没有不必要的回溯。语法被指定为
我已经尝试分析代码以找到性能瓶颈,但是时间花在了所有地方。我用 生成一个解析器tatsu grammar.ebnf
并用 建模tatsu -g
,然后在测试用例中使用它来解析输入文件。使用标准python
3.6.4 排序的性能结果tottime
,用于解析 中的所有文件resources/PF
:
即使是最大的贡献者 ( _eat_regex
) 也无法解释 50 分钟的运行时间。我也找不到如何在 tatsu 文档中优化速度。
通过查看函数中花费的累积时间可能会获得更多的洞察力。我按以下方式对分析结果进行了排序cumtime
:
我们可以看到在选择执行哪个门时花费了相当多的时间(毕竟这是一个很大的选择语句)。也花费了大量时间,qgate
这并不奇怪,因为这些节点在代码中占主导地位。
我可以在语法或解析中添加哪些可能的优化,以便它可以更快地解析这些文件?
python - 使用 Tatsu / grako 使用无大小写关键字解析代码
我尝试使用 Tatsu h 无大小写的关键字解析 Fortran 代码!有没有比这些更聪明的方法来定义关键字 caseless:
谢谢
grammar - 如何在 EBNF/Tatsu 中定义默认规则?
我的 EBNF 和 Tatsu 实现中存在问题,为 Tatsu 提取语法 EBNF:
当我测试时:
我得到:
但我想要这个:
我的错误在哪里?
非常感谢...
tatsu - 需要帮助从 Tatsu 开始解析语法
我收到 Tatsu 错误
“tatsu.exceptions.FailedExpectingEndOfText: (1:1) 期望文本结束”
使用我提供的语法运行测试 - 目前尚不清楚问题是什么。
本质上,调用解析器的语句是:
整个python文件如下:
任何人都可以帮我解决问题吗?
谢谢。
科林·戈德堡
tatsu - tatsu 解析中无法识别的字母字符
我已经定义了一个非常简单的语法,但是 tatsu 的行为并不像预期的那样。
我添加了“开始”规则并用“$”字符终止它,但我仍然看到相同的行为。
如果我用正则表达式 ( digit = /[1-5x]/
) 而不是单个终端符号定义“指法”规则,问题就会消失。但是下面的老式 BNF 式语法不应该起作用吗?
"xx" 测试应该产生 "['x', 'x']" 并且不会抛出异常。
我错过了什么?