首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误与tatsu :不识别正确的语法模式

错误与tatsu :不识别正确的语法模式
EN

Stack Overflow用户
提问于 2022-12-03 15:46:45
回答 1查看 24关注 0票数 1

我正在开始使用tatsu,我正在尝试为miniML语言实现一种语法。语法成功解析后,我尝试解析一些小表达式,以检查它是否正常工作;然而,我发现Tatsu无法识别某些预期的模式。

以下是代码:

`

代码语言:javascript
复制
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")我收到了错误消息:

代码语言:javascript
复制
FailedExpectingEndOfText: (1:2) Expecting end of text :
x=3;x+1
 ^
start

“表达式”类型的表达式也是如此。我在这里所犯的语法错误可能是什么?我不知道文件里也找不到任何线索。

提前谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-12-03 17:44:37

  • 似乎assign的失败源于与varname规则的冲突;要解决这个问题,只需将|assign放在expression规则中|variable前面。

一个现在已经过时的解决办法,无论如何我都要离开:

代码语言:javascript
复制
# I added a negative lookahead for '=' so it will not conflict with the assign rule
varname = /[a-z]+/!'=' ;
    
assign =  /[a-z]+/ '=' expression ';' expression ;

示例:

代码语言:javascript
复制
parser.parse("x=1;+(x,1)")
# ['x', '=', '1', ';', AST({'left': '+', 'right': ['(', 'x', ',', '1', ')']})]

关于“应用程序”的

  • :在规则的开头用/ /替换' ',并在expression规则的开头放置|application解决了问题:

代码语言:javascript
复制
parser.parse("1 2 (x=1;3) *(4,5)")
Out[207]: 
(' ',
 '1',
 (' ',
  '2',
  (' ',
   ['(', ['x', '=', '1', ';', '3'], ')'],
   ['*', ['(', '4', ',', '5', ')']])))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74668215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档