递归下降分析

 

对于给定的文法G[E] :

E→E+T|E-T|T
T→T*F| T/F|F
F→(E)|i

消除左递归后的文法是:
E→TE'

E'→+TE'|-TE'|∑

T→FT'

T'→*FT'|/FT'|∑

F→(E)|i

是否是LL(1)文法?

select(E→TE')=first(TE')={(,i}
select(E'→+TE')=first(+TE')={+}
select(E'→-TE')=first(-TE')={-}
select(E'→∑)=follow(E')={),#}
select(T→FT')=first(FT')={(,i}
select(T'→*FT')=first(*FT')={*}
select(T'→/FT')=first(/FT')={/}
select(T'→∑)=follow(T')={+,-,),#)
select(F→(E))=first((E))={(}
select(F→i)=first(i)={i}

由上分析,得知此文法满足LL(1)文法.

 

C语言代码如下:

#include<stdio.h>
#include <string.h>
void scaner();
void E();
void E1();
void T();
void T1();
void F();
void error();
char proce[100],ch,token[20];
int syn,i,j,m,sum=0;
char *keyword[6]= {"begin","if","then","while","do","end"};
main()
{i=0;//记录输入多少个字符printf("\n 请输入词法分析程序:");do{ch=getchar();proce[i]=ch;i++;}while (ch!='#');i=0;do{scaner();switch(syn){case 11: printf("\n(%d,%d)",syn,sum);break;case -1: printf("\n(%s,#)",token);break;default: printf("\n(%d,%s)",syn, token);}}while (syn!=0);printf("\n");i=0;scaner();E();if (syn==0)printf("\n 语法正确. \n");else     printf("\n  语法失败. \n");}
void scaner()
{for (j=0;j<20;j++)token[j]=NULL;//将token赋值为空m=0;sum=0;ch=proce[i];i++;while (ch==' '){ch=proce[i++];}if (ch>='a'&& ch<='z'){while (ch>='a'&& ch<='z'||ch>='0' && ch<='9'){token[m++]=ch;ch=proce[i++];//继续看后面的
                  }syn=10;i--;//判断为变量for (j=0;j<6;j++)if(strcmp(token,keyword[j])==0){syn=j+1;break;}//如果有可以匹配的就为关键字
           }elseif(ch>='0' && ch<='9'){while (ch>='0' && ch<='9'){sum=sum*10+(ch-'0');ch=proce[i];i++;}syn=11;i--;}elseswitch(ch){case '<': token[m]=ch;m++;ch=proce[i];i++;if (ch=='>'){syn=21;token[m]=ch;m++;}else if (ch=='='){syn=22;token[m]=ch;m++;}else{syn=20;i--;}break;case '>': m=0;token[m]=ch;m++;ch=proce[i];i++;if (ch=='='){syn=24;token[m]=ch;m++;}else{syn=23;i--;}break;case ':': m=0;token[m++]=ch;ch=proce[i++];if (ch=='='){syn=18;token[m++]=ch;}else{syn=17;i--;}break;case '+':syn=13;token[0]=ch;break;case '-':syn=14;token[0]=ch;break;case '*':syn=15;token[0]=ch;break;case '/':syn=16;token[0]=ch;break;case '=':syn=25;token[0]=ch;break;case ';':syn=26;token[0]=ch;break;case '(':syn=27;token[0]=ch;break;case ')':syn=28;token[0]=ch;break;case '#':syn=0;token[0]=ch;break;default:syn=-1;token[0]=ch;}
}
void E() {printf("E ");T();E1();} void E1() {printf("E1 ");if (syn==13){scaner();T();E1();}else {if (syn!=28 && syn!=0)error();} } void T() {printf("T ");F();T1(); } void T1() {printf("T1 ");if (syn==15) {scaner();F();T1();}else {if (syn!=28 && syn!=0 && syn!=13) error();} }void F() {printf("F ");if (syn==27){scaner();E();if(syn==28) scaner();else error();}else if (syn==11 || syn==10)scaner(); }void error() {printf("\n (%d,%s)语法错误! \n",syn, token); }

 

转载于:https://www.cnblogs.com/ldg-01/p/6188794.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SYS简介

"sysfs is a ram-based filesystem initially based on ramfs. It provides a means to export kernel data structures, their attributes, and the linkages between them to userspace.” --- documentation/filesystems/sysfs.txt 可以先把documentation/filesystems/…

数字后端——布图规划

布图规划&#xff08;floorplan&#xff09;与布局&#xff08;place&#xff09;在芯片设计中占据着重要的地位&#xff0c;它的合理与否直接关系到芯片的时序收敛、布线通畅、电源稳定以及良品率。所以在整个芯片设计中&#xff0c;从布图规划到完成布局一般需要占据整个物理…

利用SSH传输文件

在linux下一般用scp这个命令来通过ssh传输文件。 1、从服务器上下载文件scp usernameservername:/path/filename /var/www/local_dir&#xff08;本地目录&#xff09; 2、上传本地文件到服务器scp /path/filename usernameservername:/path 例如scp /var/www/test.php root19…

App WebView实例化

a&#xff0c;高级设置里的环境变量 jdk的配置 b&#xff0c;下载Google的sdk&#xff0c;里面直接包含eclipse 1&#xff0c;新建一个项目 2&#xff0c;起个名字 3&#xff0c;设么走不做&#xff0c;next 4&#xff0c;只操作选择显示的三种方式 5&#xff0c;next什么都不做…

[动态代理三部曲:下] - 从动态代理,看Retrofit的源码实现

前言 关于动态代理的系列文章&#xff0c;到此便进入了最后的“一出好戏”。前俩篇内容分别展开了&#xff1a;从源码上&#xff0c;了解JDK实现动态代理的原理&#xff1b;以及从动态代理切入&#xff0c;学会看class文件结构的含义。 如果还没有看过这俩篇文章的小伙伴&#…

Ti的DM368系列芯片的所有PDF资料汇总

http://www.ti.com/sc/docs/psheets/man_dsp.htm

刘浩(专业打劫三十年)20155307的预备作业02:

我的技能&#xff1f;比大多数人好&#xff1f;经验是什么&#xff1f;与老师的经验的共同之处&#xff1f; 我的技能之一就是单词翻译王——其实看了娄老师的学习经验之后便有些自惭形秽了&#xff0c;我目前的单词量是7300,扇贝上测的&#xff0c;而且测试时是严格的“不会就…

数字后端——电源规划

电源规划是给整个芯片的供电设计出一个均勻的网络&#xff0c;它是芯片物理设计中非常关键的一部分。电源规划在芯片布图规划后或在布图规划过程中交叉完成,它贯穿于整个设计中&#xff0c;需要在芯片设计的不同阶段对电源的供电网络进行分析并根据要求进行修改。&#xff0c;主…

逆向project实战--Acid burn

0x00 序言 这是第二次破解 crackme 小程序&#xff0c;感觉明显比第一次熟练。破解过程非常顺利&#xff0c;差点儿是分分钟就能够找到正确的 serial&#xff0c;可是我们的目标是破解计算过程。以下将具体介绍。 0x01 初次执行 刚開始拿到 crackme 先执行程序。看看有哪些明显…

PyCharm使用技巧(六):Regullar Expressions的使用

2019独角兽企业重金招聘Python工程师标准>>> PyCharm v2018.2最新版本下载 使用正则表达式查找和替换文件中的文本 示例代码 使用正则表达式查找和替换字符串 假设您想用扩展标记<title> </title>替换元素&#xff08;title&#xff09;中的属性&#x…

内核中_init,_exit中的作用

__init&#xff0c; __initdata等属性标志&#xff0c;是要把这种属性的代码放入目标文件的.init.text节&#xff0c;数据放入.init.data节──这一过程是通过编译内核时为相关目标平台提供了xxx.lds链接脚本来指导ld完成的。 对编译成module的代码和数据来说&#xff0c;当模…

jQuery笔记总结

来源于&#xff1a;http://blog.poetries.top/2016/10/20/review-jQuery/ http://www.jianshu.com/p/f8e3936b34c9 首先&#xff0c;来了解一下jQuery学习的整体思路 第一节 jQuery初步认知 jQuery概述 JQuery概念 javascript概念 基于Js语言的API和语法组织逻辑&#xff0c;通…

芯片生产流程

每个半导体产品的制造都需要数百个工艺&#xff0c;泛林集团将整个制造过程分为八个步骤&#xff1a;晶圆加工-氧化-光刻-刻蚀-薄膜沉积-互连-测试-封装。 一、晶圆加工 所有半导体工艺都始于一粒沙子&#xff01;因为沙子所含的硅是生产晶圆所需要的原材料。晶圆是将硅(Si)或砷…

GRE Sub math 报名

Step1 注册ETS帐号 Step2 登录帐号&#xff0c;点击Register/Find Test Centers, Dates Step3 按照提示查询考场 如果没有结果而是出现了如下提示&#xff0c;意味着这个地方没有考位了&#xff0c;需要选择其他地方的考位 Step 4 接下来就和GRE general test的过程一样了&…

platform_device_系列函数及其设备注册的作用

platform_device_系列函数&#xff0c;实际上是注册了一个叫platform的虚拟总线。使用约定是如果一个不属于任何总线的设备&#xff0c;例如蓝牙&#xff0c;串口等设备&#xff0c;都需要挂在这个虚拟总线上。 driver/base/platform.c //platform设备声明 struct device pla…

示例解读 Python 2 和 Python 3 之间的主要差异

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 每门编程语言在发布更新之后&#xff0c;主要版本之间都会发生很大的变化。 在本文中&#xff0c;Vinodh Kumar 通过示例解释了 Python 2 和 Python 3 之间的一些重大差异&#xff0c;以帮助说明…

数字后端——布局

由于I / O单元和模块的布放已经在布图规划时完成&#xff0c;因此布局的剩余任务主要是对标准单元的布局。布局方案在布图规划时就已经做了决定&#xff0c;要么选择展平式布局&#xff0c;要么就是层次化布局。 一、布局目标 布局的目标也即布局内容实施之后所要达到的预期值…

python基础 函数 (四)

一 函数基本 def func1():print("hello world")return 1, "hello", ("wo", "ai"), ["ni", "da"], {"you": "xi"} # return 可以返回任意# 结果&#xff1a; (1, hello, (wo, ai), [ni, da…

c#注释

c#的注释分为&#xff1a;这里不能不说一下什么是注释。 注释本身不会执行&#xff0c;只是说明性文字&#xff0c;只供程序员阅读。 注释又分为&#xff1a;单行注释&#xff0c;多行注释&#xff0c;文档注释。 单行注释&#xff1a;//开始 多行注释&#xff1a;/*开始&#…

嵌入式linux字符设备驱动

1. 我们需要先调用register_chrdev_region()或 alloc_chrdev_region()来向系统申请设备号int register_chrdev_region( dev_t first, unsigned int count, char *name ); //函数通过已知的设备号first来注册字符设备区域。 int alloc_chrdev_region( dev_t *dev, unsigned int…