我需要为这样的表达式编写一个简单的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中添加一个空格时,我的第二个表达式突出显示为错误。
我该怎么办?提前谢谢!
答案 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的顺序匹配。