让 ANTLRWorks 自动处理空格

发布于 2024-12-02 18:49:10 字数 1018 浏览 1 评论 0原文

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

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

I have an ANTLR grammar like this:

grammar HelloGrammar1;

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

I want it to parse the following text: hello qwerty ;. It doesn work this way. If I change my string to helloqwerty;, everything is fine. I can also change grammar to:

grammar HelloGrammar2;

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

And in this case, hello qwerty ; works fine. Is it possible to make ANTLR skip whitespaces automatically? (i.e. - I want to make HelloGrammar1 work with hello qwerty ;)

Update

If it makes sense: I'm testing it in ANTLRWorks.

Update 2

Also tried this way:

grammar HelloGrammar;

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

Still doesn't work.

Update 3

I'm using "Interpreter" tab with "STATEMENT" rule selected.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

⊕婉儿 2024-12-09 18:49:10

我认为问题可能是您应该将 STATMENT (当前是词法分析器规则)更改为 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

I think the issue may be that you should change STATEMENT (currently a lexer rule) to statement (a parser rule)

grammar HelloGrammar;

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

In ANTLRWorks this accepts:

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

but does not accept:

helloqwerty;
helloqwerty ;
hello;
hello qwerty
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文