我正在使用解析器,并且要求为每个关键字引发自定义错误。我的代码如下。
SKIP: { " " | "\t" | "\n" | "\r" }
TOKEN: { "DEF" | "MAIN" | <NAME: (["A"-"Z"])+> | <PARAM: (["a"-"z"])+> | <NUM: (["0"-"9"])+> }
void Start(): {} {(Def() Func())+ <EOF>}
void Def(): {} {"DEF" | { throw new ParseException("expected keyword DEF"); }}
void Func(): {} {"MAIN" | Name() Param() | { throw new ParseException("Expected MAIN or NAME PARAM"); }}
void Name(): {} {<NAME> | { throw new ParseException("invalid function name"); }}
void Param(): {} { <PARAM> | { throw new ParseException("invalid PARAM"); }}
Start()
函数给我一个错误,并告诉我Expansion within "(...)+" can be matched by empty string error
。我认为问题出在Name() Param()
的Func()
部分,但我不知道如何更改此设置,同时仍然抛出自定义错误消息。任何人都可以提供一些指针吗?
虽然我同意user207421的评论,但您可以执行以下操作
void oneOrMoreThings() : {} {
(Thing() | (throw new ParseException( ... ) ; }
( Thing() )*
}