忽略空格,但允许带空格的文本

时间:2018-05-03 11:14:54

标签: antlr grammar antlr4

我需要为这样的表达式编写一个简单的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中添加一个空格时,我的第二个表达式突出显示为错误。

screenshot

我该怎么办?提前谢谢!

1 个答案:

答案 0 :(得分:0)

忽略所有空格,但将它们视为“词尾”,并在值中允许更多单词:

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的顺序匹配。