Error handling JavaCC自定义错误导致“扩展可以由空字符串匹配。”

Error handling JavaCC自定义错误导致“扩展可以由空字符串匹配。”,error-handling,javacc,Error Handling,Javacc,我希望让我的JavaCC解析器返回比默认值更具体的自定义错误消息 我目前有一个基本结构如下: Foo(): {} { (A() B())+ } A(): {} { <TOKA1> | <TOKA2> } B(): {} { <TOKB1> | <TOKB2> } 这是可以理解的,因为解析器不“知道”空选项将终止解析过程。它预测它可以将空字符串匹配到无穷大。然而,我找不到或想不出任何其他简单的方法来抛出这样的错误。实现所需结果的最佳方法是什

我希望让我的JavaCC解析器返回比默认值更具体的自定义错误消息

我目前有一个基本结构如下:

Foo(): {} { (A() B())+ }
A():   {} { <TOKA1> | <TOKA2> }
B():   {} { <TOKB1> | <TOKB2> }

这是可以理解的,因为解析器不“知道”空选项将终止解析过程。它预测它可以将空字符串匹配到无穷大。然而,我找不到或想不出任何其他简单的方法来抛出这样的错误。实现所需结果的最佳方法是什么?

假设您的解析器在循环中进行了一次或多次遍历。当下一个令牌不是TOKA1或TOKA2时,您不希望解析器离开循环吗

如果你剩下的语法是

void Start() : {} { Foo() C() <EOF> }
因此,您只希望在遇到错误时退出Foo循环。其他任何东西都是错误的。你可以把语法改写成

 Bar() : {} { "(" A("A") B() MoreFoos() }

 MoreFoos() : {} {  ")" |  A("A or ')'") B() MoreFoos() }
 A(String expected):   {} { <TOKA1> | <TOKA2> 
    | {throw new ParseException("Expected "+expected+", found " + getToken(1).image + ".");} } }
 B():   {} { <TOKB1> | <TOKB2>
    | {throw new ParseException("Expected B, found " + getToken(1).image + ".");} }}
void Start() : {} { Foo() C() <EOF> }
 <TOKA1> <TOKB1> <TOKC> <EOF>
 Foo(): {} { 
    AForSure()
    B() 
    (A() B())* }
 AForSure() : {} { A() | {throw new ParseException("Expected A, found " + getToken(1).image + ".");} }
 A():   {} { <TOKA1> | <TOKA2> }
 B():   {} { <TOKB1> | <TOKB2> | {throw new ParseException("Expected B, found " + getToken(1).image + ".");} }}
 <TOKA1> <TOKB1> <TOKB2> <EOF>
Bar() : {} { "(" Foo() ")" }
 Bar() : {} { "(" A("A") B() MoreFoos() }

 MoreFoos() : {} {  ")" |  A("A or ')'") B() MoreFoos() }
 A(String expected):   {} { <TOKA1> | <TOKA2> 
    | {throw new ParseException("Expected "+expected+", found " + getToken(1).image + ".");} } }
 B():   {} { <TOKB1> | <TOKB2>
    | {throw new ParseException("Expected B, found " + getToken(1).image + ".");} }}