我正在开始使用tatsu,我正在尝试为miniML语言实现一种语法。语法成功解析后,我尝试解析一些小表达式,以检查它是否正常工作;然而,我发现Tatsu无法识别某些预期的模式。
以下是代码:
`
grammar="""
@@grammar::CALC
start
=
expression $
;
expression
=
|integer
|addition
|soustraction
|multiplication
|division
|Fst
|Snd
|pair
|varname
|assign
|function
|application
|parentheses
;
integer
=
/\d+/
;
addition
=
left:'+' right:pair
;
soustraction
=
'-' pair
;
multiplication
=
'*' pair
;
division
=
'/' pair
;
Fst
=
'Fst' pair
;
Snd
=
'Snd' pair
;
pair
=
'(' expression ',' expression ')'
;
varname
=
/[a-z]+/
;
assign
=
varname '=' expression ';' expression
;
function
=
'Lambda' varname ':' expression
;
application
=
' '<{expression}+
;
parentheses
=
'(' expression ')'
;
"""`
然后分析:
parser = tatsu.compile(grammar)
除了“分配”和“应用程序”之外,所有这些表达式都被成功识别。如果我尝试这样的方法:
parser.parse("x=3;x+1")我收到了错误消息:
FailedExpectingEndOfText: (1:2) Expecting end of text :
x=3;x+1
^
start“表达式”类型的表达式也是如此。我在这里所犯的语法错误可能是什么?我不知道文件里也找不到任何线索。
提前谢谢!
发布于 2022-12-03 17:44:37
assign的失败源于与varname规则的冲突;要解决这个问题,只需将|assign放在expression规则中|variable前面。一个现在已经过时的解决办法,无论如何我都要离开:
# I added a negative lookahead for '=' so it will not conflict with the assign rule
varname = /[a-z]+/!'=' ;
assign = /[a-z]+/ '=' expression ';' expression ;示例:
parser.parse("x=1;+(x,1)")
# ['x', '=', '1', ';', AST({'left': '+', 'right': ['(', 'x', ',', '1', ')']})]关于“应用程序”的
/ /替换' ',并在expression规则的开头放置|application解决了问题:parser.parse("1 2 (x=1;3) *(4,5)")
Out[207]:
(' ',
'1',
(' ',
'2',
(' ',
['(', ['x', '=', '1', ';', '3'], ')'],
['*', ['(', '4', ',', '5', ')']])))https://stackoverflow.com/questions/74668215
复制相似问题