为什么这个 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' ;
鉴于上面的语法,我认为下面的推导是可能的......
start
→ s
→ '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 条规则创建标记:
- 尝试为规则匹配尽可能多的字符
- 当 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';
使用 ANTLR v4.9.3,我创建了以下语法......
grammar G ;
start : s EOF ;
s : 'ba' a b ;
a : 'b' ;
b : 'a' ;
鉴于上面的语法,我认为下面的推导是可能的......
start
→s
→'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 条规则创建标记:
- 尝试为规则匹配尽可能多的字符
- 当 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';