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