一般来说语言的语法都是无歧义的,歧义通常会被认为是升序设计上的bug
针对歧义问题,需重新组织语法,使得对于每个输入的词组,语法分析器都能够选择唯一匹配的备选分支
歧义问题在词法分析器和语法分析器中都会发生
antlr的解决办法是匹配在语法定义中最靠前的那条词法规则,即当一个词组符合多个备选分支时,选择所有匹配的备选分支中的第一条
关键字和标识符冲突是最常见的歧义问题,比如以下语法
rule :
BEGIN : 'begin'
ID : [a-z]+
关键字begin,它可以匹配以下两个规则,由于BEGIN:'begin'在上面,因此最终被匹配
词法分析器会匹配可能的最长字符串来生成一个词法符号,如beginer只能匹配[a-z]+,而不是'begin'+er,因此它匹配的是ID:[a-z]+
有时候语言本身就有歧义,因此无论如何修改语法也不会避免
语法分析器本身仅仅验证输入语句的合法性并建立一棵语法分析树