gacc命令的选项 -t 编译实时debug代喝.实时debug代码总是被yacc生 成条件编译代码缺省时,这些代码不会被编译.是否被 编译取决于预处理常量YYDEBUG.若YYDEBUG具有 非零值,则debug代鸡被included.否则,not be included. 不含debug代喝的可执行代码的程序比含有debug代码 的程序小且速度较快 -b file_prefix用file_prefix替换输出文件的前缀y.例如, y.tab.c,y.output被相应地替换为file prefix,.tab.c和 file_prefix.output. -p sym_prefix用sym_prefix取代程序中所有以yy为前缀 的量如vyparseO,ylexO,yerror0,ywal,yychar, ydebug等
编译实时 .实时 总是被 生 成条件编译代码.缺省时,这些代码不会被编译. 是否被 编译取决于预处理常量 .若 具有 非零值,则 被 .否则, . 不含 的可执行代码的程序比含有 的程序小且速度较快. 用 替换输出文件的前缀y.例如, y.tab.c,y.output被相应地替换为 和 . 用 取代程序中所有以 为前缀 的量 .如 等
YSP文件的结钩 一个完整的YSP文件由说明、 我们以一个简单的台式计算 规则、程序三个部分组成, 器中的处理程序的自动生成 各部分之间以双百分号 为例,说明怎样编写YSP文件 “%%"隔开 ◆ 该计算器的功能为:读入一 [院明部分] 行算术表达式,然后计算并 %% 打印它的值 规则部 ◆算术表达式的文法如下: [%% Expr→Expr+Term Term 灌序邦女] Term Term Factor Factor 其中,用方括号括起来的说 Factor→(Expr)I digit 明部分和程序部分可以空缺, ◆其中,终结符digit是0-9中的 但规则都兮则是必需的 任何一个数字
文件的 u 一个完整的 文件由 三个部分组成, 各部分之间以 “ ”隔开 u u 其中,用方括号括起来的说 明部分和程序部分可以空缺, 但 则是必需的 u 我们以一个 中的处理程序的自动生成 为例,说明怎样编写 文件 u 该计算器的功能为:读入一 行算术表达式,然后计算并 打印它的值 u 算 术 表 达 式 的 文 法 如 下 : Expr → Expr + Term | Term Term → Term * Factor | Factor Factor → ( Expr ) | digit u 其中,终结符 是 中的 任何一个数字
YSP文件的例子 %{/*说明部分*/ /*Term=Term*Factor*/ yylval=c-'0'; #include <stdio.h> I F a c to r return digit; #include <ctype.h> /*Term=Factor*/; %} Factor:'(Expr ) return c; %token digit 300 {$$=$2;} } %%/*规则部分*/ /*Factor=Expr*/ void yyerrort(O/*出 Li n e:E x p r'\n digit 错处理程序*/ printf("%d\n",$1);}; /*Factor=digit*/; prinft("Syntax /*打印表达式值*/ %%/*程序部分*/ error\n");} Expr Expr '+Termint yylex(void void main() {$$=$1+$3;*词法分析程序*/ {yyparse();/*调 /*Expr=Expr+Term*/ int c=getchar(; 用语法分析程序*/ |Term /*读入一个字符*/ /*Expr=Term*/ if(isdigit(c)) Term:Term'*'Factor /*判别c是否为数字*/ {$$=$1*$3;}
YSP文件的例子 %{/*说明部分*/ %} %token digit 300 %% /*规则部分*/ L i n e : E x p r ' \ n ’ {printf("%d\n" ,$1);} ; /*打印表达式值*/ Expr :Expr '+' Term { $ $ = $ 1 + $ 3 ; } /*Expr=Expr+Term*/ |Term ; /*Expr=Term*/ Term:Term'*' Factor {$$=$1*$3;} /*Term=Term*Factor*/ | F a c t o r /*Term=Factor*/; Factor:'(' Expr ')' {$$=$2;} /*Factor=Expr*/ |digit /*Factor=digit*/ ; %%/*程序部分*/ int yylex(void ) {/*词法分析程序*/ int c=getchar(); /*读入一个字符*/ if(isdigit(c)) /*判别c是否为数字*/ { yylval=c-'0'; return digit; } return c; } void yyerror()/*出 错处理程序*/ { prinft("Syntax error\n");} void main() { yyparse();/*调 用语法分析程序*/ }