第6章 语义分析(1)
语义分析

number (val=34*10+5=345) number (val=3*10+4=34) number (val=3) digit (val=3) 3 digit (val=4) 4 digit (val=5) 5
构造符号表、记录声明中建立的名字的
含义 在表达式和语句中进行类型推断和类型 检查以及在语言的类型规则作用域内判 断它们的正确性。 牛牛文档分 享4 语义分析的方法
描述 属性文法 用来描述语义 实现 语法制导语义分析 程序的语义内容与它的语法紧密相关的 牛牛文档分 享 牛牛文档分 享
procedure PostEval(T:treenode) begin for each child C of T do PostEval(C); compute all synthesized attribut将属性等式转换为计算规则的方式 属性在语法分析器构造语法树后计算 (6.2.2) 属性在语法分析时计 从概念上讲,基于属性文法的处理过程通常是 这样的:对单词符号串进行语法分析,构造语 法分析树,然后根据需要遍历语法树并在语法 树的各结点处按语义规则进行计算。 输入串-->语法树-->依赖图-->语义规则计算次序 属性等式本身指示了属性计算时的顺序约束, 我们使用 相关依赖图 表示这些约束来明确顺 序的约束
其…,ak 的属性文法是对语言的所 有文法规则的所有这类等式的集合 一般地,将属性文法写成表格形式
文法规则 规则 1 … 规则 n
语义规则 相关一个属性文法的所有属性是合成的, 则这个文法叫S属性文法 例如
无符号数的属性文法 简单整数算术表达式的属性文
第六章_语义指向分析

• 1、前指与后指
• 前指就是在一个语义指向结构体中,指 向成分前指被指成分构成的语义指向模式, 后指则是指向成分后指被指成分构成的语 义指向模式。
• [1] 领导在开会。
• [2] 领导开完会了。
• “开会”前指“领导”。 “完”后指 “会”。
• 区分前指和后指有助于考察结构相同, 但语义所指的方向或方式可能不同的同形 结构。例如:
•
补语在语义上则可以指向不同的句法
成分,这些成分跟补语有的是直接成分关
系,有的则是非直接成分关系,如“砍倒
了”的“倒”一般指向受事,“砍累了”
的“累”则指向施事,“砍钝了”的“钝”
又指向了工具,“砍快了”的“快”才真
正指向述语,而“砍破了”的“破”则既
可能指向受事,也可能指向施事,还可能
指向工具,这说明单个的“砍破了”是有
• 首先,从句法成分看: • 1、谓语 • [1] 我找个老师问一下。 • [2] 我找个老师教一下。 • [3] 我找个老师讨论一下。 • [4] 我找个人一起去。 • [5] 三顿饭就把他吃厌了。
• 2、定语 • [1] 他晚年过着幸福的生活。 • [2] 他干了一整天的活。 • [3] 孩子们每人买了两块钱的菜。 • [4] 他做了50块钱的衣服。 • [5] 她昨天想了一天的心事。 • [6] 小王过了一个愉快的假期。
一个有形的疑问成分。二是它们所指向的疑问成
分必须置于它们的后面(即只能后指)并尽量靠
近。试比较(句前的问号代表该句可接受性弱,
下同):
• [9] a.你吃过晚饭后究竟去不去看电影?
• ?b.你究竟吃过晚饭后去不去看电影?
• [10] a.你下班后到底去哪儿?
• ?b.你到底下班后去哪儿?
编译原理第6章(刘磊 机械工业出版社)

TypePtr Kind
Level Parm Class
例有声明如下:
CONST pai= 3.14 ; TYPE vector=ARRAY[1..10] OF integer; VAR x, y : real ; r, s : vector ; 设当前层数和可用offset值分别为L和0, 构造标识符 pai, vector, x, y, r 和s 的属性表示。
6.4 值的内部表示
非结构类型值的内部表示:
整型:有直接对应的机器表示。 实型:有直接对应的机器表示。 指针:无符号整型数。 有序类型:整数形式
有序类型的量表示:
整型常量:ord(N) = N 布尔常量:ord(false)=0, ord(true) = 1 字符常量:ord(C) = ASCⅡ (C) 枚举常量:设有枚举类型(D,A,B),则有 ord(D)=0,ord(A)=1,ord(B)=2 子界常量:设有子界类型C1..C2,则值空间 为[ord(C1)...ord(C2)]
TokenList
语义定义 自然语言描述规定
判定
三种内部表示
标识符的内部表示 类型的内部表示 值的内部表示
6.2
标识符种类:
标识符的内部表示
常量名、类型名、变量名、函数名、过程名、域名。 TYPE idkind=( consKind, typeKind, varKind, fieldKind, procKind,funcKind )
标准类型: Size sub: enum: array:
Size Size Size Kind HostType Elems Low Up Leng
Kind Kind Kind
ch06--语义分析

