Выражение Antlr4 с условным пропущенным разделителем - PullRequest
1 голос
/ 08 февраля 2020

Я хочу разобрать Smalltalk.
Обычно в последовательности выражений им нужен токен PERIOD (.) Между ними как разделитель, например ';' в java. Самому выражению не нужен ПЕРИОД. Следовательно, я сопоставляю этот ПЕРИОД в правиле выражений:

expressions : expression (PERIOD expression)*;

И различные подправила для указанного выражения c не соответствуют ПЕРИОДУ сами по себе.

Однако есть один особый тип выражения, который вызывает собственные библиотеки:
<primitive: ABC>

И когда за ним следует другое выражение, PERIOD неожиданно не необходимо.

Как можно справиться с такой ситуацией?

Возможно, ввести ПЕРИОД. Из правила «примитива» скажите лексеру, что нужно добавить токен PERIOD. Но как?

Или есть лучшее решение для этой ситуации?

Фрэнк

1 Ответ

1 голос
/ 09 февраля 2020

Возможно что-то вроде этого:

expressions
 : start_expression* expression '.'?
 ;

start_expression
 : expression '.'
 | pragma
 ;

expression
 : assignment
 | pragma
 ;

assignment
 : ID ':=' NUMBER
 ;

pragma
 : '<' ID ':' ID '>'
 ;
...