Compiler Principles 语法分析
语法分析的两种思维方式;
1:自顶向下分析 :从语法树的根部推下来一直推到需要确认的终结符号串为止;就是为了找到一个符号串的最左推导
自顶向下分析,因为文法有些是以非终结符开头的另外文法中还可能含有右部为空的推导;(为了能让机器决定下
一步采取那个推导式子)前者情况决定需要求所谓的FIRST集、后者决定需要求FOLLOW集(例如F->空|非空; 那么当能推导
过程中遇到F时因为F可能为空所以就需要求一下F后边可能后随的符号即FLLOW集以判断F是否可以取空;当然此时必须要求
F的后随符号(FOLLOW)集不能与F的FIRST集有相同的符号;试想如果能有相同那么就不能确定F是取空还是继续按照非空推导
,对吧,嘿嘿,其实道理很简单),CFG文法是“单入口的”即因为所有文法都是从一个相同的开始符号开始所以保证了利用
FIRST集来选取对应的推导公式必然唯一的而后续的推导也是从一个入口也就是保证了语法树不会是二义的(只要字符串符符
合对应文法那么只有唯一的一个最左推导与之对应,当然首先保证文法是LL(1)文法-就是对于一个推导公式右部如果无空的则
首符号集合不能有相同(保证可以唯一的选取),如果右部有空的那么相互之间的后随和前缀不能有相同的(前边解释过)就是
书中讲的 啊 要如何如何才能是LL1文法 balabalabala),至此,神马老师上课讲的乱七八糟的东西就这么简明的理解掉了~
所谓的预测分析表不就是列各表这样比较方便推导的时候找用哪个推导公式方便而已;(ps其实能想到这种方法的人也不见得
有多聪明,按照惯常思维完全就可以把这个想到,只是我大天朝一些编书的人和讲书的人故作深沉这样显得有学问╮(╯▽╰)╭
最后让我们觉得自己好笨啊 编译原理好难啊 坑爹!一个老师曾上课曰过,一篇好论文就是写的让人看的似懂非懂才算是好论文,
让人一看就懂的不是好论文,让人什么都看不懂的也不是好论文,很有些道理,不要标榜自己抬高搞得被人都是傻逼,写书的写
的复杂那或许无可厚非,但是讲书的讲的依旧复杂,那就是人云亦云了,可惜没办法这样的老师还是不少的,No complaint!
善哉善哉)
2:自底向上分析 :从终结符号串的开始进行最左规约一直规约到文法开始符号,从树的概念上即是形成整棵语法分析树并且树根
为文法开始符号;
一句话就是找句柄(最左直接短语:最左边直接短语,即最左边的可以符合某一文法公式右部可以一步规约为左步的一串
符号组合) 然后规约,一直规约到文法开始符号;大致想想一下如果按照这个想法的话似乎对文法的要求不是特别高,只要
每次规约时候找到一个合适切唯一的可归约公式就可以了,不用考虑什么首符号集必须不同后随符号集如何如何(当然上述
想法不完全正确)。
自底向上分析分为两种方法:优先法:算符优先分析法和状态法;
一、 算符优先分析法 就是先寻找文法中中各个终结符的优先关系;若用算符优先分析法进行分析那么必须能用算符文法来描述—
算符文法的每个产生式的右部都不能有两个语法变量直接相邻,并且没有空产生式;
根据已知文法进行算符优先分析的步骤是
1:首先分析各个文法符号之间的关系 求各个语法变量的FIRSTOP和LASTOP 再根据
文法来确定“算符”(即终结符不要理解那么狭隘)之间的优先关系
2:根据优先关系构造算符优先矩阵
3:判断是否有冲突如果有冲突则不能进行算符优先分析。由于算符优先文法只是根据非终结符进行分析规约所以规约的句柄
不是严格意义上的句柄(也就是算符优先进行规约的只看终结符,语法变量是否正确这个不管只要符合比如A+B的形式他就按照
F->A+B进行规约它不管你现在实际是C+F还是其他,只要符合形式就规约,所以从这个层面来讲算算符这里形成的句柄不是真正
的句柄,此句柄称为“最左素短语”我的理解就是略微不同于最左直接短语的短语:形式相同语法变量可能不同)。
二、LR分析法、
LR(0):构造LR(0)分析表
从文法得到拓广文法;求S'->S的项目集闭包项目I(0);
求I(0)后继项目集得到项目规范族;
判断项目集规范族各个成员是否相容 如果相容则是LR(0)文法(没有移进移进冲突和移进规约冲突)
SLR(1):构造SLR(1)分析表 注意:是在LR(0)的基础上进行的。(解决移进规约冲突)
所谓移进规约冲突的概念:如果一个项目集有如下状态 E->T. and E->T.*S; 那么该项目集遇到下一个符号既可以移进又可以
规约,如何判断呢?让分析器进行检查下一个输入符号,如果:输入属于FOLLOW(E)才可以进行规约,否则不能规约,因为生活总是
要继续呀你规约之后分析可能还没有结束,后续还得要能识别呀,如果不能识别那就规约错喽
LR(1):构造LR(1)分析表 注意到前边进行SLR(1)分析的时候只是在遇到移进规约冲突时候根据的FOLLOW集进行了大致判断,但是
没有考虑到 1:如果输入符号属于FOLLOW集那么分析仍然是存在冲突的还是所谓的移进规约冲突并没有完全解决而且我觉得
这种情况应该也不少;2:归约归约冲突的问题仍然存在;
为了解决这样的问题,LR(1)文法的规则产生了,LR1文法每个状态公式都有一个前瞻符号,从而能记住本公式从哪里来到哪里
去这个哲学命题的答案;可是具体为什么这样就能够保证不存在移进移进冲突我也不甚理解 ╮(╯▽╰)╭ ;似乎是因为不同的前
瞻符号代表不同的路,公式相同但前瞻符号不同还是不一样的 这样就区分了,一开始就不同结果肯定不同,虽然结果可能相同但是
回望一下想回去的路还是不同的,也就是进行归约时候使用同一个公式但是Go的状态还是不一样的。
LALR(1)文法:构造LALR(1)分析表,将LR(1)中的同心分量合并得到的表;当然肯定会存在问题,前提是如果合并之后项目集中
不存在冲突那么成为符合LALR(1)文法;(合并之后即使存在冲突冲突只会是归约归约冲突)
语法分析中用到的一些方法和形式语言中有很多类似之处;很多思想贯穿在里边,比如自底向上分析法中的算符优先分析,
我会想到逆波兰式和算法中的凸包问题的一种解法比较相似都是用栈来进行判断栈中符合神马条件然后就对栈中元素进行处理,
似乎有点意思。
Compiler Principles 语法分析的更多相关文章
- 2.2 节的练习--Compiler principles, technologys, &tools
2.2 节的练习 2.2.1 考虑下面的上下文无关文法: S -> S S + | S S * | a 试说明如何使用该文法生成串 aa+a* 试为这个串构造一颗语法分析树 ⧗ 该文法生成的语言 ...
- Hive 基础你需要掌握这些
HDFS 中一个简单的 Join查询,是否需要撸一大串代码?我只会SQL语句 能不能入坑大数据?这里我们就来聊一聊 Hive. Hive 是什么? Hive 是一种数据仓库工具,不提供数据存储(数据还 ...
- 不care工具,在大数据平台中Hive能自动处理SQL
摘要:有没有更简单的办法,可以直接将SQL运行在大数据平台? 本文分享自华为云社区<Hive执行原理>,作者: JavaEdge . MapReduce简化了大数据编程的难度,使得大数据计 ...
- ECNUOJ 2574 Principles of Compiler
Principles of Compiler Time Limit:1000MS Memory Limit:65536KBTotal Submit:473 Accepted:106 Descripti ...
- ECNU-2574 Principles of Compiler
题意: 给出编译规则,求是否满足条件 A:= '(' B')'|'x'. B:=AC. C:={'+'A}. 其中{}表示里面的内容可以出现0次或者多次 注意点见代码注释 #include ...
- compiler
http://www.lingcc.com/2012/05/16/12048/ a list of compiler books — 汗牛充栋的编译器参考资料 Posted on 2012年5月16日 ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- Notes of Principles of Parallel Programming - TODO
0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...
- compiler 学习
一款强大的编译器LLVM:http://llvm.org/docs/GettingStarted.html#layout http://llvm.org/docs/LangRef.html http: ...
随机推荐
- CloudStack添加新的API注意事项
1.***Cmd上面的@APICommand里的responseObject关联对于的Response: 2.在tomcatconf/command.properties.in添加新API的权限: 3 ...
- 养成代码注释习惯,帮助你更好使用NetBeans导航器
在使用NetBeans编写php代码时,为了在一个类中,或者在方法库文件中快速找到你想要找的函数或方法,通常我们会使用NetBeans的导航器. 我们看一个导航器的事例: 大家知道,在php中代码习惯 ...
- hdu 4578 Transformation
http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:1,a,b,c代表在a,b区间的每一个数加上c:2,a,b,c代表在a,b区间的每一个数乘上c: 3 ...
- 能让汇编转到C51的初学者有更清晰的认识的一篇文章
8051 是傳統 CISC 架構微控制器的代表,而 PIC 則是現代 RISC 架構微控制器的佳作. 雖然說 RISC 架構是公認未來微控制器的主流,但是 8051 藉著累積多年的發展環境與資源,特別 ...
- Cocos2d-x程序Windows下VC中文乱码的解决(用MultiByteToWideChar进行转换,VC2010有非常厉害的execution_character_set)
Cocos2d-x默认字符串常量编码都是UTF8的,而Windows中的VC默认都是跟系统相同,比如简体Windows是GB2312或者GBK.繁体就是BIG5编码.而我们大多数中国人用VC编译出来的 ...
- Android-PullToRefresh 使用心得
目前下拉刷新已经满大街都是,在自己的应用如果不使用这个模式的话,出门都不好意思和人家打招呼,该文章就是简单探讨下针对于 github 上的这个开源项目的使用心得. 为什么是它?因为在 stackove ...
- 如何使用WCF调试器WcfTestClient.exe
如果启用服务出现如下异常 请启用下面该服务 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE 文件->添加服务 地 ...
- feof()
百度知道 >电脑/网络 >编程语言 >C/C++ feof()这个函数是用来判断指针是否已经到达文件尾部的. 若fp已经指向文件末尾,则feof(fp)函数值为"真&quo ...
- python多字符中找出最大匹配(网友处学习)
#如'abbcc','abbdd' 找到abba='abbcc'b='abbdd'from difflib import *s=SequenceMatcher(None,a,b)m=s.find_lo ...
- root密码忘记后如何修改
方法一: 1.在DOS窗口下输入net stop mysql5 或 net stop mysql 2.开一个DOS窗口,这个需要切换到mysql的bin目录.一般在bin目录里面创建一个批处理1.ba ...