1 / 14

第七章 动作文法和属性文法

第七章 动作文法和属性文法. 语义处理的抽象描述。 作用: 自动实现语法和语义检查 分类: 动作文法 属性文法. 动作文法. 动作文法 动作符( Action Symbol) 动作文法( Action Grammer) 尾动作文法 抽象动作文法 动作文法的实现: 动作文法的 LL 实现 动作文法的 LR 实现. 动作符和动作文法. 动作符: (区别于语法符号) 作用: 无语法作用,代表语义动作。 形式: # Name

howard
Download Presentation

第七章 动作文法和属性文法

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第七章 动作文法和属性文法 • 语义处理的抽象描述。 • 作用:自动实现语法和语义检查 • 分类: 动作文法 属性文法

  2. 动作文法 • 动作文法 动作符(Action Symbol) 动作文法(Action Grammer) 尾动作文法 抽象动作文法 • 动作文法的实现: 动作文法的LL实现 动作文法的LR实现

  3. 动作符和动作文法 • 动作符:(区别于语法符号) 作用:无语法作用,代表语义动作。 形式:#Name (Name是语义子程序名,无参。) 位置:产生式右部的任意位置 • 动作文法:产生式带动作符的文法。 作用:描述语义分析、中间代码生成 等工作过程。

  4. 动作文法的例子 L D L L   <Out> D  a D  b <Add> 例:文法: L  D L L   D  a D  b S:=0 • Add: S:=S+1 • Out: Print(S)

  5. SyntexStack InputStream Action L bab L  D L LD bab D  b #Add L<A>b bab match(b);S:=S+1 L ab L  D L LD ab D  a La ab match(a) L b L  D L LD b D  b #Add L<A>b b match(b);S:=S+1 L L  #Out <O> Print(S)

  6. 例2:串中出现连续b的个数。 • L  B B • B  a B • B  b B • B  c • Init: m:= 0 • Out_Init: If m0 Print(m);m:=0 • Add: m:= m + 1 • L  <Init>B B • B  a<Out_Init> B • B  b<Add> B • B  c<Out_Init>

  7. 尾动作文法 • 定义:动作符只出现于产生式的末尾。 • 特点:实现容易,LL方法和LR方法都可以。 • 例:E  n #PUSH E  (E1+ E2) #ADD E  (E1* E2) #MUL • PUSH:top:=top+1; Sem[top]:=n • ADD: Sem[top-1]:=Sem[top-1]+Sem[top];top:=top-1 • MUL:Sem[top-1]:=Sem[top-1]*Sem[top];top:=top-1

  8. 抽象尾动作文法 • 定义:动作子程序中,直接引用对应文法符 号的值,不考虑其形式、位置和结构如何。 • 举例: E0  n1 #PUSH E0  ( E2 + E4 ) #ADD E0  ( E2 * E4 ) #MUL PUSH: { E0.val := n1.val } ADD: { E0.val := E2.val + E4.val } MUL: { E0.val := E2.val * E4.val }

  9. 动作文法的LL实现 • LL动作文法: 动作文法满足LL(1)文法的条件。 • 实现组成: LL(1)分析表,驱动器,语义子程序。 • 驱动程序的分类: 不带语义栈控制:由用户实现语义栈的 管理,即将语义栈的处理写在语义 子程序中。 带语义栈控制:由驱动器来控制语义栈。

  10. 带语义栈控制的LL驱动器 LRCT指针: • LeftIndex:指向当前产生式左部符号的语义栈地址 • RightIndex:指向当前产生式右部的语义栈基地址 • CurrentIndex:指向当前符号的语义栈地址 • TopIndex:指向当前第一自由地址 LeftIndex RightIndex CurrentIndex TopIndex Semantic Stack

  11. 带语义栈控制的LL(1)驱动器 算法要点: • 语法栈顶是终极符a:判断a是否与输入流匹配,若匹 配:Sem(C):= a.val; C:=C+1;PopSynStack(1) 否则报错; • 语法栈顶是非终极符X:对当前输入LL分析表有 X  Y1Y2…Yn:将PushSynStack(Eop,Yn,…Y2Y1) 调整LRCT指针。 • 语法栈顶是动作符:调用相应的语义动作子程序。 • 若语法栈顶是Eop:PopSynStack(1),恢复LRCT指针, C:=C+1

  12. 动作文法的LR实现 • 尾动作文法的LR实现: 不带语义栈控制: 归约动作执行前先执行语义动作。 带语义栈控制: 语法栈和语义栈同步: 移入时:输入符压入语法栈中,输入符 的语义信息压入语义栈中; 归约时:执行语义动作,语法栈和语义栈同时 退N个,将产生式左部压入语法栈, 语义信息压入语义栈中。

  13. 属性文法 • 用于描述语言的静态语义 • 主要思想: 引入属性符号; 定义属性求值规则 • 例: E → n E.val:= n.val E → (E1) E.val:= E1.val E → E1 + E2E.val:= E1.val+E2.val

  14. 继承属性和综合属性 • 例: E → P P.env := E.env; E.val := P.val; E1 → P+E2P.env := E1.env E2.env := E1.env E1.val :=P.val+E2.val P → n P.val :=n.val P → id P.val :=Lookup(P.env,id.name) P → (E)E.env := P.env P.val := E.val

More Related