📌  相关文章
📜  YACC(1)

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

YACC介绍

YACC是一种语法分析器生成器,可以从定义的语法规则生成处理输入数据的解析器。它是Unix操作系统下的一部分,与另一个工具LEX一起经常被称为“LEX / YACC”。 YACC最初由AT&T贝尔实验室的Stephen C. Johnson开发。

YACC如何工作

YACC使用LALR(1)技术生成解析器。使用YACC生成解析器的过程大致如下:

  1. 编写语法文件(.y文件),用Bison或Yacc编译器编译生成语法规则文件。

  2. 编写处理程序以将语法规则映射到解析器程序中。

  3. 使用编译器将处理程序和解析器程序合并到单个解析器程序中。

  4. 运行生成的解析器程序,它接受输入并由解析器执行语法解析。

YACC的应用

YACC可用于生成各种解析器,其中包括:

  1. 编译器:语法规则映射到产生代码的中间表示。

  2. 解释器:语法规则映射到可以执行的命令。

  3. 数据转换器:语法规则映射到数据格式转换器。

YACC的代码片段

以下是一个简单的YACC示例,使用语法规则来解析数学表达式:

%{
#include <stdio.h>
%}

%token NUMBER
%left '+' '-'
%left '*' '/'
%left '^'
%right UMINUS

%%

statement: exp { printf("Result: %d\n", $1); }
         ;

exp : exp '+' exp   { $$ = $1 + $3; }
    | exp '-' exp   { $$ = $1 - $3; }
    | exp '*' exp   { $$ = $1 * $3; }
    | exp '/' exp   { $$ = $1 / $3; }
    | exp '^' exp   { $$ = pow($1, $3); }
    | '-' exp %prec UMINUS  { $$ = -$2; }
    | '(' exp ')'   { $$ = $2; }
    | NUMBER        { $$ = $1; }
    ;

%%

int main()
{
    yyparse();
    return 0;
}

int yywrap()
{
    return 1;
}

yyerror(char* s)
{
    fprintf(stderr, "%s\n", s);
}

以上YACC程序可以处理形如"1+2*3"的输入,并输出正确的结果。