Как токенизировать слово в несколько строк в ANTLR4 - PullRequest
1 голос
/ 01 октября 2019

Я хочу обозначить следующее слово "SINGULAR EXECUTIVE OF MINIMUM QUANTIA" несколькими строками. Это довольно просто, если у вас есть полное слово в одной строке

foo bar foo bar foo bar SINGULAR EXECUTIVE OF MINIMUM QUANTIA foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo barfoo bar foo bar foo bar

, но я не могу токенизировать его, когда слово разбито на две строки

foo bar foo bar foo bar SINGULAR EXECUTIVE OF 
MINIMUM QUANTIA foo bar foo bar foo bar foo bar
foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar 

Это мой лексер

SPECIALWORD:S I N G U L A R ' ' E X E C U T I V E ' ' O F ' ' M I N I M U M ' ' Q U A N T I A 
fragment A:('a'|'A'|'á'|'Á');
......
......
fragment Z:('z'|'Z');
WORDUPPER: UCASE_LETTER UCASE_LETTER+;
WORDLOWER: LCASE_LETTER LCASE_LETTER+;
WORDCAPITALIZE: UCASE_LETTER LCASE_LETTER+;
LCASE_LETTER: 'a'..'z' | 'ñ' | 'á' | 'é' | 'í' | 'ó' | 'ú';
UCASE_LETTER: 'A'..'Z' | 'Ñ' | 'Á' | 'É' | 'Í' | 'Ó' | 'Ú';
INT: DIGIT+;
DIGIT: [0-9];  
WS : [ \t\r\n]+ -> skip;
ERROR: . ;

Я попытался использовать разрыв строки в правиле лексера

SPECIALWORD:S I N G U L A R ' ' E X E C U T I V E ' ' O F [\n] M I N I M U M ' ' Q U A N T I A

, но это не работает, я думаю, потому что лексер токенизировал строку за строкой.

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Итак, что вы на самом деле хотите, так это чтобы комбинация из 5 слов стала определенным токеном, в то же время разрешив произвольное количество пробелов между ними. Это на самом деле принцип работы по умолчанию парсеров на основе ANTLR4. Ваша попытка поместить все это в один токен лексера - вот что усложняет ситуацию.

Вместо этого определите ваши (ключевые) слова как:

SINGLUAR_SYMBOL: S I N G U L A R;
EXECUTIVE_SYBOL: E X E C U T I V E;
OF_SYMBOL: O F;
MINIMUM_SYMBOL: M I N I M U M;
QUANTIA_SYMBOL: Q U A N T I A;

and define a parser rule to parse these as a special sentence:

singularExec: SINGLUAR_SYMBOL EXECUTIVE_SYBOL OF_SYMBOL MINIMUM_SYMBOL QUANTIA_SYMBOL;

Вместе с вашим правилом WS, которое будетсопоставлять любую комбинацию пробелов между отдельными символами.

0 голосов
/ 02 октября 2019

Ваше исправленное правило совпадает, если существует ровно один \n и нет другого символа между «OF» и «MINIMUM». Тем не менее, ваш ввод содержит пробел до разрыва строки. Таким образом, правило не совпадает.

Если вы удалите пробел из ввода или измените правило, чтобы разрешить пробелы до переноса строки, оно будет совпадать.

Возможно, вы захотитеиспользуйте либо [ \n]+, чтобы разрешить произвольное количество пробелов и / или разрывов строк (вы можете добавить \t и \r также для хорошей меры), либо ' '* '\n' ' '*, если вы все еще хотите ограничить его доразрыв строки, но допускается любое количество пробелов вокруг него.

При этом вам, вероятно, будет легче, если вы сделаете каждое слово своим собственным токеном.

...