为什么添加未使用的规则会更改ANTLR语法的输出? [英] Why adding an unused rule changes the output of an ANTLR grammar?
本文介绍了为什么添加未使用的规则会更改ANTLR语法的输出?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
文件Hello.g4:
grammar Hello;
entry
: headword EOF
;
headword
: LETTER (LETTER)*
;
LETTER : [a-zA-Z] ;
上述语法与abc.txt:
文件中的输入apple
匹配
apple
C:Codeantlrhello>antlr4 Hello.g4 -encoding utf8
C:Codeantlrhello>javac Hello*.java
C:Codeantlrhello>type abc.txt | java org.antlr.v4.gui.TestRig Hello entry -tree -encoding utf8
(entry (headword a p p l e) <EOF>)
到目前为止一切顺利。现在,如果我在Hello.g4的末尾添加以下内容:
unused_rule
: 'a'
| 'b'
| 'c'
| 'd'
| 'e'
| 'f'
;
结果出乎意料:
C:Codeantlrhello>type abc.txt | java org.antlr.v4.gui.TestRig Hello entry -tree -encoding utf8
line 1:0 extraneous input 'a' expecting LETTER
line 1:4 extraneous input 'e' expecting <EOF>
(entry (headword a p p l) e <EOF>)
- 为什么"a"和"e"不匹配?
- 为什么
headword
中包含‘Apple’开头的‘a’,而不包含‘e’?它们都被认为是"无关的输入"。 - 为什么添加未使用的解析器规则会更改语法行为?我对ANTLR可能工作方式的理解(相当不成熟且偏向于PROLOG)告诉我,不使用的解析器规则永远不会被求值,也不应该影响输出。
- 我在哪里可以获得有关ANTLR如何工作的(免费)信息,即如何评估规则、顺序、规则/备选方案的优先级?官方文档(例如Parser Rules)更关注语法,而不是语法规则的运行时评估。
Nb.我看到过关于词法分析器规则的this非常类似的问题。我的是关于未使用的解析器规则。
推荐答案
在解析器规则中使用文字标记:
unused_rule
: 'a'
| 'b'
| 'c'
| 'd'
| 'e'
| 'f'
;
导致ANTLR创建以下词法分析器规则:
T_1 : 'a';
T_2 : 'b';
T_3 : 'c';
T_4 : 'd';
T_5 : 'e';
T_6 : 'f';
LETTER : [a-zA-Z] ;
这意味着字符a..f
永远不会变成LETTER
。
如果要在其他规则中使用某些字符,如a..f
,但也希望它们是LETTER
,请执行以下操作:
headword
: letter+
;
letter
: A
| B
| C
| D
| E
| F
| LETTER
;
A : 'a';
B : 'b';
C : 'c';
D : 'd';
E : 'e';
F : 'f';
LETTER : [a-zA-Z];
这篇关于为什么添加未使用的规则会更改ANTLR语法的输出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文