📅  最后修改于: 2023-12-03 15:35:48.363000             🧑  作者: Mango
YACC(Yet Another Compiler Compiler)是Unix系统下的自动语法分析工具之一,它可以根据语法规则自动地生成与分析相关的代码。在Unix系统下,YACC通常与LEX一同使用,LEX用来生成词法分析器,而YACC则用来生成语法分析器。在编写编译器、解释器以及各种语言处理工具时,YACC都是非常重要的工具。
YACC的主要优点包括:
YACC实现的是自上而下的语法分析,它将输入的规范文法转换成LL(1)文法,再使用解析器生成器生成解析器。解析器生成器使用输入的规范文法构建预测分析表,解析器根据表格将输入的源程序分析成语法树。
具体来说,对于每一个语法规则,YACC必须知道:
YACC的语法规则通常包括三个部分:
1.定义部分:YACC的源代码通常包括一组以%开头的定义,这些定义是可选的,但可以帮助YACC生成更好的代码。例如,可以使用%union定义不同类型的符号值。另外,还可以使用%token定义终结符和非终结符。
2.规则部分:YACC的规则以非终结符为左部,由终结符和非终结符组成的符号序列为右部。在规则中,使用$1、$2、$3等符号代表右部中的符号。
例如,下面是一个使用YACC来计算四则运算表达式的例子。
%{
#include<stdio.h>
#include<stdlib.h>
#define YYSTYPE int
int yylex();
int yyerror();
%}
%token NUM OP
%left '+' '-'
%left '*' '/'
%%
expr:expr '+' term
| expr '-' term
| term
;
term:term '*' factor
| term '/' factor
| factor
;
factor:NUM
| '(' expr ')' { $$ = $2; }
;
%%
int main() {
if(yyparse() == 0){
printf("success\n");
}
return 0;
}
int yyerror(){
printf("Parse Error\n");
return 0;
}
int yywrap(){
return 1;
}
int yylex(){
int c = getchar();
if(c == '+' || c == '-' || c == '*' || c == '/'){
return c;
}
if(c >= '0' && c <= '9'){
int num = c-'0';
while((c = getchar()) >= '0' && c <= '9'){
num = num*10 + c-'0';
}
ungetc(c, stdin);
yylval = num;
return NUM;
}
if(c == '\n' || c == '\r' || c == EOF){
return 0;
}
return c;
}
YACC是一个很强大的工具,它可以帮助程序员快速创建语法分析器。但是,对于初学者来说,可能需要花费一定的时间和精力来学习它的用法。如果您打算从事编译器这方面的开发工作,那么学会使用YACC是非常必要的。