Antlr 忽略空格,但允许文本带有空格
我需要为以下表达式编写一个简单的antlr4语法:Antlr 忽略空格,但允许文本带有空格,antlr,grammar,antlr4,Antlr,Grammar,Antlr4,我需要为以下表达式编写一个简单的antlr4语法: {paramName=simple text} //correct { paramName = simple text} //correct {bad param=text} //incorrect 前两个表达式几乎相等。区别在于参数名称前后有一个空格。第三个不正确,参数名称中不允许有空格。我写语法: grammar Test; prog : '{' paramName '=' paramValue '}' ; paramNam
{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]) ;
因此,任务是忽略参数名称周围的空格,但在参数值中允许空格。但当我在规则文本_中添加一个带有_空格的空格时,我的第二个表达式将高亮显示为icorrect
我能做什么?提前谢谢你 < P>忽略所有空格,但认为它们是“词尾”,并允许更多的单词在值:
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;
更新:要在值中保留空格,请执行以下操作:
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
匹配多个单词,单词之间只有空格,而其他情况则通过单词和WS的顺序进行匹配。然后我们丢失了所有额外的空格值:例如“我的短语在短语和单词之间有多个空格”(此处为“无法写入”)在这种情况下,您可能不需要使用多个单词比单个单词长的事实,即将多个单词作为一个标记进行匹配,并允许paramValue为单个单词或多个单词标记。哇,这似乎是正确的,让我做一些测试,然后再将其标记为答案,但我们需要交换位置multiword和WORDyeah,我们在第一个单词前面的paramValue中去掉了所有空格,但这是可以接受的。非常感谢。