#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. Шоу должен отметить ответ как принятый 🙂