首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR决策可以使用多个选项匹配输入,如"ID ID“

ANTLR决策可以使用多个选项匹配输入,如"ID ID“
EN

Stack Overflow用户
提问于 2014-11-20 13:57:42
回答 1查看 306关注 0票数 1

我对这个解析器的消歧有问题。我想提一下,我使用的是antlrworks 1.4.3(这是我必须使用的,作业作业)。我也不能使用backtrack=true

它应该与输入匹配,例如

代码语言:javascript
复制
main Int a, Char b, MyClass c -> Int : 
   expr ';' 
   .
   .
   .
   expr ';'
end';' 

我还在“:”之后添加了解析器,因为这个问题不允许我生成代码

代码语言:javascript
复制
program 
:   classDef+ -> ^(PROGRAM classDef+)
;

classDef 
:  CLASS name=ID (INHERITS parent=ID)? classBlock* END ';' -> 
    ^(CLASS $name ^(INHERITS $parent)? classBlock*)
;

classBlock
: VAR assigmentBlock* END ';'-> ^(VAR assigmentBlock*) 
| methodDecl  -> ^(METHOD methodDecl)
;

methodDecl
//: name=ID methodVar* ('->' type=ID)? ':' methodBlock* END ';'
//  -> ^($name methodVar* ^(RETURN $type) methodBlock*)
: name=ID methodVar* -> ^($name methodVar*)
;

methodVar
: type=ID  name=ID ','? -> ^(PARAMS $type $name)
;

这就是antlrworks所展示的。

如果有人能帮我,我会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-20 20:34:27

不要这样做:

代码语言:javascript
复制
methodDecl
 : name=ID methodVar* ('->' type=ID)? ':' methodBlock* END ';'
 ;

methodVar
 : type=ID  name=ID ','?
 ;

相反,要做:

代码语言:javascript
复制
methodDecl
 : name=ID (methodVar (',' methodVar)*)? ('->' type=ID)? ':' methodBlock* END ';'
 ;

methodVar
 : type=ID  name=ID
 ;

也就是说,逗号应该是强制性的,而不是您所定义的可选的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27041368

复制
相关文章

相似问题

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