覺得既然是第一次嘗試ANTLR嘛,那就來個簡單點的,parse Windows 的 hosts 文件吧,結果...... 先上一段 grammar: 乍一看好像沒什麼問題,挺好的,然而 那條文法規則就是不起作用,前面註釋都正常處理了,結果ip地址出不來。 網上搜了半天也搜不到,於是去StackOve ...
覺得既然是第一次嘗試ANTLR嘛,那就來個簡單點的,parse Windows 的 hosts 文件吧,結果......
先上一段 grammar:
grammar hosts;
hostfile: line* EOF;
line : item
| comment
;
item: IPADDRESS HOSTNAME ;
comment: COMMENT;
HOSTNAME: [A-z0-9.]+;
IPADDRESS: NUM '.' NUM '.' NUM '.' NUM;
NUM: [0-9] +;
COMMENT: '#' .*? '\r'? '\n';
NL: ('\r\n'|'\n\r'|'\r'|'\n') ->skip;
BLANK: (' '|'\t') ->skip;
乍一看好像沒什麼問題,挺好的,然而item
那條文法規則就是不起作用,前面註釋都正常處理了,結果ip地址出不來。
網上搜了半天也搜不到,於是去StackOverflow上找了找,有個現成的。
StackOverflow: antlr-4-5-mismatched-input-x-expecting-x
解決辦法就是把IPADDRESS
挪到HOSTNAME
上面就行了,原因是ANTLR
生成的 parser 和 lexer幾乎是獨立工作的,在不考慮內嵌動作的情況下parser不能影響lexer;lexer會簡單的按照最長匹配的原則,一樣長的就看grammar中出現的順序。。。
所以之前那個文法把IP地址都匹配成了HOSTNAME
...
問題解決,還是沒好好看書,書上應該都寫了的...