Java 如何在JFlex中引用.bnf解析器中的属性?

Java 如何在JFlex中引用.bnf解析器中的属性?,java,jflex,Java,Jflex,我使用.bnf解析器来检测特定的表达式,并使用JFlex来检测这些表达式的不同部分。我的问题是,其中一些表达式可能包含嵌套表达式,我不知道如何处理 我试图通过使用%include将.bnf解析器包含在JFlex中,然后使用参数=(“'”[:jletter:[:jletterdigit:*”))引用相对宏中的表达式。这会失败,因为JFlex报告.bnf的格式不正确 JFlex的代码片段: %{ public Lexer() { this((java.io.Reader)null);

我使用.bnf解析器来检测特定的表达式,并使用JFlex来检测这些表达式的不同部分。我的问题是,其中一些表达式可能包含嵌套表达式,我不知道如何处理

我试图通过使用
%include
将.bnf解析器包含在JFlex中,然后使用
参数=(“'”[:jletter:[:jletterdigit:*”))引用相对宏中的表达式。这会失败,因为JFlex报告.bnf的格式不正确

JFlex的代码片段:


%{
  public Lexer() {
    this((java.io.Reader)null);
  }
%}

%public
%class Lexer
%implements FlexLexer
%function advance
%type IElementType
%include filename.bnf
%unicode

PARAMETERS= ("'"[:jletter:] [:jletterdigit:]*"'") | <a new expression element>

%%

<YYINITIAL> {PARAMETERS}   {return BAD_CHARACTER;} some random return

%{
公共Lexer(){
此((java.io.Reader)为null);
}
%}
%公开的
%类Lexer
%实现FlexLexer
%功能推进
%类型IElementType
%包括filename.bnf
%统一码
参数=(“'”[:jletter:[:jletterdigit:][*“'”)|
%%
{PARAMETERS}{return BAD_CHARACTER;}一些随机返回
.bnf解析器的代码段:

{
//list of classes used.
}
expression ::= (<expression definition>)
{
//使用的类的列表。
}
表达式::=()

如有任何意见,将不胜感激。谢谢。

我找到了解决问题的办法。更深入地说,问题出在我的语法文件和flex文件中。为了解决这个问题,我递归调用语法文件中的表达式,如下所示:
expression=(开始值表达式?结束)

使用JFlex,我声明了许多状态,直到我找到了一种方法将它们链接在一起,并创建了无数的表达式。看起来有点像这样:

%state = WAITING_EXPRESSION

<WAITING_NEXT> "<something which indicates start of nested expression>"   { yybegin(WAITING_EXPRESSION); return EXPRESSION_START; }
%state=WAITING\u表达式
“{yybegin(等待表达式);返回表达式\u START;}”

您正在使用哪个解析器生成器?据我所知,唯一使用
.bnf
文件扩展名的解析器生成器是
bnfc
,但是您显示的代码片段看起来不是有效的
bnfc
代码,如果您使用
bnfc
,您不需要编写自己的jflex文件(因为
bnfc
会为您生成一个),你能再解释一下你想做什么吗?你说表达式可以包含嵌套的表达式,这当然不是不寻常的。然而,这不应该与lexer有任何关系。这意味着解析器中的
表达式
规则应该是递归的-词法分析器应该不受此影响。您好,感谢您的响应,并为您的含糊不清感到抱歉。我现在已经解决了我的问题,稍后将在这里发布答案。