Игнорировать пробелы, но разрешить текст с пробелами - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно написать простую грамматику antlr4 для таких выражений:

{paramName=simple text} //correct
{ paramName = simple text} //correct
{bad param=text} //incorrect

Первые два выражения почти равны. Разница заключается в пробелах до и после имени параметра. Третье неверно, пробелы не допускаются в имени параметра. Я пишу грамматику:

grammar Test;

prog       : '{' paramName '=' paramValue '}' ;
paramName  : PARAM_NAME ;
paramValue : TEXT_WITH_SPACES ;

PARAM_NAME       : [A-Za-zА-Яа-я_] [A-Za-zА-Яа-я_0-9]* ;
TEXT_WITH_SPACES : (LETTERS_EN|' ')+ ;
WS               : [ ]+ -> skip;

fragment LETTERS_EN       : ([A-Za-z]) ;

Итак, задача - игнорировать пробелы вокруг имени параметра, но разрешить пробелы в значении параметра. Но когда я добавляю пробел в правило TEXT_WITH_SPACES, мое второе выражение выделяется как неправильное.

Скриншот

Что я могу сделать? Заранее спасибо!

1 Ответ

0 голосов
/ 03 мая 2018

Игнорировать все пробелы, но считать их «концом слова» и разрешить вводить больше слов в значение:

grammar Test;

prog       : '{' paramName '=' paramValue '}' ;
paramName  : WORD ;
paramValue : WORD+ ;

WORD       : [A-Za-zА-Яа-я_] [A-Za-zА-Яа-я_0-9]* ;
WS         : [ ]+ -> skip;

Обновление: чтобы сохранить пробелы в значении:

grammar Test;

prog       : '{' paramName '=' paramValue '}' ;
paramName  : WORD ;
paramValue : WORD | MULTIWORD ;

MULTIWORD  : WORD ((' ')+ WORD)* ;
WORD       : [A-Za-zА-Яа-я_] [A-Za-zА-Яа-я_0-9]* ;
WS         : [ ]+ -> skip;

Это основано на MULTIWORD сопоставлении нескольких слов с пустым пространством между ними, а в других случаях - по последовательности WORD и WS.

...