Antlr4简单标记失败

时间:2017-11-11 22:32:25

标签: antlr antlr4

我有以下语法来lex / parse一个字符串,我现在想要的是用空格标记:

grammar MyItems;
theseItems : item (SPACE item)* ;
item : FIELDTEXT+ ;
SPACE : ' ' ;
FIELDTEXT : ~[' ']  ;

输入:

V3 AGL V445

给我一​​个错误:

line 1:0 mismatched input 'V3' expecting FIELDTEXT

为什么这不给我一套3件物品?

1 个答案:

答案 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