JavaCC - 如何存储令牌以供以后解析?

时间:2013-06-21 06:48:14

标签: token javacc any

我正在尝试部分解析我的输入,以便我可以存储某些块以供稍后解析。

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可能已经在其队列中有一些令牌。

所以我想知道是否有关于令牌的任何等价物。或者至少有人知道如何以不同的方式处理我的问题?

1 个答案:

答案 0 :(得分:2)

当然,一种方法是制作一个大型作品,列出除“{”和“}”之外的各种标记。

Token any() :{Token t;}{ (t=<NUMBER> | t=<IDENTIFIER> | t="(" | ... | ) {return t;} }

但这并不优雅。

相反,您可以编写一个消耗令牌的JAVACODE作品,直到找到最后的闭括号。有关类似示例,请参阅https://javacc.java.net/doc/javaccgrm.html#JAVACODE