6.2
符号表
符号表在翻译过程中起两方面的重要作用:
–检查语义(即上下文有关)的正确性 –辅助正确地生成代码
通过在符号表中插入和检索变量的属性来实现的 符号表是一张动态表
–在编译期间符号表的入口不断地增加 –在某些情况下又在不断地删除
Wensheng Li BUPT
编译程序需要频繁地与符号表进行交互,符号表的 效率直接影响编译程序的效率。
变量名 able_n b_loop count flag form mlist x_total 类型 1 1 2 1 3 6 1 维数 0 0 1 0 2 0 0 声明行 5 5 2 7 4 6 3 引用行 11,23,25 10,11,13 9,14,15 28,29 36,37,38 17,21 12,14
优化 目标代码
其他遍
符号表
Wensheng Li BUPT
两方面的优点:
– 对语法分析程序来讲降低了文法的复杂性 – 允许用更系统的方法对上下文有关的错误进行检测和校正。
11
二、符号表内容
符号表中记录的是和标识符相关的属性 出现在符号表中的属性种类,在一定程度上取决 于程序设计语言的性质。 符号表的典型形式:
–实参的个数与形参的个数一致 –实参的类型与相应形参的类型一致
Wensheng Li BUPT
在符号表组织中:
–把参数的个数看作它的维数是很方便的,因此,可将这 两个属性合并成一个。 –这种方法也是协调的,因为对这两种属性所做的类型检 查是类似的。
17
交叉引用表
编译程序可以提供的一个十分重要的程序设计辅 助工具:交叉引用表 编译程序一般设一个选项,用户可以选择是否生 成交叉引用表
语义分析法

组员:
主要内容 :
内隐联想测验的由来 内隐联想测验的原理
内隐联想测验的性能 内隐联想测验的应用 对内隐联想测验的评价
语义分析法的基本概念
语义分析法(method of semantic differential),又称语义差异法、双极形 容词分析法。由美国心理学家Charles E.0sgood和其同事提出,通过人的联 觉和联想,运用语义差异量表来研究 “概念”的意义的一种方法。
分析模式图如下:
结果的处理与分析1
模式图1
S1
S2
T
C
R1
R2
备注
该模式图表示不同被试在同 一时间对同一概念的反应异同。
比较团体时,需用平均数比 较。
S:被试或团体;T:时间; C:被评概念;R:在某一维度上 的得分
结果的处理与分析2
通过分析和比较同一组被试在不同时间 在某一具体评价子项目或某一维度上的得 分差异,了解他们对事物、问题或社会的 看法与态度的改变情况 。
0sgood研究发现,用语言来描述时,能察 见其间有颇为明显的共同趋向。
研究也证明,在不同民族、文化中,人 们也存在这种相同或相似情况。
语义分析法实施途径:语义差异量表
语义差异量表的由来 评价维度及子项目 编制 记分方法 注意事项
语ቤተ መጻሕፍቲ ባይዱ差异量表:来源
语义差异量表(Semantic Differential Scale) 又叫语义分化量表,是美国心理学家(奥斯古德、萨奇 泰尼邦 Osgood,Suci,Tannenbaum,1957)发展的 一种态度测量技术。20世纪50年代后发展起来。语义差 异量表以形容词的正反意义为基础,标准的语义差异量 表包含一系列形容词和它们的反义词,在每一个形容词 和反义词之间有约7-11个区间,我们对观念、事物或人 的感觉可以通过我们所选择的两个相反形容词之间的区 间反映出来。
语义分析与语法制导翻译

