【发布时间】:2012-11-22 10:39:40
【问题描述】:
我是 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 : ' ';
问题是,当我解释表 Parser 时,我得到了 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 : ' ';
【问题讨论】:
-
我怀疑您是否需要显式捕获空格,但如果没有更好地了解其用法,我无法确定。您能否举例说明您计划如何使用
filters规则?例如,如果您想使用WHERE关键字,输入会是什么样子?现在它没有连接到另一个规则,所以一个例子会有所帮助。 -
好吧,我无法提供完整的细节。以上只是一个例子。我正在为我的公司开发语法,需求很大。我无法提供任何信息。你能帮忙吗?假设,需要空格。
-
如上所述,如果没有 EMPTY,这个 NoViableAltException 仍然会发生。
-
当我想到一个名为
EMPTY的规则时,我想到的是filters: | 'WHERE' module;(规则filters满足第一个替代方案中的“空”输入)而不是filters: ' ' | 'WHERE' module;'(a第一个 alt 的单个空格)。只要您明确匹配空格(即,您没有跳过它),就必须在关键字和其他任何地方之间考虑它,所以我对那个 EMPTY 规则怒目而视。 ;) -
EMPTY 只是一个空白空间。所以我想做的是:当用户什么都不输入时,语法接受它。