用YACC工具生成算术表达式的语法和语义分析器

实验二 用YACC工具生成算术表达式的语法和语义分析器(如果喜欢麻烦点个赞哦!!!)

1、实验目的:

用YACC工具生成算术表达式的语法和语义分析器

2、描述用YACC工具进行语法分析的原理

Yacc 全称 Yet Another Compiler Compiler
Yacc是一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。
Yacc的输入是巴科斯范式(BNF)表达的语法规则以及语法规约的处理代码,Yacc输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。
Yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。

3、测试 4 + 4.5 - (34/(8*3±3))的结果

运行结果:
在这里插入图片描述

4、根据以下要求,给出实验方案

归约输出:

在这里插入图片描述

显示LALR算法分析表:

运行bison的时候,需要给bison一个语法文件作为其输入。bison的输出是一个分析这个语法文件描述的语言的C源代码文件。这个文件叫做bison分析器。bison工具是一个以bison分析器作输出的程序。这个bison分析器应是你程序的一部分。bison分析器的工作是依照语法规则组合记号–例如,将标识符和操作符构建成表达式。在组合的过程中它还要执行相应的语法规定的动作。
记号是来源于称为词法分析器的函数。你必须以某种形式提供词法分析器。bison分析器每当需要一个新的记号的时候就会调用词法分析器1.bison分析器并不知道记号中的东西是什么。,但bison并不依靠这个。

使用 Bison 的流程
1. 创建语言描述文件 (.y 文件)
2. 编写词法分析器函数 yylex()
3. 编写错误报告函数 yyerror()
4. 在 main() 中调用分析器函数 yyparse()
5. 执行 bison -d,由 .y 文件 产生 .tab.c 和 .tab.h 文件
6. 执行 gcc,把 .tab.c 文件编译和链接成可执行程序

5、进行实验,对实验过程进行描述

本次实验是依次实现词法分析和语法分析的过程,词法分析的内容与第一次实验类似,对于数字和其他类型的字符进行识别,分别返回对应的数据类型,这个过程相对来说是比较简单的,由于有特定的词法分析过程的格式,代码的编写还是可以接受。语法分析的过程则是给出文法以及相应的语义动作,代码的编写相对复杂。
首先,将老师所给的文件放到自己的文件夹下,然后编写mylex.l文件和myyacc.y文件,在dos下切换到本目录下,先用flex mylex.l生成lex.yy.c文件,再用命令bison -d myyacc.y生成myyacc.tab.c文件和myyacc.tab.h文件加入到工程中,再编译并连接生成可执行文件。最后测试程序的正确性,在debug目录下创建一个测试文件test.txt将测试片段放入其中,然后在dos界面运行程序,知道产生正确的结果,实验就完成了。

6、程序代码

在这里插入图片描述
在这里插入图片描述

7、实验结论

其实这个实验并不难,不过很容易出错。在按照文法产生式编写.y文件时,只要不注意写错,或者在编译的无法生成.c文件,或者生成.c文件后在项目编译时生成一大堆的错误。在理论课上学习了yacc进行语法分析的原理,这次通过实验观察yacc的移入归约情况可以说是对课本知识的复习,收获很多。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Yacc(Bison)是一种工具,用于生成语法分析和翻译。它可以根据给定的语法规则生成语法分析,然后将输入的源代码解析成语法树。接着,可以使用翻译语法树转换为目标代码或其他形式的输出。使用Yacc(Bison)可以简化语法分析和翻译的开发过程,提高开发效率。 ### 回答2: yacc是Unix操作系统中常用的语法分析生成工具,它可以生成C语言代码并用于编译程序的语法分析部分。通过定义语法规则,yacc可以自动生成语法分析,并能够将输入的语句分解成各个语法单元,进而处理语法分析中涉及到的语言结构。 为了生成语法分析,我们需要先定义好输入语言的文法规则。文法规则定义了语言的语法结构,可以被翻译所使用。文法规则通常使用Backus-Naur范式(BNF)进行描述,每个产生式规则由非终结符(非语言本身的标识符或变量)和终结符(语言单词或标点等)组成。 接下来,我们将定义输入语句所对应的语法结构。例如,假设我们定义了一种简单的程序语言,它包含变量定义、表达式计算、赋值操作等语言结构。我们可以使用BNF规则来描述该语言的语法结构: 1.程序由多行语句组成 程序 = 语句 | 程序 语句 2.变量定义语句 语句 = 变量类型 变量名 ';' 3.表达式计算语句 语句 = 表达式 ';' 4.赋值语句 语句 = 变量名 '=' 表达式 ';' 其中,变量名、变量类型、表达式等都被定义成了非终结符。 接下来,我们需要利用yacc将该BNF规则转换成C语言代码。yacc会将规则转换为执行序列,并通过该序列来解析输入语句。yacc生成的代码包含以下部分: 1.定义语法规则 我们可以通过定义规则来告诉yacc需要如何将输入语句分解成各个语法单元。 2.生成各个语法单元的代码 yacc可以自动为每个语法单元生成相应的代码。 3.定义语法分析 yacc可以将所有语法单元的生成代码组合成一个语法分析。该语法分析可以通过输入文本文件和调用词法分析的过程来识别输入的语句并生成相应的输出。 最后,我们需要添加一些错误处理和异常处理机制,以使得生成语法分析可以正确地处理各种异常情况。 总之,使用yacc可以很方便地生成语法分析。它可以自动生成代码,并且可以处理各种异常情况。对于需要处理大量输入文本的应用程序来说,使用yacc可以大幅提高开发效率。 ### 回答3: yacc(Yet Another Compiler Compiler)是一个生成语法分析和解析工具,它可以将输入的文本转换成抽象语法树,然后通过程序来对其进行操作。通过yacc,可以方便地生成自定义的编程语言、编译工具。 开发一个yacc生成语法分析和翻译需要以下步骤: 1. 定义语法规则 首先需要定义所开发的语言的语法规则,包括终结符和非终结符的定义,以及它们之间的关系。例如,可以使用BNF(Backus-Naur形式)表示法来定义语法规则,这是一种常用的表示语言语法的形式。 2. 编写yacc源代码 编写yacc源代码,即定义yacc文件,包括语法规则和翻译规则。语法规则用来描述输入文本的语法结构,而翻译规则则用来将输入的文本转换为目标代码或解释执行。 3. 编写lex代码 在yacc文件中,还需要将输入的文本进行词法分析,即将输入的字符流转换为词法单元(token)。这一过程通常需要使用lex工具,在lex文件中定义词法规则,并将识别出的单词输出到yacc程序中。 4. 编译和运行 将yacc和lex源代码编译成可执行文件,然后运行生成的编译和解释。在运行时,输入需要分析的源代码,编译和解释会根据定义的语法规则进行解析,并输出结果。 总的来说,使用yacc生成语法分析和翻译的过程需要熟悉语言的语法规则和编译原理,以及yacc和lex工具的使用。针对具体的需求,需要根据语言的特点和应用场景来进行设计,最终生成符合要求的编译或解释

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值