/* newtemp => t2 => E1.place */
|| E21.code || E22.code || gen( ‘t3:=’ E21.place’*’E22.place )
9
8
三地址代码
一般形式 x := y op z
其中 x, y, z 为变量名、常数或编译 产生的临时变量
四元式(op, x, y, z)
种类:x := y op z
双目运算
x := op y
单目运算
x := y
赋值
if x relop y goto l
条件转移
其他三地址代码
goto l param x call p, n (n是参数个数) return x x := y[i] x[i] := y x := &y x := *y *x = y
注释: || 表示代码序列的连接
S
例 6-7:
翻译 a:= -c+b*34
id := E
E1 +
E2
-
E 11 E 21 *
E 22
id id
num
结果:开始符号的属性 S.code
1) 找出分析树中使用的产生式规则 2) 根据产生式的语义规则,代换公式中的
各属性 3) 反复使用 1) 和 2) 改写公式,最后得
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左 至右计算
对于所有 A→X1 X2 … Xn Xi 属性计算仅使用A X1 X2 …
语义分析的一些方法

语义分析的一些方法语义分析的一些方法(上篇)•5040语义分析,本文指运用各种机器学习方法,挖掘与学习文本、图片等的深层次概念。
wikipedia上的解释:In machine learning, semantic analysis of a corpus is the task of building structures that approximate concepts from a large set of documents(or images)。
工作这几年,陆陆续续实践过一些项目,有搜索广告,社交广告,微博广告,品牌广告,内容广告等。
要使我们广告平台效益最大化,首先需要理解用户,Context(将展示广告的上下文)和广告,才能将最合适的广告展示给用户。
而这其中,就离不开对用户,对上下文,对广告的语义分析,由此催生了一些子项目,例如文本语义分析,图片语义理解,语义索引,短串语义关联,用户广告语义匹配等。
接下来我将写一写我所认识的语义分析的一些方法,虽说我们在做的时候,效果导向居多,方法理论理解也许并不深入,不过权当个人知识点总结,有任何不当之处请指正,谢谢。
本文主要由以下四部分组成:文本基本处理,文本语义分析,图片语义分析,语义分析小结。
先讲述文本处理的基本方法,这构成了语义分析的基础。
接着分文本和图片两节讲述各自语义分析的一些方法,值得注意的是,虽说分为两节,但文本和图片在语义分析方法上有很多共通与关联。
最后我们简单介绍下语义分析在广点通“用户广告匹配”上的应用,并展望一下未来的语义分析方法。
1 文本基本处理在讲文本语义分析之前,我们先说下文本基本处理,因为它构成了语义分析的基础。
而文本处理有很多方面,考虑到本文主题,这里只介绍中文分词以及Term Weighting。
1.1 中文分词拿到一段文本后,通常情况下,首先要做分词。
分词的方法一般有如下几种:•基于字符串匹配的分词方法。
此方法按照不同的扫描方式,逐个查找词库进行分词。
《编译原理》教学大纲

