Yacc编写语法
如同Lex一样,一个Yacc程序也用双百分号分为三段。它们是:声明、语法规则和C代码。
C与Yacc的声明
C声明可能会定义动作中使用的类型和变量,以及宏。还可能包含头文件。每个Yacc声明段声明了终端符号和非终端符号的名称,还可能描述操作符优先级和针对不同符号的数据类型。lex一般返回这些标记,所有这些标记都必须在Yacc声明中说明。
例:文件解析声明
%{
#typedef char* string;
#define YYSTYPE string
%}
%token NAME EQ AGE
%%
Yacc语法规则
Yacc语法规则具有以下一般格式:
result:components {}
result是规则描述的非终端符号。components是根据规则放在一起的不同的终端和非终端符号。如果匹配特定序列的话Components后面可以跟要执行的动作。
param:NAME EQ NAME{printf("\tName:%s\tvalue(name):%s\n",$1,$3);}
|NAME EQ VALUE{printf("\tName:%s\tValue(value):%s\n",$1,$3)};
标记NAME的Lex代码是这样的:
char [A-Za-z]
name {char}+
%%
{name} {yylvl=strdup(yytext);
return NAME;
}
文件解析的语法