首页 > 解决方案 > 如何从 JFlex 中的 .bnf 解析器中引用属性?

问题描述

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

我尝试通过 using 将 .bnf 解析器包含在我的 JFlex 中%include,然后使用 引用相关宏中的表达式PARAMETERS = ("'"[:jletter:] [:jletterdigit:]*"'") | expression。这失败了,因为 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

.bnf 解析器的片段:

{
//list of classes used.
}
expression ::= (<expression definition>)

任何投入将不胜感激。谢谢。

标签: javajflex

解决方案


我找到了解决我的问题的方法。更深入地讲,问题出在我的语法文件和 flex 文件中。为了解决这个问题,我递归地调用了语法文件中的表达式,如下所示: expression = (start value expression? end)

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

%state = WAITING_EXPRESSION

<WAITING_NEXT> "<something which indicates start of nested expression>"   { yybegin(WAITING_EXPRESSION); return EXPRESSION_START; }

推荐阅读