编译原理递归下降分析器(语法分析器)(C/C++)

2023-11-10

37b4d51e2b9d477a9cadfe76ec374db6.jpg

#include<stdio.h>

#include<string.h>

char lookahead;

char token[80];\\存储字符串

char ch,t;

int p=0;

int flat=1;\\标志位

void G();

void T();

void S();

void F();//函数声明

void match(char t)//匹配函数

{

       if(lookahead==t)

  {

      lookahead=token[++p];

  }

     else printf("匹配不正确") ;

}

void E()

{

     printf("E=>TG ");

     T();

     G();

}

void G()

{

       if(lookahead=='+')

{

printf(" G=>+TG");

     match('+');

     T();

     G();

}

else if (lookahead=='-')

{

      printf(" G=>-TG ");

      match('-');

      T();

      G();

}

    else printf(" G=>ε");

}

void T()

{

     printf(" T=>FS");

     F();

     S();

}

void S()

{

      if(lookahead=='*')

{

printf(" S=>*FS");

match('*');

F();

S();

}

else if(lookahead=='/')

{

printf(" S=>/FS");

match('/');

F();

S();

}

else printf(" S=>ε");

}

void F()

{

if(lookahead=='i')

{ printf(" F=>i ");

match('i');

}

else if(lookahead=='(')

{

printf(" F=>(E)");

match('(');

E();

if(lookahead==')')

{ match(')');

}

else

{ flat=0; }

}

else

{ flat=0; }

}

int main()

