一个语法分析器是一个决定其输入是否语法正确和决定其语法结构的程序.语法分析程序可以手机或由一个有效的语法结构描述自动生成.描述是以上下文无关文法描述.语法分析程序生成器可以被用于开发许多语言的语法分析器,由简单的桌面计算器到复杂的程序语言.
Yacc是一个由给定的上下文无关文法构造,可以根据语法规则分析输入的C语言程序的程序.Yacc由S.C.Johnson和其他一些贝尔实验室的人开发的.Yacc提供语义栈操作和规范的语义函数.一个Yacc的输入文件格式如下:
C and parser declarations
%%
Grammar reles and actions
%%
C subroutines
Yacc文件最开始的段包含一列语法分析器期望的记号(不同于其它单个字符)和指定文法开始符号.Yacc文件的这个段可以包含过程说明和运算符的结合性(优先级).这允许很大的灵活性选择一个上下文无关文法.加法和减法被声明为左结合和最底优级而乘方被声明为右结合和拥有最高优先级.
%start program
%token LET INTEGER IN
%token SKIP IF THEN ELSE END WHILE DO READ WRITE
%token NUMBER
%token IDENTIFIER
%left '-' '+'
%left '*' '/'
%right '^'
%%
Grammar rules and actions
%%
C subroutines
Yacc文件的第二个段包含一个语言的上下无关文法.产生式以分号隔开,BNF中的'::='记号被取代为':',而空产生式的左边是为空的,非终结符用小写字母书写.而多字符的终结符号则全为大写字母书写.注意由于文法中产生式分隔,所以expression文法得到简化.
C and parser declarations
%%
program : LET declarations IN commands END;
declarations : /*empty */
| INTEGER id_seq IDENTIFIER '.'
;
id_seq : /*empty*/
| id_seq IDENTIFIER ','
;
commands : /*empty*/
| commands command ';'
;
command: SKIP
| READ IDENTIFIER
| WRITE exp
| IDENTIFIER ASSGNOP exp
| IF exp THEN commands ELSE commands FI
| WHILE exp DO commands END
;
exp : NUMBER
| IDENTIFIER
| exp '<' exp
| exp '=' exp
| exp '>' exp
| exp '+' exp
| exp '-' exp
| exp '*' exp
| exp '/' exp
| exp '^' exp
| '(' exp ')'
;
%%
C subroutines
Yacc文件的段包含C代码.这里必须有一个main()函数去调用yyparse()函数(注:其实可以不用一定要,可以省).函数yyparse()是语法分析器的驱动函数.这里也必须有一个yyerror()函数用来报告语法分析阶段出错信息.作为一个简单例子,函数main()和yyerror()如下:
C and parser declarations
%%
Grammar rules and actions
%%
main( int argc,char *argv[] )
{ extern FILE *yyin;
++argv;--argc;
yyin = fopen(argv[0],"r");
yydebug = 1;
errors =0;
yyparse();
}
yyerror(char *s) /*Called by yyparse on error*/
{
printf("%s/n",s);
}
如上书写的语法分析程序虽然没有输出,但是语法分析树隐式地在语法分析阶段构造.当执行语法分析程序时,它构建了程序结构的中间表示.中间表示是基于产生式规则的右部.当一个右部被识别时,它将归约到产生式左部.当整个程序被归约到开始符号时语法分析结束.
用命令yacc -vd file.y(bisom -vd file.y)编译Yacc文件会生成两个文件,file.tab.h和file.tab.c.其中file.tab.h包含一列在词法分析器中定义的记号.文件file.tab.c定义语法分析器中的C函数yyparse()
Yacc是Unix操作系统的一个工具,而Bison是一个自由软件的产品.
关于如何使用Yacc/Bison的更多信息请见附录,参考Bison的操作手册,A.V.Aho和S.C.Johnson,Computing Surveys ,June 1974的论文 "Programming Utilities and Libraries LR Parsing" ,Charles Donnelly和Richard Stallman的"BISON the Yacc-compatible Parser Generator"