`
xieyj
  • 浏览: 103243 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

yacc介绍

阅读更多

        在mysql源码中,解析sql在sql_yacc.yy中实现,这个文件是一个硕大的文件,用bison来转换为c文件。

        在《编译原理及实践》中有yacc介绍,编译原理是很深奥的科目,学好了对编程技术好很大的帮助,可惜当初没好好学,需要回炉一下。

        这里是从《编译原理及实践》的摘录。

        一个简单的算术表达式的计算器。calc.y,BNF文法如下:


 %{

#include <stdio.h>

#include <ctype.h>

%}

 

%token NUMBER

 

%%

 

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

                ;

exp : exp '+' term { $$ = $1 + $3 ;}

      | exp '-' term { $$ = $1 - $3 ;}

      | term { $$ = $1 ;}

      ;

term : term '*' factor { $$ = $1 * $3 ;}

        | factor { $$ = $1 ;}

        ;

factor : NUMBER { $$ = $1 ;}

          | '(' exp ')' { $$ = $2 ;} 

          ;

%%

 

main(){

         /*extern int yydebug ;    ------- 此处为debug显示yacc执行调用用

         yydebug = 1 ;*/

        return yyparse();

}

 

int yylex(void){           -------可以通过lex工具来进行词法分析,这里用手工实现

        int c ;

        while( (c = getchar()) == ' ');

        if( isdigit(c) ){

               ungetc(c, stdin);

               scanf("%d", &yylval);

               return (NUMBER);

        }

        if (c == '\n') return 0 ;      ------0表示输入结束,结束词法分析

        return (c) ;

}

 

int yyerror(char* s){

       fprintf(stderr,"%s\n",s);

       return 0 ;

}

       上面的yylex,可以通过lex来实现,这里为手工实现。

       同过main函数可以看出,执行yyparse,这个为yacc这类的工具产生的的方法,就是根据文法执行%%之间的用户定义的操作。

       每个在L A L R ( 1 )分析栈中的符号值都可通过使用以$开始的伪变量来引用。$ $代表刚才被识别出来的非终结符的值,也就是在文法规则左边的符号。伪变量$ 1、$ 2、$ 3等等都代表了文法规则右边的每个连续的符号。

       个人理解就是当文法匹配,执行{}里面的语句。

       执行一下看看效果,bison -y calc.y  gcc y.tab.c -o test ----y.tab.c为自动产生的c文件

       执行./test 


       程序已经可以跑了,当输入12+4回车时,结果已经出来了。

       把main函数的注释去掉,用bison -y -t 产生c文件,再用gcc y.tab.c -o test 编译

       执行./test 

显示如下:

Starting parse

Entering state 0

Reading a token: 12+3   ---此处为手工输入的值

Next token is token NUMBER ()

Shifting token NUMBER ()

Entering state 1

Reducing stack by rule 7 (line 19):   -----19行为factor : NUMBER { $$ = $1 ;}

   $1 = token NUMBER ()

-> $$ = nterm factor ()

Stack now 0

Entering state 6

Reducing stack by rule 6 (line 17):  -----17行为factor { $$ = $1 ;}

   $1 = nterm factor ()

-> $$ = nterm term ()

Stack now 0

Entering state 5

Reading a token: Next token is token '+' ()  ---解析到+号

Reducing stack by rule 4 (line 14):   ----14行为term { $$ = $1 ;}

   $1 = nterm term ()

-> $$ = nterm exp ()

Stack now 0

Entering state 4

Next token is token '+' ()

Shifting token '+' ()

Entering state 9

Reading a token: Next token is token NUMBER ()

Shifting token NUMBER ()

Entering state 1

Reducing stack by rule 7 (line 19):  -----19行为factor : NUMBER { $$ = $1 ;}

   $1 = token NUMBER ()

-> $$ = nterm factor ()

Stack now 0 4 9

Entering state 6

Reducing stack by rule 6 (line 17):  -----17行为factor { $$ = $1 ;}

   $1 = nterm factor ()

-> $$ = nterm term ()

Stack now 0 4 9

Entering state 13

Reading a token: Now at end of input.

Reducing stack by rule 2 (line 12):   ----12行为exp : exp '+' term { $$ = $1 + $3 ;}

   $1 = nterm exp ()

   $2 = token '+' ()

   $3 = nterm term ()

-> $$ = nterm exp ()

Stack now 0

Entering state 4

Now at end of input.

Reducing stack by rule 1 (line 10): ----10行为command : exp { printf("%d\n", $1);}

   $1 = nterm exp ()

15

-> $$ = nterm command ()

Stack now 0

Entering state 3

Now at end of input.

Stack now 0 3

Cleanup: popping nterm command ()

      yacc这东西还挺神奇,java也有个javacc,也能实现同样的功能,amoeba中有用到。

  • 大小: 13.4 KB
  • 大小: 2.7 KB
分享到:
评论

相关推荐

    yacc&flex的介绍文档

    在Yacc的理论部分,介绍了如何通过编写语法规则来描述语言的句法结构,以及如何将这些规则应用于源代码解析中。实践部分则进一步演示了如何使用Yacc来构建一个语法分析器,并处理语言中的各种结构,如控制语句和...

    windows 下yacc lex

    下面将详细介绍这两个工具以及如何在Visual Studio 6(VS6)平台上使用它们。 **Yacc** 是一个基于LALR(1)算法的解析器生成器。它接受输入文件,通常是扩展名为`.y`的Yacc语法文件,该文件定义了语言的句法规则。...

    lex与yacc.pdf

    本文档将详细介绍lex和yacc的基本概念、使用方法和应用场景。 Lex是词法分析器的生成器,能够将输入拆分成有意义的单元,称为标记(Token)。Lex使用一系列对可能标记的描述,产生一个能识别那些标记的C例程,称为...

    lex yacc的介绍文档和工具 学习编译原理不容错过

    标题中的"lex yacc"是两个经典的工具,它们在编译原理领域中扮演着重要的角色。"lex"(也称为flex)是一个用于生成词法分析器(词法扫描器)的工具,它能将源代码中的字符流转换为有意义的符号序列,也就是我们常说...

    完整介绍Lex和Yacc Windows 上的使用

    完整介绍Lex和Yacc Windows 上的使用 及工具的按装, 及环境变量的设置, GNU Bison实际上是使用最广泛的Yacc-like分析器生成器,使用它可以生成解释器,编译器,协议实现等多种程序. 它不但与Yacc兼容还具有许多Yacc不...

    lex-yacc或flex-bison的介绍

    lex-yacc或flex-bison的介绍 lex-yacc 或 flex-bison 是一种常用的文本分析工具,在 UNIX 系统中广泛应用于构建分析器、解析器和编译器。通过本文,我们将研究使用 lex/flex 和 yacc/bison 工具构建分析器所需的...

    编译原理 lex 和 yacc

    本文将通过一个具体的示例,介绍如何使用Lex(词法分析器生成器)和Yacc(语法分析器生成器)来构建一个简单的编译器前端。本示例提供了一个包含Lex和Yacc实现源码的课程设计案例。 #### 二、Lex简介 Lex是一种用于...

    Lex和Yacc简明教程

    Lex和Yacc简明教程 介绍基本lex和yacc的使用方法

    计算机专业课讲义-编译原理

    编译原理概述 介绍PL/0编译程序 ...Yacc介绍,布置PP2 习题课 语法分析方法比较 语法制导翻译,布置PP3 语法制导翻译 运行时存储组织 运行时存储组织 代码优化, 布置PP4 代码生成 实践题目总结答辩

    lex+yacc+gcc

    本篇文章将详细介绍这三个工具的功能、安装过程以及如何配置它们,以帮助开发者构建和解析复杂的程序。 首先,`lex`(也称为`flex`)是一个词法分析器生成器,它的主要任务是根据用户定义的规则从源代码中识别出一...

    \lex&yacc

    《lex&yacc》这本书是编译原理领域中的一本经典读物,它深入浅出地介绍了如何使用lex和yacc这两个工具进行编译器构造。lex(也称为flex)和yacc(也称为bison)是两种强大的开源工具,分别用于词法分析和语法分析,...

    lex_yacc教程

    在深入探讨`lex`和`yacc`之前,我们先简要介绍这两个工具的基本概念及其在软件开发中的应用。 **1.1 什么是`lex`和`yacc`** `lex`(也称为`Flex`)是一种词法分析器生成器,它能将输入的源代码转换为一系列的标记...

    lex&yacc语言解析

    它详细介绍了如何使用这两个工具,以及如何编写词法分析器和语法分析器规格文件。 通过阅读这本书和实践这些源代码,你可以深入理解如何利用Lex和Yacc构建解析器,包括如何定义词法规则,如何编写语法规则,以及...

    Lex与Yacc语法规则及其使用

    本文将详细介绍Lex和Yacc的基本概念、语法规则以及使用方法。 #### 二、Lex简介 **Lex**,全称Lexical Analyzer Generator(词法分析器生成器),是一种用于生成词法分析器的工具。它可以根据预定义的规则识别输入...

    Lex和Yacc的相关文档

    本文档旨在全面介绍Lex和Yacc的基础知识及其实际应用,为读者提供一套完整的从入门到精通的学习资料。 #### 二、Lex和Yacc简介 **Lex** 是一个用于生成词法分析器的工具,主要负责识别输入流中的词汇单位(如关键字...

    LexAndYacc入门教程源代码

    5. **实践应用**:可能会介绍如何将Lex和Yacc应用于实际项目,比如自定义脚本语言的解析、数据格式转换等。 在学习这个教程时,你需要理解以下关键点: - **词法规则**:定义词法单元的正则表达式,以及每个匹配项...

    lex&yacc英文第二版

    这本书将详细介绍如何利用lex编写高效的词法分析器,并通过实例帮助读者掌握其用法。 yacc,全名是Yet Another Compiler-Compiler,是一个语法分析器生成器。语法分析器的任务是根据词法分析器输出的符号序列,依据...

    lexyacc.pdf

    ### Lex和Yacc在词法与语法分析中的应用 #### 一、Lex和Yacc简介 **Lex** 和 **Yacc** 是两个广泛应用于构建词法分析器和语法分析器的强大工具,尤其适用于编译器的设计与开发。它们分别对应于词法分析(识别源...

    lex_yacc简明教程

    ### lex_yacc简明教程 ...通过上述介绍,我们可以看出Lex和Yacc在编译器设计中的重要性。它们不仅简化了词法和语法分析的过程,而且还提高了编译器的开发效率。对于学习编译原理的人来说,掌握这两种工具是非常有益的。

    YACC语言00.zip_yacc_yacc calculator

    `11.txt`可能包含了计算器的YACC源代码,而`www.pudn.com.txt`可能是一个链接到更多YACC资料的网址,或者是该计算器项目的详细介绍。 使用YACC编写这样的计算器有助于理解编译原理和解析技术,同时提供了一个实际的...

Global site tag (gtag.js) - Google Analytics