我正在尝试部分解析我的输入,以便我可以存储某些块以供稍后解析。
void start():{}
{
stmt()*
}
void stmt():{}
{
"parse:" expr_later() ";"
}
void expr_later():{}
{
(
expr();
// store tokens from expr() in a list for later processing....
)*
}
void expr():{}
{
"{" expr() "}"
| <ANY:~[]>
}
在这种情况下,“ANY”标记仅在先前的标记与其他任何标记不匹配时才有效,但假设我有更多标记定义,则上面的语法不会。
我知道~[]
匹配任何字符而不匹配任何令牌。
此外,假设我会使用令牌状态(他们使用javadoc,pragma等做的事情),我仍然会在捕获块时遇到问题,因为我没有任何令牌来设置我的特殊令牌状态。此外,根据JavaCC的FAQ,通过解析器设置令牌状态似乎是一种不好的做法,因为TokenManager可能已经在其队列中有一些令牌。
所以我想知道是否有关于令牌的任何等价物。或者至少有人知道如何以不同的方式处理我的问题?
答案 0 :(得分:2)
当然,一种方法是制作一个大型作品,列出除“{”和“}”之外的各种标记。
Token any() :{Token t;}{ (t=<NUMBER> | t=<IDENTIFIER> | t="(" | ... | ) {return t;} }
但这并不优雅。
相反,您可以编写一个消耗令牌的JAVACODE
作品,直到找到最后的闭括号。有关类似示例,请参阅https://javacc.java.net/doc/javaccgrm.html#JAVACODE。