想用来处理 Windows 的 hosts 文件,但是只能正确处理注释部分。
grammar hosts;
hostfile: line* EOF;
line : item
| comment
;
item: IPADDRESS HOSTNAME ;
comment: COMMENT;
HOSTNAME: [A-z0-9.]+;
NUM: [0-9] +;
IPADDRESS: NUM ;
COMMENT: '#' .*? '\r'? '\n';
NL: ('\r\n'|'\n\r'|'\r'|'\n') ->skip;
BLANK: (' '|'\t') ->skip;
1
cpdyj0 OP 算了,自问自答下吧,在 StackOverFlow 上得到答案了,ANTLR 生成的 lexer 和 parser 是独立的两个东西,parser 不能影响 lexer,所以 lexer 按照最长匹配原则匹配下去,靠前的优先。(发出来的 grammar `IPADDRESS` 那里有误,debug 时改来改去忘记改回来了)`IPADDRESS` 和 `HOSTNAME` 都可以匹配到 IP 地址,`HOSTNAME` 靠前,所以就都成了域名了,文法规则识别不到。
|