@имя и @@ключевое слово не работают с аннотациями правил

#annotations #keyword #tatsu

Вопрос:

Я пытаюсь использовать @@ключевое слово и @имя в своей грамматике, но тацу, похоже, игнорирует это, если правила, помеченные@name, аннотированы.

Я что-то упускаю?

Чтобы воспроизвести такое поведение, я приведу следующий пример:

Этот работает:

 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.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'},
      ';']])
 

Комментарии:

1. Пожалуйста, скажите, какую версию ТАЦУ вы используете?

2. Я использую TatSu 5.5.0

3. Вы должны использовать TatSu 5.6.1

Ответ №1:

В принципе, вы не должны определять:

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

Тацу будет сопоставлять ast , полученный в результате правила , с именами @@keyword , и выводом вышеуказанного правила всегда будет {'id': 'something'} , который не будет соответствовать ни одному ключевому слову.

Возможно, вам нужно что-то вроде:

 identifier = id:_identifier;

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

Комментарии:

1. Шоу должен отметить ответ как принятый 🙂