我正在编写一个自定义flex文件来生成一个用于JSyntaxpane的词法分析器。
我需要lex的自定义语言具有不同的状态,可以在一种堆栈中相互嵌入。
I.E您可能正在编写一个表达式,其中包含单个带引号的字符串,然后使用特殊标记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内置函数可以利用或我应该了解的最佳实践?
答案 0 :(得分:3)
我认为这是一种非常好的方式。我实际上需要一些类似的功能来添加Groovy GString,像String这样的Python和一些HTML到JavaDocs。
我还想添加的是Lexer调用Lexer来解析子节。类似于嵌入在HTML中的JavaScript。但我没有时间去做。
我喜欢StackOverflow,但只是想知道为什么不在JSyntaxPane的问题上发布这个?