在JFlex中跟踪状态

时间:2009-05-20 11:53:04

标签: java parsing jflex jsyntaxpane

我正在编写一个自定义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内置函数可以利用或我应该了解的最佳实践?

1 个答案:

答案 0 :(得分:3)

我认为这是一种非常好的方式。我实际上需要一些类似的功能来添加Groovy GString,像String这样的Python和一些HTML到JavaDocs。

我还想添加的是Lexer调用Lexer来解析子节。类似于嵌入在HTML中的JavaScript。但我没有时间去做。

我喜欢StackOverflow,但只是想知道为什么不在JSyntaxPane的问题上发布这个?