ANTLR4 может анализировать только оператор класса, а не весь файл - PullRequest
0 голосов
/ 01 апреля 2020

Я создал простой код для разбора PHP файла:

<?php
namespace aaa;

class Xyz {

}

Я написал парсер, используя ANTL4 и эту грамматику: https://github.com/antlr/grammars-v4/tree/master/php:

PhpLexer lexer = new PhpLexer(new ANTLRInputStream((new BufferedReader(new FileReader("./code/test.php")))));
CommonTokenStream tokens = new CommonTokenStream(lexer);
PhpParser parser = new PhpParser(tokens);

PhpParserBaseListener listener = new PhpParserBaseListener();

parser.addParseListener(listener);
parser.classDeclaration().enterRule(listener);

parser.getSerializedATN();

Возвращает ошибку:

строка 3: 0 несоответствующий ввод 'пространство имен' ожидание {'абстрактное', 'класс', 'конечное', 'интерфейс', 'частичное', 'личное ',' trait '}

Но когда я уберу "namespace aaa;" Скажите:

<?php

class Xyz {

}

все хорошо.

Как это исправить?

1 Ответ

1 голос
/ 01 апреля 2020

Поскольку вы не показываете свою грамматику, невозможно дать конкретный c ответ. Кроме того, я действительно недостаточно знаю о PHP времени выполнения Antlr, чтобы рискнуть предположить, что он делает:

parser.classDeclaration().enterRule(listener);

Но в целом Antlr4 создает интерфейс для каждого нетерминального правила, поэтому я предполагаю, что parser.classDeclaration() соответствует правилу classDeclaration, которое предположительно представляет объявление класса, а не всей программы. Вероятно, вы должны изменить classDeclaration на то, каким будет правило верхнего уровня в вашей грамматике.

...