递归下降解析器中的语法检查
在解析表达式时,表达式必须严格符合解析器的语法规则。当输入表达式不符合这种规则时就会产生语法错误。通常情况下,语法错误都是由人为因素引起的,最常见的是打字错误。举例来说,对于本章介绍的解析器而言,下列表达式都不是有效的表达式:
10 ** 8
((10 – 5) * 9
/8
第一个表达式包含了两个连续的运算符,第二个表达式缺少一个右括号,第三个表达式的开头是一个除号。解析器中不允许以上任何一种情况出现。语法错误会导致解析器给出错误的解析结果,因此程序员必须尽量避免出现这种错误。
在这个解析器中,错误发生时会调用handleErr()方法。与其他类型的解析器不同,递归下降的方法使得语法检查更加简单,因为在大部分情况下,错误会发生在atom()、findVar()或者evalExp6()等方法中,这些方法的共同点是都对括号进行检查。
调用handleErr()将抛出ParserException异常,其中包含对错误的描述。Parser类本身并不捕捉这个异常,而是将其抛给调用代码。这样一来,解析器会因为发生错误而马上终止解析过程。当然,读者可以对这种方式进行修改以适应自己的需求。
例如,读者可以进一步扩充ParserException对象中所包含的信息。在当前的代码中,这个类仅仅存储一个描述错误的字符串。读者也可以增加错误代码本身,或者添加指向表达式字符串中错误发生点的索引,或者增加其他一些信息。
|