gpt4 book ai didi

java - 在 JFlex 中跟踪状态

转载 作者:搜寻专家 更新时间:2023-11-01 02:34:51 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于java - 在 JFlex 中跟踪状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/887485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com