我是 Antlr 的新手,我已经使用 Antlr 3 定义了一个基本语法。语法编译并且 ANTLRWorks 生成 Parser 和 Lexer 代码没有任何问题。
语法如下:
grammar i;
@header {
package i;
}
module : 'Module1'| 'Module2';
object : 'I';
objectType : 'Name';
filters : EMPTY | 'WHERE' module;
table : module object objectType;
STRING : ('a'..'z'|'A'..'Z')+;
EMPTY : ' ';
问题是当我解释表解析器时,我得到了一个 MismatchedSetException。这是由于有 EMPTY。一旦我从语法中删除 EMPTY,解释就起作用了。我查看了 Antlr 网站和其他一些示例,空白空间是 ' '。我不知道该怎么办。我需要这个 EMPTY。
当它解释时,我得到以下异常:
Interpreting...
[11:02:14] problem matching token at 1:4 NoViableAltException(' '@[1:1: Tokens : ( T__4 | T__5 | T__6 | T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | T__15 );])
[11:02:14] problem matching token at 1:9 NoViableAltException(' '@[1:1: Tokens : ( T__4 | T__5 | T__6 | T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | T__15 );])
一旦我将 EMPTY 更改为以下内容:
EMPTY : '';
代替:
EMPTY : ' ';
它实际上解释了它。但是,我收到以下异常:
Interpreting...
[10:57:23] problem matching token at 1:4 NoViableAltException(' '@[1:1: Tokens : ( T__4 | T__5 | T__6 | T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | T__15 | T__16 );])
[10:57:23] problem matching token at 1:9 NoViableAltException(' '@[1:1: Tokens : ( T__4 | T__5 | T__6 | T__7 | T__8 | T__9 | T__10 | T__11 | T__12 | T__13 | T__14 | T__15 | T__16 );])
但是,ANLTWorks 仍会生成 Lexer 和 Parser 代码。
我希望你能帮忙。
编辑:
grammar i;
@header {
package i;
}
select : 'SELECT *' 'FROM' table filters';';
filters : EMPTY | 'WHERE' conditions;
conditions : STRING operator value;
operator : '=' | '!=';
true : 'true';
value : true;
STRING : ('a'..'z'|'A'..'Z')+;
EMPTY : ' ';