《编译原理》教学大纲大纲说明课程代码: 3225003总学时: 64 学时(讲课 48 学时,实验16 学时)总学分: 4课程类别:学科基础课适用专业 : 计算机科学与技术(专业)预修要求: C 语言程序设计、 C++ 程序设计、数据结构课程的性质、任务及地位:《编译原理》是计算机科学与技术专业的一门重要基础课。
通过对该课程的学习,使学生掌握编译过程中的相关原理和编译技术,让学生能初步进行编译程序的开发和维护,同时促进提高学生开发软件的能力。
教学目的与基本要求:本课程的目的,通过向学生讲述编译系统的结构、工作流程及编译程序各部分的设计原理和实现技术,使学生既掌握编译技术理论的基础与基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
本课程理论性较强。
因授课对象为工科学生,所以在强调编译系统的构造原理和实现方法的同时,为培养学生的实际工作能力,通过上机实践进一步加深学生对课堂教学内容的理解。
目的是要使学生牢固掌握相关的基本理论和基本方法,并能初步利用上述理论和方法解决简单实际问题。
教学方法和教学手段的建议:在教学方法上,贯彻理论联系实际、“精讲、多练”的原则,进行案例式、启发式的教学,对于一些实际性较强的问题要多采用课堂讨论等方式,以提高学生的思辨能力和学习的主动性;引导学生读书、理解、体悟、运用相结合;提高学生的学习兴趣与热情,培养与发挥学生的提出、分析及解决问题的能力。
教学手段:运用多媒体教学手段 +黑板 +上机实验的手段。
采取课堂讲授、课堂讨论、课后练习与自学等形式。
大纲的使用说明:大纲对课程性质、目的等作简单说明,同时列出各章节要学习的知识点、重点、难点,便于教学时教授重点的安排和学生自学安排。
大纲正文第一章引论学时: 4 学时(讲课 4 学时,实验 0 学时)了解编译的概念;理解编译程序的各组成部分及功能。
本章讲授要点:介绍程序设计语言与编译程序间的关系,主要内容包括:各级程序设计语言的定义、源程序的执行、编译程序的构造、编译程序的分类、形式语言理论与编译实现技术的联系。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
类型的内部表示
为什么需要类型的内部表示?
– 类型是标识符的重要属性; – 类型检查是语义分析的重要部分; – 类型的结构对类型检查很重要;
程序语言的类型
– 基本类型 Integer (int ) Real (float) Bool Char – 构造类型 数组(Array) 结构体(Structure、record) 联合类型(Union、变体记录) – 枚举类型 – 指针类型
联合类型的内部表示
Kind Body unionT y Body: 指向联合体中域定义链表 Size: 所有域的类型的size中最大值;
Body
FieldName FieldType Next
Size
typedef union{ int i; char name[10]; real x; } test;
基本类型的内部表示
Size intPtr Kind
intSize
boolSize realSize
intTy
boolTy realTy
boolPtr realPtr
charPtr
charSize
charTy
数组类型的内部表示
Size
Kind arrayTy
Low
Up
ElemTy
size = sizeof(ElemTy) (Up-Low+1) ElemTy: 指向数组成分类型的指针; array [2..9] of integer; (8, arrayTy, 2, 9, intPtr)
第六章 语义分析
6.1 语义分析概述
6.2 符号表
6.3 类型的语义分析 6.4 声明的语义分析 6.5 程序体的语义分析 么是符号表(Symbol Table)?
– 符号表可看作是从标识符名字到它的属性的映射; – 用于存储程序中声明的标识符及其属性;
语义分析在编译程序中的作用
词法分析 目标代码生成
语法分析
中间代码优化
语义分析
中间代码生成
分析
合成
第六章 语义分析
6.1 语义分析概述
6.2 符号表
6.3 类型的语义分析 6.4 声明的语义分析 6.5 程序体的语义分析 6.6 属性文法和动作文法
6.1 语义分析概述
语法(Syntax)和语义(Semantics)的区别 语义分析的必要性 程序设计语言语义的分类 如何描述程序设计语言的语义? 语义分析的主要任务
Access: (dir, indir); Level: 层数 Offset:偏移量
域名标识符的属性
TypePtr
Kind fieldKind
Offset
Ptr
TypePtr
– 指向域名类型的内部表示;
Kind
– 标识符的种类, 所有域名标识符的Kind =fieldKind;
Offset:
P(0,-)
层数为2
i : (2, 0) j : (2,1) 层数为1 x : (1, 0)
f(1,-)
Procedure R() Var x:real; Begin …… End; Begin …… End.
R(0,-)
变量的层数和偏移 (包括形式参数)
typedef struct { int number; char name[10];} example; int i; example p; real x;
符号表的组织
标识符的作用域 符号表的局部化 符号表的全局化 接口函数
标识符的作用域
作用域(scope)
– 程序中的每个标识符都有自己的作用域;
– 标识符的作用域是标识符可见(visible)或有效的(effective)
形式语义技术没有形式语法成熟 硕士研究生的课程-《形式语义学》
语义分析的主要任务
根据声明部分建立符号表
– 存储标识符的属性,以便检查语义错误和为代
码生成提供信息;
在整个程序范围内检查语义错误
– 声明和使用相关的错误 – 类型相关的语义错误
一般地,语义分析是伴随着语法分析完成 的;
常见的语义错误
– 该域名针对所在结构类型的偏移量;
Ptr:
– 指向所在结构体的下一个域;
(实在过程或者函数的属性)
TypePtr Kind routKind
Class actual
Level
Param
Code
Size
Forward
TypePtr: 指向函数返回值类型的内部表示,过程情形为空; Kind: 标识符的种类,此处为 routKind; Class: actual指代实在的(有自己的函数体)函数或过程; Level: 标识符被定义的层数; Param: 指向形式参数列表的指针; Code: 指向函数或过程对应的目标代码的起始地址; Size: 目标代码的大小; Forward: 该函数为向前声明时取值 = true;
标识符名字 x p …
属性 int, variable, …… void, function, (int i), …… …….
6.2 符号表
为什么在语义分析时需要符号表(Symbol Table)?
– 从标识符的Token定义,我们仅仅知道了标识符的名字,
对于其它属性,例如类型,种类等没有记录
– 对于标识符的更多信息需要进行语义分析,从而检查
声明和使用相关的语义错误
– 标识符没有声明; – 重复声明;
如何检查?
– 每当遇到新声明的标识符,查符号表
如果当前有效的所有标识符中有相同名字的,则是重复声 明错误; 否则生成它的属性信息,保存到符号表中; 如果没有找到,说明该标识符没有声明; 否则, 得到该标识符的属性,进行进一步分析;
– 每当遇到标识符的使用,查符号表
常量标识符的属性
TypePtr Kind
constKind
Value
TypePtr
– 指向常量类型内部表示的指针;
Kind
– 标识符的种类,所有常量的 kind = constKind;
Value
– 常量的值;
类型标识符的属性
TypePtr Kind
typeKind
TypePtr
– 指向类型内部表示的指针;
Kind
– 标识符的种类,所有类型标识符的 kind = typeKind;
变量标识符的属性
TypePtr Kind varKind
Access
Level
Offset
TypePtr
– 指向变量类型的内部表示;
Kind
– 标识符的种类, 所有变量标识符的Kind = varKind;
语义分析的必要性
一个语法正确的程序不能保证它是有意义 的! 程序中容易出现各种语义错误:
– 标识符未声明 – 操作数的类型与操作符的类型不匹配
– ……
程序设计语言语义的分类
静态语义
– 编译时(compile-time)可以检查的语义 – 例如:标识符未声明
动态语义
– 目标程序运行时(run-time)才能检查的语义
标识符的内部表示
不同种类标识符的属性
– 常量: (类型,值) – 类型: (类型) – 变量: (类型, 层数,偏移) – 函数: (返回类型, 形参定义, 代码地址, 空间大
小, …….) – 过程: (形参定义, 代码地址, 空间大小, …….) – 域名: (类型, 偏移, 所在结构类型)
形参过程或者函数的属性
TypePtr Kind Class Level Param Offset
routKind formal
TypePtr:同形式函数/过程; Kind: 同形式函数/过程, = routKind; Class: = formal; Level:同形式函数/过程; Param:同形式函数/过程; Offset: 在形参列表中的偏移;
语义错误;
标识符名字 x p …
属性 int, variable, …… void, function, (int i), …… …….
6.2 符号表
为表示标识符的属性,我们需要建立
– 标识符的内部表示
– 类型的内部表示 – 值的内部表示
符号表的组织
– 标识符的作用域 – 局部化的符号表
– 全局化的符号表
Program A Var x, y: integer; Procedure P() Var k:array[1..9] of real; m: integer;
Function f(i:integer) Var j:integer; Begin …… End; Begin …… End; 层数为0 层数为1 k : (1, 0) m : (1,18) x : (0, 0) y : (0, 1)
语法和语义的区别
语法:
– 是描述一个合法定义的程序结构的规则 – 例如:<函数调用语句> id( <实参表达式>)
语义:
– 说明一个合法定义的程序的含义 int x; 符合变量声明的语法、语义
float f();
x(); x = f(); 符合函数声明的语法、语义 符合函数调用的语法、不符合语义 符合赋值语句的语法、不符合语义
变量的层数和偏移 (包括形式参数)
层数(level)