![](/img/trans.png)
[英]Java CC issue - “Expansion within ”(…)*“ can be matched by empty string”
[英]javacc Expansion within "(...)+" can be matched by empty string error
我正在研究一个解析器,并要求为每个关键字抛出自定义错误。 我的代码如下。
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
。 我认为问题出在Func()
的Name() Param()
部分,但我不知道如何在仍然抛出自定义错误消息的同时更改它。 任何人都可以提供一些指示吗?
虽然我同意 user207421 的评论,但您可以执行以下操作
void oneOrMoreThings() : {} {
(Thing() | (throw new ParseException( ... ) ; }
( Thing() )*
}
将 DEF 设为可选,然后检查它是否已找到,如果没有则引发异常。
Start(): {Token tk=null;} {tk="DEF"? {if (tk==null) throw ...} "MAIN" etc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.