ANTLR决策可以使用多个备选方案匹配诸如“ID ID”的输入

时间:2014-11-20 13:57:43

标签: antlr antlrworks

我遇到了解析这个解析器的问题。我想提一下 我正在使用antlrworks 1.4.3(我必须使用它,家庭作业)。我也不能使用backtrack = true

它应匹配

之类的输入
main Int a, Char b, MyClass c -> Int : 
   expr ';' 
   .
   .
   .
   expr ';'
end';' 

我在'之后也解析了解析器:'因为这个问题没让我生成代码

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所展示的内容 antlrworks syntax diagram

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

1 个答案:

答案 0 :(得分:1)

不要这样做:

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

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

而是:

methodDecl
 : name=ID (methodVar (',' methodVar)*)? ('->' type=ID)? ':' methodBlock* END ';'
 ;

methodVar
 : type=ID  name=ID
 ;

即。逗号应该是强制性的,而不是您定义的可选项。

相关问题