【问题标题】:Alphabetic characters not recognized in tatsu parsetatsu 解析中无法识别的字母字符
【发布时间】:2019-09-10 03:53:28
【问题描述】:

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

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

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

from pprint import pprint
from tatsu import parse

GRAMMAR = """
@@grammar :: test
@@nameguard :: False

start = sequence $ ;
sequence = {digit}+ ;
digit = 'x' | '1' | '2' | '3' | '4' | '5' ;"""

test = "23"
ast = parse(GRAMMAR, test)
pprint(ast)  # Prints ['2', '3']

test = "xx"
ast = parse(GRAMMAR, test)
pprint(ast)  # Throws tatsu.exceptions.FailedParse: (1:1) no available options :

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

我错过了什么?

【问题讨论】:

    标签: tatsu


    【解决方案1】:

    您可能需要检查与默认开启的@@nameguard 的交互。

    对于第一个版本的语法,使用:

    @@nameguard :: False
    

    您还可以考虑最适合语言和语法的 @@whitespace@@namechars 的定义。

    【讨论】:

    • @@nameguard 在语法中设置为 false。我不确定空格与这个问题有什么关系。
    • 另外值得注意的是:问题显然只与字母字符有关。数字和其他符号似乎按预期工作。
    • @@nameguard 仅适用于带有前导字母的标记。
    • 我不明白。 “x”是字母。在关闭@@nameguard 的情况下,解析器应该知道它不需要担心像“xray”或“xx”这样的名称。它应该知道“xx”包含两个终端。此外,文档说@@nameguard 会影响字母数字。我在这里只处理数字和字母。我应该将@@namechars 设置为什么?我只在语法中使用空格,所以默认的@@whitespace 就足够了。我具体需要做什么才能将“xx”解析为['x','x']? @@nameguard 似乎真的被忽略了。
    【解决方案2】:

    好的,我认为@@nameguard 有问题。见https://github.com/neogeny/TatSu/issues/95。目前最简单的解决方法是使用模式表达式代替单独的 alphabetic 终端。此外,当@@nameguard 被修复时,文档应阐明它仅与以字母开头的字母数字有关。显然,这里的数字终端不需要@@nameguard。

    【讨论】:

    • @@nameguard 现在固定在master 分支上,@David
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2010-12-30
    • 2020-06-30
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多