{

int pd=1;

int r=0;

char ch;

printf("请输入以#结束的符号串(包括+ - * / ( ) i #):");

do{

ch=getchar();

token[r++]=ch;

}while(ch!='#');

lookahead=token[0];

E();

printf("\n");

if(pd==flat&&lookahead=='#')

{

printf("输出结果:");

printf("%s",token);

printf("为合法符号串\n");

}

else {

printf("输出结果:");

printf("非法的符号串\n");

}

实验总结:

1.对于嵌套调用函数必须在函数前进行函数声明

2.递归下降分析法和LL(1)文法都必须消除文法二义性,消除左递归,提公共公左因子

3.最重要的是lookahead=token[0];E();调用且只调用一次文法开始符,切勿循环调用

4.错误可以用一个标志位解决,首先可以将flat定义为1,然后如果错了将flat置为0,最后通过if(pd==flat&&lookahead=='#')判断分析是否正确。(解释为什么要判断lookahead是否等于‘#’?如果最后分析错误,那么lookahead就不会指道‘#’。例如字符串‘i)#’,lookahead首先指向i,

E->TG,T->FS,F->i(匹配成功,lookahead指向下一个,既‘)’),S->ε,G->ε(G要么匹配加要么匹配减,而lookahead指向右括号,所以执行else,返回ε,最后函数调用完lookahead值为右括号,并非#,所以以lookahead最后等于#作为判断是否成功的其中一个条件))

5.特别注意有左右括号的写法有俩个错误输出,第一如果匹配不上右有括号;一个是既匹配不上i,又匹配不上左括号

if(lookahead=='(')

{

match('(');

E();

if(lookahead==')')

{ match(')');

}

else

{ flat=0; }

}

else

{ flat=0; }

}

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译原理递归下降分析器(语法分析器)(C/C++) 的相关文章

  • 用c语言编写出三底模型

    以下是一个用C语言实现三底模型的示例代码 这个程序通过循环遍历输入的股票数据 判断是否出现三底形态 如果是 则输出买入信号 否则输出卖出信号 c语言 include
  • Matlab绘图保存为.fig格式以使用,及.fig文件的加载与数据读取

    1 使用背景 fig文件作为Matlab中的图形文件 其实原始数据是会存储在figure对象中的 其不仅仅只是一张图片 论文写作时 直接将plot运行的结果进行截图粘贴时 图片的分辨率不够导致曲线及图片上的文字模糊 plot运行得到的坐标轴

随机推荐

  • wireshark实战之局域网抓包分析

    Wireshark 它是一款本地监听数据的大杀器 弊端是只能监听本地的数据 有什么办法可以让局域网中的流量都从本机走呢 第一ARP嗅探 劫持网关 再本地抓包 第二交换机镜像端口 在路由或者交换机处设置 复制一份数据到指定机子端口 第三Ap一
  • mysql 设置男女约束

    参考 MySQL数据库创建sex字段设置男女约束 这样写好像会因为汉字而报错 Invalid default value for sex CREATE TABLE t user id INT 11 NOT NULL AUTO INCREME
  • js上传视频获取第一帧截图

    1 获取视频的url 如果是file文件 先转成url file转url方法 function getFileURL file var url null if window createObjectURL undefined basic u
  • Harbor2.1私服的搭建

    Harbor2 1私服的搭建 基础环境的搭建 替换国内yum源 curl o etc yum repos d CentOS Base repo http mirrors aliyun com repo Centos 7 repo yum m
  • CTF-Web小白入门篇超详细——了解CTF-Web基本题型及其解题方法 总结——包含例题的详细题解

    很久之前经过一次比赛的打击 决定不能只是一直盲目的刷基础题 应该加快进度 从各种基本题型开始下手 每种题型都应该去找题目刷一刷 并做好总结 于是我去搜了一些总结的文章 便找到了一篇很好的 觉得看完后有点豁然开朗的感觉 所以本文是在该文章的基
  • Th4.6:模板全特化、偏特化(局部特化)详述

    本小节回顾的知识点分别是模板全特化 偏特化 局部特化 今天总结的知识分为以下4个大点 1 特化与泛化 2 类模板特化 2 1 类模板全特化 a 常规全特化 b 特化模板类的成员函数而不是类模板本身 2 2 类模板偏特化 局部特化 a 从模板
  • IP175G参考资料和引脚图

    特性 5端口嵌入式10 100PHY开关控制器 支持5100BaseTX IP175G 或4100BaseTX 85nm 技术 只需要3 3V单通道 1FX IP175GH 支持1KMAC地址表项 448K位包缓冲存储器 100MPHY支持
  • 【Vue】— nextTick原理

    文章目录 前言 发现问题 异步更新 nextTick源码分析 总结 补充 MutationObserver 前言 在做项目的时候 我们经常会用到nextTick 简单的理解就是它就是一个setTimeout函数 将函数放到异步后去处理 将它
  • 1.4软件测试原则与策略

    一 软件测试原则 1 尽早进行 最好在需求阶段就开始介入 因为最严重的错误不外乎是系统满足不了用户的需求 2 开发人员应该避免检查自己的程序 软件测试应该由第三方人员 测试人员 来负责 3 设计测试用例时应该考虑到合法和不合法的输入 例如
  • WIN10超级终端下载链接及使用教程

    地址见文末 1 直接运行 随便命名 2选择连接的COM口 3 选择对应的波特率 我的是115200 数据流控制选择无 4点击应用 给开发板上电即可 链接一 https pan baidu com s 1iDf16H8BsZ53lOVqmQO
  • Java将svg转化成png_java – 如何将SVG转换成PNG

    我尝试将svg转换成PNG svg文档来自作为输入流的服务器 首先 我将svg流转换成字节数组 byte streamBytes IOUtils toByteArray svgStream 然后使用以下代码将字节转换为OutputStrea
  • Phaser.js教程

    从零到一 用Phaser js写意地开发小游戏 https segmentfault com a 1190000009212221
  • python列表排序方法-python list排序的两种方法及实例讲解

    对List进行排序 Python提供了两个方法 方法1 用List的内建函数list sort进行排序 list sort func None key None reverse False Python实例 1 2 3 4 5 6 gt g
  • 移动网络运营商显示无服务器,无线路由器忽然拨不上号,显示网络运营商远端无响应怎么处理...

    如果是有猫的环境 1 就从猫的哪个接口连接网线到路由WAN口 1 如果不需要拨号就可以上网 看下电脑平时不接路由器是连在猫的哪个接口上网 4 10M选择10M全双工 点击系统工具 重启路由器 超易安装界面的路由器1 祝您工作顺利 如果还是网
  • 人工智能革命:超级智能之路(上)

    这篇文章翻译于Tim Urban大神的 The AI Revolution 的系列文章 下面让我们一起领略一下Tim Urban大神理解的人工智能革命是怎样的吧 文章目录 遥远的未来 即将到来 超级智能之路 人工智能 我们目前在哪里 一个在
  • Echarts重绘报错 The image argument is a canvas element with a width or height of 0

    Echarts重绘报错 原因在于绘制时 未正确获取到画布的宽高 在容器内写入行内样式 即可解决
  • Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物

    Unity 3D 人形角色动画 Avatar Mecanim 动画系统适合人形角色动画的制作 人形骨架是在游戏中普遍采用的一种骨架结构 由于人形骨架在骨骼结构上的相似性 用户可以将动画效果从一个人形骨架映射到另一个人形骨架 从而实现动画重定
  • 基础入门-数据包拓展

    Request请求数据包数据格式 1 请求行 请求类型 请求资源路径 协议的版本和类型 2 请求头 一些键值对 浏览器与 web 服务器之间都可以发送 特定的某种含义 3 空行 请求头与请求体之间用一个空行隔开 4 请求体 要发送的数据 一
  • 22-Go操作mysql

    安装mysql docker快速启动一个MySQL Server容器 docker run name mysql8019 p 3306 13306 d e MYSQL ROOT PASSWORD root1234 mysql 8 0 19
  • 编译原理递归下降分析器(语法分析器)(C/C++)

    include