编译原理第三篇-语法分析1

3.语法分析  文法—推导—语法树

语法分析的任务是:接受一个终结符号串作为输入,找出从文法的开始符号推导出这个串的方法。

如果不能从文法的开始符号推导得到该终结符号串,则报告该终结符号串中包含的语法错误。

 1.文法给出了一个程序设计语言的精确移动的语法规约

 2.对于某些类型的文法,我们可以自动的构造出高效的语法分析器,它能够确定一个源程序的语法结构,同时,语法分析器的构造过程中可以揭示出语法的二义性,同事还可能发现一些容易在语法的初始阶段被忽略的问题

3.一个正确设计的文法给出了一个语言的结构,该结构有助于把源程序翻译为正确的目标代码,也有助于检测错误

4.一个文法支持逐步假如可以完成新任务的新语言构造从而迭代地演化和开发语言。如果对语言的实现遵循语言的文法结构,那么在实现中假如这些新构造的工作就变得更加容易。

用文法去匹配词法输出的词语串,经过对文法的推导,然后构成语法树。

 

 

语法分析器的作用。

语法分析器从词法分析器获得一个由词法单元组成的串,并验证这个串可以由源语言的文法生成。

 

处理文法的语法分析器大体上可以分为三种类型:通用的,自顶向下的和自底向上的。

通用的语法分析方法可以对任意文法进行语法分析,然而通用方法效率很低,不能用于编译器产品。所以

编译器中常用的方法可以分为自顶向下的和自底向上的。

自顶向下: 从语法分析树的顶部-根节点开始向底部构造语法分析树

自底向上: 从语法分析树的叶子节点开始,逐渐向根节点方向构造。这两种分析方法中,语法分析器的输入总是按照从左到右的方式被扫描,每次扫描一个符号。

 

文法:

 

文法自然地描述了大多数程序设计语言构造的层次化语言结构,例如 java中的if else语句通常具有如下形式:

Ifexpression   statement else statement

产生式 Stmt-à ifexpr stmt else stmt

产生式的推导: 根据文法推导符号串时,我们首先从开始符号除法,不断将某个非终结符号替换为该非终结符号的某个产生式的体。可以从开始符号推导得到的所有终结符号串的集合称为该文法定义的语言。

 

文法G(E)       
1)E->E+T|T
2)T->T*F|F
3)F->(E)|i
产生式中只有一个|(或),其它的符号都为终结符号,或叫记号,谢谢回答,使我本来怀疑的结果进一步有了证明,其有,()操作的意义就是优先结合

文法是产生式的集合

一个上下文无关文法:

词法分析是专注于一个检测一个语言中是否有不合格的单词,以及将单词进行分类。那么为什么要分类呢?其目的就是为了规范化。只有无限的东西规范到一个范围内,我们才能对其进行识别和分析。例如,我们定义在加号两边只能是两个ID。这样,如果出现IF PLUS ID 这样的结构就说明是不正确的,其犯了语法错误。

  从上例可以看出,我们已经从单词级别的分析转换到了单词与单词之间的关系的分析。他们之间的关系就是我们定义的相关语法

 

 类似于词法分析,我们为了描述一类单词,使用了正则表达式,在这里,我们为了描述一类语法,我们使用了上下文无关文法。由此可以知道,文法是用来定义句子结构的(单词与单词之间的关系),上下文无关文法是指,该文法所定义的所有的句子结构之间是没有关系的。例如ID ID ID,我们不关心ID在怎么来的,经历了那些东西,我们只关心一个字符是不是ID,以及ID的等价形式有那些。

  以上只是对文法的感性描述,比较正规的定义是:一个上下文无关文法包含四个成分,终结符号集合,非终结符号集合,起始符号,产生式集合。

词法单元或者变量作为输入:语法树作为输出

语法分析的输入单元是词法分析后的词语单元。If a>5 else

  1. 一个终结符号集合,他们有时候也称为 “词法单元”。终结符号是该文法所定义的语言的基本符号的集合
  2. 一个非终结符号集合,他们有时候也称为“语法变量”。每个非终结符号表示一个终结符号串的集合。
  3. 一个产生式集合,其中每个产生式包括一个称为产生式头或左部的非终结符号,一个箭头和一个称为产生式体或右部的有终结符号及非终结符号组成的序列。

产生式主要用来表示某个构造的某种书写形式。

 

4.指定一个非终结符号为开始符号。

 

语法分析树:用图形方式展现了从文法的开始符号推导出响应语言中的符号 串的过程。如果非终结符号A有一个产生式A->XYZ,那么在语法分析树中就可能有一个标号为A的内部结点,该结点有三个子结点,从左 到右标号分别为XYZ

 

二义性

一个文法可能有多棵语法分析树能够生成同一个给定的终结符号串,这样的文法称为具有二义性。

要证明一个文法具有二义性,我们只需要找到一个终结符号串,说明他是两棵以上语法分析树的结果。因为具有两棵以上语法分析树的符号串通常具有多个含义。

我们应该在使用二义性文法使用附加的规则来消除二义性;

运算符的优先级:

表达式 9+5*2 如果没有运算符的优先级,他这个在构建语法树的情况下确实能产生不同语法树。也就是二义性。

 

 

因子: 不能被任何运算符分开的表达式。

1.不能分开的意思是说当我们在任意因子的任意一边设置一个运算符,都不会导致这个因子的任何部分分离出来,成为这个运算符的运算分量。

因子本身作为一个整体可以成为该运算符的一个运算分量。

2如果这个因子是一个由括号括起来的表达式,那么括号将起到保护其不被分开的作用,如果因子就是一个运算分量,那么他当然不能被分开。

项: 是一个可能被高优先级的运算符* 或/分开,但不能被低优先级运算符分开的表达式。一个表达式(不是因子也不是项)的表达式可能被任何一个运算符分开。

 

 

推导: 将产生式子看做重写规则,就可以从推导的角度精确地描述构造语法分析树的方法。

从开始符号除法,每个重写步骤把一个非终结符号替换为他的某个产生式的体。

 

这个推导思想对应于自顶向下构造语法分析树的过程。但是推导概念所给出的精确性在讨论自底向上的语法分析过程尤其有用。

 

项  因子 E->E+T|T

 

 

 

最右推导:

第一个E是开始符号  E—>  这个E是开始符号

最右推导是从右边开始 最右是id(最左和最右表示的是选择哪个非终结符号)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值