Я использовал грамматику Antlr Matlab из грамматик Antlr
Я обнаружил, что мне нужно реализовать оператор Matlab. Это оператор комплексно-сопряженного транспонирования , используемый как таковой
result = input'
Я попробовал простое решение, добавив его в unary_expression в качестве опции postfix_expression '\''
Однако, это не удалось проанализировать, когда несколько таких операторов использовались в одной строке.
Вот значительно упрощенная версия грамматики, по-прежнему демонстрирующая точную проблему:
grammar Grammar;
unary_expression
: IDENTIFIER
| unary_expression '\''
;
translation_unit : unary_expression CR ;
STRING_LITERAL : '\'' [a-z]* '\'' ;
IDENTIFIER : [a-zA-Z] ;
CR : [\r\n] + ;
Тестовые примеры, будучи анализируется как translation_unit:
"x''\n" //fails getNumberOfSyntaxErrors returns 1
"x'\n" //passes
Ошибка также выводит сообщение line 1:1 extraneous input '''' expecting CR
на stderr.
Ошибка исчезает, если я удаляю STRING_LITERAL или изменяю *
на +
. Конечно, это тоже не подходящее решение, так как его удаление полностью исключено из таблицы, а обязательное использование непустых строк не совсем правильно, хотя я мог бы смириться с этим. Кроме того, принудительное использование непустой строки не помогает в реальном варианте использования, когда вводится что-то вроде x' + y'
вместо того, чтобы использовать оператор дважды.
По какой-то причине CR
удаляется из грамматики и \n
из тестов также позволяет без проблем выполнять синтаксический анализ, но, опять же, это не пригодное решение.
Что я могу сделать с грамматикой, чтобы она работала правильно? Я предполагаю, что это проблема с лексированием именно потому, что удаление STRING_LITERAL или невозможность сопоставления ''
приводит к удалению go.