在JavaCC中推送/弹出词法状态

时间:2013-10-16 11:27:38

标签: parsing javacc lexical

我正在尝试重构一个只使用一个词法状态编写的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()); }
}

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

1 个答案:

答案 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/