提问人:bookofproofs 提问时间:3/27/2021 更新时间:3/28/2021 访问量:65
@name 和 @@keyword 不使用规则注释
@name and @@keyword not working with rule annotations
问:
我正在尝试在我的语法中使用@@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'},
';']])
答:
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 应将答案标记为已接受 :-)
评论