我有以下语法来lex / parse一个字符串,我现在想要的是用空格标记:
grammar MyItems;
theseItems : item (SPACE item)* ;
item : FIELDTEXT+ ;
SPACE : ' ' ;
FIELDTEXT : ~[' '] ;
输入:
V3 AGL V445
给我一个错误:
line 1:0 mismatched input 'V3' expecting FIELDTEXT
为什么这不给我一套3件物品?
答案 0 :(得分:1)
使用发布的语法我没有错误,但是:
$ a4 MyItems_op.g4
warning(180): MyItems_op.g4:5:13: chars "'" used multiple times in set [' ']
$ javac M*.java
$ grun MyItems_op theseItems -tokens -diagnostics input.text
[@0,0:0='V',<FIELDTEXT>,1:0]
[@1,1:1='3',<FIELDTEXT>,1:1]
[@2,2:2=' ',<' '>,1:2]
[@3,3:3='A',<FIELDTEXT>,1:3]
[@4,4:4='G',<FIELDTEXT>,1:4]
[@5,5:5='L',<FIELDTEXT>,1:5]
...
如您所见,规则
FIELDTEXT : ~[' '] ;
匹配单个字符。
试试这个:
grammar MyItems;
theseItems
@init {System.out.println("MyItems last update 0030");}
: item (SPACE item)*
;
item
: FIELDTEXT
;
SPACE : ' ' ;
FIELDTEXT : ~[ \r\n]+ ;
NL : [\r\n]+ -> skip ;
执行:
$ alias
alias a4='java -jar /usr/local/lib/antlr-4.6-complete.jar'
$ a4 MyItems.g4
$ javac M*.java
$ grun MyItems theseItems -tokens -diagnostics input.text
[@0,0:1='V3',<FIELDTEXT>,1:0]
[@1,2:2=' ',<' '>,1:2]
[@2,3:5='AGL',<FIELDTEXT>,1:3]
[@3,6:6=' ',<' '>,1:6]
[@4,7:10='V445',<FIELDTEXT>,1:7]
[@5,12:11='<EOF>',<EOF>,2:0]
MyItems last update 0030
$ hexdump -C input.text
00000000 56 33 20 41 47 4c 20 56 34 34 35 0a |V3 AGL V445.|
0000000c