0
在我(simplyfied)语法ANTLR4:空白和空间词汇处理
grammar test;
prog: stat+;
stat:
sourceDef ';'
;
sourceDef:
SRC COLON ID
;
STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote
LINE_COMMENT
: '//' (~('\n'|'\r'))* -> skip;
WS : [ \t\n\r]+ -> skip;
//SP : ' ' -> skip;
COMMENT : '/*' .*? '*/' -> skip;
LE: '<';
MINUS: '-';
GR: '>';
COLON: ':' ;
HASH: '#';
EQ: '=';
SEMI: ';';
COMMA: ',';
AND: [Aa][Nn][Dd];
SRC: [Ss][Rr][Cc];
NUMBER: [0-9];
ID: [a-zA-Z][a-zA-z0-9]+;
DAY: ('0'[1-9]|[12][0-9]|'3'[01]);
MONTH: ('0' [1-9]|'1'[012]);
YEAR: [0-2] [890] NUMBER NUMBER;
DATE: DAY [- /.] MONTH [- /.] YEAR;
代码
源:XXX;
示出了语法错误:
extraneous input ' ' expecting ':'
代码
src:xxx;
解析细。
修改后的版本与
WS : [\t\n\r]+ -> skip;
SP : ' ' -> skip;
正常工作与两个语法版本(带和不带空格)。 因此,这些空格似乎只能被跳过,如果它们被定义在 单独的规则中。
有毛病这个
WS : [ \t\n\r]+ -> skip;
定义是什么?
还有什么可能导致这种(对我)意想不到的行为?
这很令人困惑:这个定义有很多例子,所以我不这么认为,这可能就是问题所在。 你的意思是撇号是问题吗? – Mike75
我不得不承认,我还没有测试过你的语法,但是如果它确实与单独定义的SP令牌一起工作,我敢打赌这就是原因。大概是这样,试试吧。我更喜欢使用'撇号'语法来表示正则表达式,因为它更具可读性。如果您想使用[]语法,请尝试[\ s \ r \ t \ n]。 – Divisadero