6

我正在编写一个自定义 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 内置功能或我应该了解的最佳实践?

4

1 回答 1

5

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

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

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

于 2009-06-30T08:40:55.330 回答