我有这样的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”规则。
答案 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