我正在尝试重构一个只使用一个词法状态编写的JavaCC DSL解析器。
我的目标是引入一个新的关键字,该关键字对上下文不敏感,不会使旧版DSL使旧配置无效。
这个想法是改变词汇状态并引入新关键字,使其仅在非常特定的上下文中有效。向后兼容早期版本。
问题:评论已经改变词汇状态,在评论结束后改回DEFAULT。更改回DEFAULT是“硬编码”,但现在我需要注释而不是更改回上一个活动的词法状态。
根据我的理解,将状态保存在堆栈中,推送和弹出它们将帮助我实现这一点(想想这就是所谓的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()); }
}
似乎正在做我想做的事,但这是正确的吗? (想到这里的前瞻)
答案 0 :(得分:2)
绝对。你可以叠加词汇状态。但是,从令牌管理器而不是解析器进行转换。
在常见问题解答3.17 How do I tokenize nested comments?中查看问题3.12 Can the parser force a switch to a new lexical state?和http://www.engr.mun.ca/~theo/JavaCC-FAQ/。