繁体   English   中英

javacc "(...)+" 内的扩展可以匹配空字符串错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM