如何从 JFlex 中的 .bnf 解析器引用属性?
How to reference attribute from .bnf parser in 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>)
如有任何意见,我们将不胜感激。谢谢
我找到了问题的解决方案。更深入地说,问题出在我的语法文件和我的 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; }
我正在使用 .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>)
如有任何意见,我们将不胜感激。谢谢
我找到了问题的解决方案。更深入地说,问题出在我的语法文件和我的 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; }