问题标签 [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.

0 投票
1 回答
204 浏览

python - 无法在 grako 语法中定义规则优先级以处理特殊标记

我正在尝试通过 Grako 生成的语法分析一些文档,该语法应该解析简单的句子以进行进一步分析,但在使用一些特殊标记时会遇到一些困难。

(Grako 风格的)EBNF 看起来像:

我在以下内容上使用了上面的语法:

这是一个句子。这是一个句子的壮举。一个缩写。我现在不壮举。等壮举。知道英语。

使用简单的 NodeWalker 的结果:

我的期望:

我不知道为什么会发生这种情况,尤其是在最后一句中,缩写词是句子的一部分,而它们不在前面的句子中。需要明确的是,我希望句子定义中的 abbr 规则具有比 word 规则更高的优先级,但我不知道如何实现这一点。我玩弄了消极和积极的前瞻,但没有成功。我知道如何使用正则表达式来达到我的预期结果,但是进一步分析需要上下文无关的语法,所以为了可读性,我想将所有内容放在一个语法中。自从我上次以这种方式使用语法已经有一段时间了,但我不记得遇到过那种问题。我通过谷歌搜索了一段时间没有成功,所以也许社区可能会分享一些见解。

提前致谢。

如果需要,我用于测试的代码:

使用的包:Python 3.5.2 Grako 3.16.5

0 投票
2 回答
133 浏览

tatsu - 是否可以使用不同的词法分析器?

我想为 tatsu 使用不同的词法分析器,但使用 tatsu 的解析器。这可能吗?例如,在语法中:

是否可以使用替代词法分析器来提供NUMID

0 投票
1 回答
540 浏览

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)

0 投票
1 回答
124 浏览

python - 如何以不区分大小写的方式匹配 Tatsu 中的模式

有人知道如何以不区分大小写的方式识别 Tatsu 中的模式吗?文档说:“在应该忽略大小写的模式中使用 (?i)。” 但我实际上并没有弄清楚如何在我的规则中使用 (?i) :

在实践中,无论大小写如何,我都必须识别“严格”这个词。

谢谢汤姆

0 投票
1 回答
170 浏览

error-handling - 如何从 grako/TatSu 获取简洁的语法错误消息

如果 grako/tatsu 生成的解析器的输入有语法错误,例如calc.py 示例,除了 我可以使用3 + / 3的相关内容之外,还会获得一长串 Python 调用序列 -构造,但随后我丢失了相关部分的错误信息。 3 + / 3 ^ tryexcept

我想使用 grako/tatsu 来解析规则编译器的语法规则,我很欣赏以干净的方式分离语法和语义的可能性。用户会对过多的错误消息感到非常恼火。有没有办法清除错误消息?

0 投票
1 回答
380 浏览

performance - Tatsu 解析性能

我在 Tatsu 中实现了一个语法,用于解析量子程序Quipper ASCII链接)的描述。解析器可以工作,但对于我正在查看的文件来说很慢(大约 10kB-1MB 大小,请参阅resources目录)。解析一些文件大约需要 10-30 秒。语法非常简单,应该可以相当快地解析这些文件。我尝试过的一件事是尽可能添加剪辑以确保没有不必要的回溯。语法被指定为

我已经尝试分析代码以找到性能瓶颈,但是时间花在了所有地方。我用 生成一个解析器tatsu grammar.ebnf并用 建模tatsu -g,然后在测试用例中使用它来解析输入文件。使用标准python3.6.4 排序的性能结果tottime,用于解析 中的所有文件resources/PF

即使是最大的贡献者 ( _eat_regex) 也无法解释 50 分钟的运行时间。我也找不到如何在 tatsu 文档中优化速度。

通过查看函数中花费的累积时间可能会获得更多的洞察力。我按以下方式对分析结果进行了排序cumtime

我们可以看到在选择执行哪个门时花费了相当多的时间(毕竟这是一个很大的选择语句)。也花费了大量时间,qgate这并不奇怪,因为这些节点在代码中占主导地位。

我可以在语法或解析中添加哪些可能的优化,以便它可以更快地解析这些文件?

0 投票
1 回答
53 浏览

python - 使用 Tatsu / grako 使用无大小写关键字解析代码

我尝试使用 Tatsu h 无大小写的关键字解析 Fortran 代码!有没有比这些更聪明的方法来定义关键字 caseless:

谢谢

0 投票
1 回答
148 浏览

grammar - 如何在 EBNF/Tatsu 中定义默认规则?

我的 EBNF 和 Tatsu 实现中存在问题,为 Tatsu 提取语法 EBNF:

当我测试时:

我得到:

但我想要这个:

我的错误在哪里?

非常感谢...

0 投票
2 回答
188 浏览

tatsu - 需要帮助从 Tatsu 开始解析语法

我收到 Tatsu 错误

“tatsu.exceptions.FailedExpectingEndOfText: (1:1) 期望文本结束”

使用我提供的语法运行测试 - 目前尚不清楚问题是什么。

本质上,调用解析器的语句是:

整个python文件如下:

任何人都可以帮我解决问题吗?

谢谢。

科林·戈德堡

0 投票
2 回答
76 浏览

tatsu - tatsu 解析中无法识别的字母字符

我已经定义了一个非常简单的语法,但是 tatsu 的行为并不像预期的那样。

我添加了“开始”规则并用“$”字符终止它,但我仍然看到相同的行为。

如果我用正则表达式 ( digit = /[1-5x]/) 而不是单个终端符号定义“指法”规则,问题就会消失。但是下面的老式 BNF 式语法不应该起作用吗?

"xx" 测试应该产生 "['x', 'x']" 并且不会抛出异常。

我错过了什么?