@name 和 @@keyword 不使用规则注释

@name and @@keyword not working with rule annotations

提问人:bookofproofs 提问时间:3/27/2021 更新时间:3/28/2021 访问量:65

问:

我正在尝试在我的语法中使用@@keyword和@name,但如果标记@name的规则被注释,tatsu 似乎会忽略它。

我错过了什么吗?

为了重现这种行为,我提供了以下示例:

这个有效:

import tatsu

GRAMMAR = '''
@@grammar::TestGrammar
@@keyword :: if var
@@whitespace :: /[\t ]+/

    start =
        var identifier ";" { var identifier ";" }* $
        ;

    if = "if";

    var = "var";

    @name
    identifier = 
            /[a-z]+/;
'''


if __name__ == '__main__':
    import pprint
    import json
    from tatsu import parse
    from tatsu.util import asjson

    ast = parse(GRAMMAR, 'var xyz; var if;')
    pprint.pprint(ast, indent=2, width=20)

不出所料,tatsu 将报告


tatsu.exceptions.FailedParse: (1:16) "if" is a reserved word :
var xyz; var if;
               ^

如果我注释标识符规则

    @name
    identifier = 
        id:
            /[a-z]+/;

相同的 Python 程序将输出


( 'var',
  {'id': 'xyz'},
  ';',
  [ [ 'var',
      {'id': 'if'},
      ';']])
附注 关键词

评论

0赞 Apalala 3/28/2021
请告知您使用的是哪个版本的 TatSu?
0赞 bookofproofs 4/2/2021
我正在使用 TatSu 5.5.0
0赞 Apalala 4/3/2021
您应该使用 TatSu 5.6.1

答:

1赞 Apalala 3/28/2021 #1

基本上,您不应该定义:

@name
identifier = 
    id:
       /[a-z]+/;

TatSu 会将规则产生的 ast 与名称进行匹配,并且上述规则的输出将始终为 ,这将不匹配任何关键字。@@keyword{'id': 'something'}

也许你想要的是这样的:

identifier = id:_identifier;

@name
_identifier = /[a-z]+/;

评论

0赞 Apalala 4/3/2021
Shou 应将答案标记为已接受 :-)