Как разобрать список текста, разделенный многосимвольными разделителями - PullRequest
1 голос
/ 17 апреля 2019

Для анализа списка текста через запятую (без запятых). Я могу использовать это,

main: Text (Sep Text)*;

Sep: ',';
Text: ~','*;

Теперь я хотел бы изменить синтаксический анализатор, чтобы использовать две запятые вместо одной в качестве разделителя.

Очевидно, что это не работает,

main: Text (Sep Text)*;

Sep: ',,';
Text: ~',,'*;

Как мне это сделать?Возможно ли, чтобы лексер возвратил один токен с текстом?И возможно ли это без действий \ предикатов?

1 Ответ

1 голос
/ 19 апреля 2019

Нет, вы не можете отрицать 2 (или более) символа (~',,' недопустимо).

Вы можете сделать это:

main  : Text (sep Text)* EOF;
sep   : Comma Comma;
Comma : ',';
Text  : ~',' ( ~',' | ',' ~',' )*;

Где Text соответствует запятой (~','), за которой следует ноль или более:

  • не запятые (~',') или
  • одиночная запятая, за которой следует не запятая (',' ~',')
...