2

我试图在我的语法中使用@@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'},
      ';']])
4

1 回答 1

1

基本上,您不应该定义:

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

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

也许你想要的是这样的:

identifier = id:_identifier;

@name
_identifier = /[a-z]+/;
于 2021-03-28T05:40:48.147 回答