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

时间:2019-06-14 14:42:32

标签: java jflex

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

我尝试通过使用%include在我的JFlex中包括.bnf解析器,然后使用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>)

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

1 个答案:

答案 0 :(得分:0)

我已经找到解决问题的方法。更深入地讲,问题出在我的语法文件和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; }