ANTLR Decision 可以使用多种替代方案来匹配输入

发布于 2024-12-13 01:52:05 字数 331 浏览 0 评论 0原文

我有这个简单的语法:

expr: factor;

factor: atom (('*' ^ | '/'^) atom)*;

atom: INT
    | ':' expr;

INT: ('0'..'9')+

当我运行它时,它说:

决策可以使用多个替代项匹配输入,例如“*”1,2

决策可以使用多个替代项匹配输入,例如“/”1,2

我无法发现歧义。红色箭头如何指向? 任何帮助将不胜感激。

在此处输入图像描述

I have this simple grammer:

expr: factor;

factor: atom (('*' ^ | '/'^) atom)*;

atom: INT
    | ':' expr;

INT: ('0'..'9')+

when I run it it says :

Decision can match input such as '*' using multiple alternatives 1,2

Decision can match input such as '/' using multiple alternatives 1,2

I can't spot the ambiguity. How are the red arrows pointing ?
Any help would be appreciated.

enter image description here

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

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

发布评论

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

评论(1

落花浅忆 2024-12-20 01:52:05

假设您想要解析输入:

:3*4*:5*6

由语法生成的解析器可以将此输入匹配到以下解析树中:

enter image description这里

和:

在此处输入图像描述

(我省略了冒号以使树木更加清晰)

请注意,您看到的只是一个 警告。通过明确指示 ANTLR (('*' | '/')atom)* 需要贪婪地匹配,如下所示:

factor
  :  atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
  ;

解析器“知道”采用哪种替代方案,并且不会发出警告。

编辑

我使用 ANTLR 3.3 测试了语法,如下所示:

grammar T;

options {
  output=AST;
}

parse
  :  expr EOF!
  ;

expr
  :  factor
  ;

factor
  :  atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
  ;

atom
  :  INT
  |  ':'^ expr
  ;

INT : ('0'..'9')+;

然后从命令行:

java -cp antlr-3.3.jar org.antlr.Tool T.g

它不会产生任何警告(或错误)。

Let's say you want to parse the input:

:3*4*:5*6

The parser generated by your grammar could match this input into the following parse trees:

enter image description here

and:

enter image description here

(I omitted the colons to keep the trees more clear)

Note that what you see is just a warning. By specifically instructing ANTLR that (('*' | '/') atom)* needs to be matched greedily, like this:

factor
  :  atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
  ;

the parser "knows" which alternative to take, and no warning is emitted.

EDIT

I tested the grammar with ANTLR 3.3 as follows:

grammar T;

options {
  output=AST;
}

parse
  :  expr EOF!
  ;

expr
  :  factor
  ;

factor
  :  atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
  ;

atom
  :  INT
  |  ':'^ expr
  ;

INT : ('0'..'9')+;

And then from the command line:

java -cp antlr-3.3.jar org.antlr.Tool T.g

which does not produce any warning (or error).

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