为什么这个 ANTLR 文法不导出字符串 `baba`?

Why doesn't this ANTLR grammar derive the string `baba`?


使用 ANTLR v4.9.3,我创建了以下语法......

grammar G ;
start : s EOF ;
s : 'ba' a b ;
a : 'b' ;
b : 'a' ;

鉴于上面的语法,我认为下面的推导是可能的......

starts'ba' a b'ba' 'b' b'ba' 'b' 'a' = 'baba'

但是,我的 Java 测试程序指示在尝试解析字符串 baba.

时出现语法错误

字符串 baba 不应该是语法 G 生成的语言吗?


虽然 conclusion/answer 已经在评论中,这里有一个答案更详细地解释了它。

在解析器规则('ba''a''b')中定义文字标记时,ANTLR 隐式创建以下语法:

grammar G ;
start : s EOF ;
s : T__0 a b ;
a : T__1 ;
b : T__2 ;

T__0 : 'ba';
T__1 : 'b';
T__2 : 'a';

现在,当词法分析器获得输入 "baba" 时,它将创建 2 个 T__0 标记。词法分析器不受解析器试图匹配的任何内容的驱动。它独立于解析器工作。词法分析器按照以下 2 条规则创建标记:

  1. 尝试为规则匹配尽可能多的字符
  2. 当 2 个(或更多)词法分析器规则匹配相同的字符时,让第一个定义的“赢”

由于规则 1,显然创建了 2 T__0 个令牌。

正如您在评论中提到的那样,删除 'ba' 标记(并使用 'b' 后跟 'a')将解决问题:

grammar G ;
start : s EOF ;
s : 'b' 'a' a b ;
a : 'b' ;
b : 'a' ;

这才是真正的语法:

grammar G ;
start : s EOF ;
s : T__0 T__1 a b ;
a : T__0 ;
b : T__1 ;

T__0 : 'b';
T__1 : 'a';