为什么添加未使用的规则会更改ANTLR语法的输出? [英] Why adding an unused rule changes the output of an ANTLR grammar?

查看:0
本文介绍了为什么添加未使用的规则会更改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>)
  1. 为什么"a"和"e"不匹配?
  2. 为什么headword中包含‘Apple’开头的‘a’,而不包含‘e’?它们都被认为是"无关的输入"。
  3. 为什么添加未使用的解析器规则会更改语法行为?我对ANTLR可能工作方式的理解(相当不成熟且偏向于PROLOG)告诉我,不使用的解析器规则永远不会被求值,也不应该影响输出。
  4. 我在哪里可以获得有关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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