我正在编写一个自定义 flex 文件来生成一个用于 JSyntaxpane 的词法分析器。
我需要 lex 的自定义语言具有不同的状态,可以在一种堆栈中相互嵌入。
在 IE 中,您可以编写一个包含单引号字符串的表达式,然后使用特殊标记 eval() 在字符串中嵌入另一个表达式。但您也可以将表达式嵌入双引号字符串中。
例如:
someExpressionFunction('a single-quoted string with an eval(expression) embedded in it', "a double-quoted string with an eval(expression) embedded in it")
这是一个简化,有比这更多的状态,但假设我需要为 DOUBLE_STRING 和 SINGLE_STRING 设置不同的状态,它充分描述了我的情况。
确保在关闭 eval 表达式后返回正确状态的最佳方法是什么(即,如果我在双引号中,则返回 DOUBLE_STRING,如果我在单引号中,则返回 SINGLE_STRING)
我提出的可行的解决方案是使用 Stack 和一些自定义方法来跟踪状态,而不是使用 yybegin 来启动不同的状态。
private Stack<Integer> stack = new Stack<Integer>();
public void yypushState(int newState) {
stack.push(yystate());
yybegin(newState);
}
public void yypopState() {
yybegin(stack.pop());
}
这是实现这一目标的最佳方式吗?是否有我可以利用的更简单的 JFlex 内置功能或我应该了解的最佳实践?