我对这个解析器的消歧有问题。我想提一下,我使用的是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所展示的。

如果有人能帮我,我会非常感激的。
发布于 2014-11-20 20:34:27
不要这样做:
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
;也就是说,逗号应该是强制性的,而不是您所定义的可选的。
https://stackoverflow.com/questions/27041368
复制相似问题