解析器生成器的使用与错误恢复
1. 解析器生成器概述
在处理复杂的语法解析任务时,手动构建LR(1)或LALR(1)解析表是一项繁琐且容易出错的工作。因此,人们开发了许多解析器生成器工具来自动化这个过程。其中,Yacc(“Yet another compiler - compiler”)是一个经典且广泛使用的解析器生成器,Bison和occs则是较新的实现。
1.1 Yacc规范结构
Yacc规范通常分为三个部分,由 %%
标记分隔:
1. 解析器声明 :包含终端符号、非终端符号等的列表。
2. 语法规则 :形式为 exp : exp PLUS exp { semantic action }
的产生式,其中 exp
是非终端符号, PLUS
是终端符号(标记),语义动作使用普通C语言编写,在解析器使用该规则进行归约时执行。
3. 程序 :是可用于前面部分嵌入的语义动作的普通C代码。
以下是一个Yacc规范的示例:
%{
int yylex(void);
void yyerror(char *s) { EM_error(EM_tokPos, "%s", s); }
%}
%token ID WHILE BEGIN END DO IF THEN ELSE SEMI ASSIGN
%start prog
%%
prog: stmli