基本要求:
①掌握语法分析方法。
②掌握使用算符优先分析法。
③完成语法分析程序的设计和实现。
④程序能完成对指定语言的语法分析。
重点及难点:熟悉算符优先分析等语法分析方法,掌握语法分析的一般过程。在此基础上完成基于算数表达式的语法分析程序的设计和调试运行。

一.递归下降分析器

在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下,我们就可能构造一个不带回溯的自上而下的分析程序,这个分析程序是由一组递归过程(或函数)组成的,每个过程(或函数)对应文法的一个非终结符。这样的一个分析程序称为递归下降分析器。
本次实验完成如下文法的递归下降分析器的设计。
文法G[E]为:

G[E]: E→E+T∣T
T→T*F∣F
F→(E)∣i

经过消去直接左递归后得到文法G’[E]为:
G’[E]: E→TE’
   E’→+TE’∣ε
   T→FT’
   T’→*FT∣ε
   F→(E) ∣i

//该文法对应的递归下降分析器如下:void match (token t){if (lookahead == t)lookahead = nexttoken;else error ( );}void E( ){T( );E'( );
}void E'( ){if (lookahead == '+'){match ('+');T( );E'( );}
}void T( ){F( );T'( );}void T'( ){if (lookahead =='*'){match ('*');F( );T'( );}}void F( ){if (lookahead == 'i')match ('i');else if (lookahead =='('){match ('(');E ( );if (lookahead ==')')match (')');else error ( );}else error ( );}

二.源代码

//递归下降分析器
#include<stdio.h>
#include<string>
char str[10];
int index=0;
void E();
void X();
void T();
void Y();
void F();
int main()
{int len;int m;printf("请输入测试的次数:");scanf("%d",&m);while(m--){printf("请输入表达式:");scanf("%s",str);len=strlen(str);str[len]='#';str[len+1]='\0';E();printf("正确语句!\n");strcpy(str,"");index=0;}return 0;
}
void E()
{T();X();
}
void X()
{if(str[index]=='+'){index++;T();X();}
}
void T()
{F();Y();
}
void Y()
{if(str[index]=='*'){index++;F();Y();}
}
void F()
{if(str[index]=='i'){index++;}else if (str[index]=='('){index++;E();if(str[index]==')'){index++;}else{printf("\n分析失败,错误语句!\n");exit (0);}}else{printf("分析失败,错误语句!\n");exit(0);}}

编译原理实验二【语法分析程序设计】相关推荐

  1. 编译原理 实验二 词法分析程序设计

    1. 实验内容 ● TINY语言的词法由TINY Syntax.ppt描述: ● TINY语言的词法分析器由TINY Scanner.rar的C语言代码实现: ● TINY+语言的词法由TINY+ S ...

  2. 编译原理实验二:赋值语句的语法分析程序设计

    编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...

  3. 编译原理--实验2 语法分析

    文章目录 前言 1.1实验目的 1.2 实验任务 1.3 实验内容 1.3.1 实验要求 1.3.2 输入格式 1.3.3 输出格式 1.3.4 样例 1.4 程序 1.4.1 程序流程图 1.4.2 ...

  4. 编译原理实验二:Bison

    编译原理实验二:Bison 实验要求 1.了解Bision基础知识,如何将文法产生式转换为Bison语句 2.阅读/src/common/SyntaxTree.c,对应头文件 /include/Syn ...

  5. 编译原理实验二(全部存储到数组再逐行验证语法版.....这种思路被老师否了,应该是验证一行扔掉一行才对)

    编译原理实验二(可能还有BUG,不确定继续找) 要大改一次23333,老师的意思是不能用数组存储,而是一边识别单词,然后识别完一行就判断一次语法 写实验二的时候找到的实验一的一个逻辑错误 改动了实验一 ...

  6. 编译原理实验二 macos系统 itoa方法报错解决方法

    编译原理实验二 生成符号表的前期准备中使用itoa函数报错问题 执行 gcc -o parser lex.yy.c parser.tab.c ast.c 显示: itoa 函数是一个广泛应用的,从非标 ...

  7. 编译原理实验三 语义分析程序设计与实现

    一.实验目的 在实现词法.语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法,并完成 ...

  8. 编译原理实验一 词法分析程序设计与实现

    一.实验目的 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词构成的序列的词法分析方法. 二.基本实验内容与要求 假定一种高级程序 ...

  9. 编译原理实验二:标识符的识别

    实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出所有的合法标识符. [输入]字符串. [输出]单词符号流,一行一个单词. [题目]设计一个程序,从任意字符串中识别出所有可视为C语言 ...

  10. 编译原理—实验二LL(1)语法分析(一)

    一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...

最新文章

  1. 你被科研方向和创新点困扰多久了?
  2. ubuntu18.04错误配置变量环境导致无法进入系统
  3. Android——android:gravity 和 android:layout_Gravity
  4. 使用ffmpeg视频切片并加密
  5. 常用的整数间的数制转换
  6. 根据java实体生成js实体_端午前福利!Java/Python实体书赠送
  7. android对象关系映射框架ormlite学习之单表操作
  8. doris同步作业配置参数修改和注意事项
  9. 论文阅读:Siam-RPN
  10. spring整体架构
  11. 史上最全的芯片封装介绍
  12. 如何有效提升留存率促进用户活跃?
  13. Android 获取手机Ram 和 Rom大小
  14. 教育知识与能力-第一章教育基础知识和基本原理
  15. 计算机网络学习-003
  16. 电影影院购票管理系统
  17. CodeForces 1K-1400R-1324D
  18. dmp格式怎么转换_如何生成转储(dmp)文件--工具篇
  19. EPLAN P8部件库 EPLAN P8部件库,包含低压电气 控制系统设计常用品牌型号,全部部件均为本人整理自己创建,可大大提高电气控制行业同仁的工作效率!
  20. 过年了!!年前最后一更,2017年总结

热门文章

  1. Origin2018-小白安装
  2. SQL中的内连接查询和外连接查询
  3. [读书笔记]职场动物进化手册
  4. 安卓webview开发简介
  5. ubuntu16.04查看opencv版本
  6. 人工智能AI学习教程
  7. cuda安装及百度云链接
  8. 社交电商 社群电商 源码下载
  9. 总结:86版五笔输入法
  10. QMC解码-某音乐解码