1

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

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 的常见问题解答,通过解析器设置令牌状态似乎是一种不好的做法,因为 TokenManager 的队列中可能已经有一些令牌。

所以我想知道是否有任何关于代币的任何等价物。或者至少有人知道如何以不同的方式解决我的问题?

4

1 回答 1

2

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

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

但这一点都不优雅。

相反,您可以编写一个JAVACODE使用令牌的产生式,直到找到最后的右大括号。有关类似示例,请参见https://javacc.java.net/doc/javaccgrm.html#JAVACODE 。

于 2013-06-21T23:19:32.283 回答