📜  YACC简介(1)

📅  最后修改于: 2023-12-03 15:35:48.363000             🧑  作者: Mango

YACC简介

前言

YACC(Yet Another Compiler Compiler)是Unix系统下的自动语法分析工具之一,它可以根据语法规则自动地生成与分析相关的代码。在Unix系统下,YACC通常与LEX一同使用,LEX用来生成词法分析器,而YACC则用来生成语法分析器。在编写编译器、解释器以及各种语言处理工具时,YACC都是非常重要的工具。

YACC的优点

YACC的主要优点包括:

  • 生成的代码具有规范性和结构性,可以大大提高编译器的可维护性;
  • 可以节省编译器等语言处理工具的开发时间和维护时间;
  • 与LEX等其他工具组合更加高效。
YACC的工作原理

YACC实现的是自上而下的语法分析,它将输入的规范文法转换成LL(1)文法,再使用解析器生成器生成解析器。解析器生成器使用输入的规范文法构建预测分析表,解析器根据表格将输入的源程序分析成语法树。

具体来说,对于每一个语法规则,YACC必须知道:

  1. 如何匹配产生式的左边符号。
  2. 如何解析产生式右侧的符号序列,并将它们合并起来得到匹配的左侧符号。
YACC的语法规则

YACC的语法规则通常包括三个部分:

1.定义部分:YACC的源代码通常包括一组以%开头的定义,这些定义是可选的,但可以帮助YACC生成更好的代码。例如,可以使用%union定义不同类型的符号值。另外,还可以使用%token定义终结符和非终结符。

2.规则部分:YACC的规则以非终结符为左部,由终结符和非终结符组成的符号序列为右部。在规则中,使用$1、$2、$3等符号代表右部中的符号。

  1. C代码部分:用于定制生成的解析器,通常包括一些变量声明、结构体声明和函数定义等。

例如,下面是一个使用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是非常必要的。