Как ссылаться на атрибут из парсера .bnf в JFlex? - PullRequest
0 голосов
/ 14 июня 2019

Я использую парсер .bnf для обнаружения определенных выражений и использую JFlex для обнаружения различных разделов этих выражений. Моя проблема в том, что некоторые из этих выражений могут содержать вложенные выражения, и я не знаю, как с этим справиться.

Я попытался включить парсер .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>)

Любой вклад будет принята с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 15 июня 2019

Я нашел решение своей проблемы.Более подробно, проблема была и в моем файле грамматики, и в моем файле 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; }
...