1

我正在尝试重构一个几乎只使用一种词法状态编写的 JavaCC DSL 解析器。

我的目标是引入一个上下文敏感的新关键字,不会使使用旧 DSL 的旧配置无效。

这个想法是改变词法状态并引入 new 关键字,因此它仅在非常特定的上下文中有效。与早期版本向后兼容。

问题:评论已经改变了词法状态,在评论结束后变回 DEFAULT。改回 DEFAULT 是“硬编码的”,但现在我需要 Comments 来改回最后一个活动的词法状态。

据我了解,将状态保存在堆栈中,推送和弹出它们将帮助我实现这一点(认为这称为 DPDA)。这在 JavaCC 中可能吗?

[编辑,在搜索了更多之后,这就是我得到的:]

TOKEN_MGR_DECLS : {
    Stack lexicalStateStack = new Stack();
}

SKIP : {
   " "
|  "\t"
|  "\n"
|  "\r"
}

MORE :
{
  "/*" { lexicalStateStack.push(curLexState); } : IN_COMMENT
}

SPECIAL_TOKEN :
{
  <IN_COMMENT : "*/" > { SwitchTo((int)lexicalStateStack.pop()); }
}

似乎在做我想做的事,但它是正确的吗?(在这里考虑前瞻)

4

1 回答 1

3

绝对地。您可以堆叠词法状态。但是,从令牌管理器而不是解析器进行转换。

请参阅问题3.17 如何标记嵌套评论?3.12 解析器可以强制切换到新的词法状态吗?在常见问题解答http://www.engr.mun.ca/~theo/JavaCC-FAQ/中。

于 2013-10-16T15:47:51.627 回答