Java 跟踪JFlex中的状态

Java 跟踪JFlex中的状态,java,parsing,jflex,jsyntaxpane,Java,Parsing,Jflex,Jsyntaxpane,我正在编写一个自定义flex文件来生成一个用于JSyntaxpane的lexer 我需要的自定义语言具有不同的状态,可以在某种堆栈中相互嵌入 也就是说,您可以编写一个表达式,其中包含一个带引号的字符串,然后使用特殊的标记eval()将另一个表达式嵌入该字符串中。但也可以将表达式嵌入双引号字符串中 例如: 这是一种简化,有更多的状态,但假设我需要双_字符串和单_字符串有不同的状态,它充分描述了我的情况 确保在关闭eval表达式时返回正确状态的最佳方法是什么(即,如果我在双引号中,则返回到双\u字符

我正在编写一个自定义flex文件来生成一个用于JSyntaxpane的lexer

我需要的自定义语言具有不同的状态,可以在某种堆栈中相互嵌入

也就是说,您可以编写一个表达式,其中包含一个带引号的字符串,然后使用特殊的标记eval()将另一个表达式嵌入该字符串中。但也可以将表达式嵌入双引号字符串中

例如:

这是一种简化,有更多的状态,但假设我需要双_字符串和单_字符串有不同的状态,它充分描述了我的情况

确保在关闭eval表达式时返回正确状态的最佳方法是什么(即,如果我在双引号中,则返回到双\u字符串;如果我在单引号中,则返回单\u字符串)

我提出的解决方案是使用堆栈和一些自定义方法来跟踪状态,而不是使用yybegin来启动不同的状态

private Stack<Integer> stack = new Stack<Integer>();

public void yypushState(int newState) {
  stack.push(yystate());
  yybegin(newState);
}

public void yypopState() {
  yybegin(stack.pop());
}
私有堆栈=新堆栈();
公共状态(int newState){
stack.push(yystate());
yybegin(新闻状态);
}
公共状态(){
yybegin(stack.pop());
}

这是实现这一目标的最佳方式吗?是否有一个更简单的JFlex内置功能可以利用,或者有一个我应该知道的最佳实践?

我认为这是一个很好的方法。实际上,我需要一些类似的特性来向Javadoc添加Groovy GString、类似Python的字符串和一些HTML

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


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

嗨,Ayman,对不起,我刚刚看到了你的答案。我也喜欢StackOverflow,所以我想我只是想看看这里是否有很多flex/词法分析/解析社区。我想我应该在jsyntaxpane交叉发布。我过去曾在那里发帖(我是TomPoges)。顺便说一句,JSyntaxPane做得很好。我也有同样的想法,但我认为这是一个糟糕的做法。所以现在实现嵌入式状态就容易多了!
private Stack<Integer> stack = new Stack<Integer>();

public void yypushState(int newState) {
  stack.push(yystate());
  yybegin(newState);
}

public void yypopState() {
  yybegin(stack.pop());
}