我正在尝试重构一个几乎只使用一种词法状态编写的 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()); }
}
似乎在做我想做的事,但它是正确的吗?(在这里考虑前瞻)