1

我有这样的 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

我正在使用“解释器”选项卡并选择了“声明”规则。

4

1 回答 1

2

我认为问题可能是您应该将STATEMENT(当前是词法分析器规则)更改为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
于 2011-09-05T17:03:14.390 回答