ANTLR4 генерирует неправильный код Java

java parsing antlr grammar antlr4

171 просмотра

1 ответ

Я пытаюсь использовать эту грамматику для разбора кода Mathematica. Я использовал плагин Gradle для генерации Java-кода. Два из сгенерированных файлов содержат неправильный код Java, как это:

private void LBARBRACKET_action(RuleContext _localctx, int actionIndex) {
    switch (actionIndex) {
    case 12:
        self.incrementBracketLevel(1);
        break;
    }
}

Может быть, я мог бы просто удалить все "я". случаи, но я не хочу этого делать. Кто-нибудь сталкивался с такой же проблемой?

Автор: andryr Источник Размещён: 08.11.2019 11:05

Ответы (1)


2 плюса

Решение

Указанная грамматика плохо построена. Он использует importзаявление, чтобы включить оптовую продажу лексера. Вместо этого просто полагайтесь на ANTLR, обрабатывающего правильный разделенный лексер / парсер.

Переименуйте (внутренне и внешне) в FoxySheepParserи FoxySheepLexer и отметьте грамматические типы:

  parser grammar FoxySheepParser ;
  lexer  grammar FoxySheepLexer  ; 

FWIW, ANTLR внутренне отделяет лексер от объединенной грамматики и затем продолжает работу, как будто работает с обычным разделенным лексером / парсером. Из-за сложности существующего лексера и того, как он был включен, это разделение не выполняется, и, если какой-либо код генерируется, результаты не могут быть уверены в надежности.

Наконец, по умолчанию для генерации грамматического кода используется Java. Однако в лексере присутствуют операторы собственного кода, которые являются специфическими для Python. Либо укажите Python в качестве цели генерации кода, либо замените нативные операторы их Java-эквивалентами (проверьте java target/srcподкаталог).

Автор: GRosenberg Размещён: 20.08.2016 09:43
Вопросы из категории :
32x32