使ANTLRWorks自动处理空格

时间:2011-09-05 15:24:04

标签: antlr grammar antlrworks

我有这样的ANTLR语法:

grammar HelloGrammar1;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
STATEMENT : 'hello' ID ';' ;
WS  :   (' '|'\t'|'\r'|'\n')* ;

我希望它解析以下文字:hello qwerty ;。它不会这样工作。如果我将我的字符串更改为helloqwerty;,一切都很好。我也可以将语法改为:

grammar HelloGrammar2;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
STATEMENT : 'hello' WS ID WS ';' ;
WS  :   (' '|'\t'|'\r'|'\n')* ;

在这种情况下,hello qwerty ;工作正常。是否有可能使ANTLR自动跳过空格? (即 - 我想让HelloGrammar1与hello qwerty ;

一起使用

更新

如果有意义:我在ANTLRWorks中测试它。

更新2

也试过这种方式:

grammar HelloGrammar;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
STATEMENT : 'hello' ID ';' ;
WS  :   (' '|'\t'|'\r'|'\n') { $channel = HIDDEN; } ;

仍然无效。

更新3

我正在使用“Interpreter”标签,并选择了“STATEMENT”规则。

1 个答案:

答案 0 :(得分:2)

我认为问题可能是您应该将 STATEMENT (目前是词法规则)更改为语句(解析器规则)

grammar HelloGrammar;

statement : 'hello' ID ';' ;
ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
WS  :   (' '|'\t'|'\r'|'\n') { $channel = HIDDEN; } ;

在ANTLRWorks中,它接受:

hello qwerty;
hello   qwerty;
hello loki2302;
hello   qwerty  ;

但不接受:

helloqwerty;
helloqwerty ;
hello;
hello qwerty