编译原理语义分析详解

合集下载

编译原理实验报告 语义分析

编译原理实验报告 语义分析

.编译原理课程实验报告实验3:语义分析. .. ...要求:对如下工作进行展开描核心数据结构的设(1Nod本程序使用了两个新的实体类,分别I的属性I是标识符里面也包含了该标识符在本程序中存储的地址和长度等信息I下/privat String name;/基本类privat String type/起始地privatin offset/长in length privat/该数组各维的长publi List<Integer> arr_length得/变量的维度可以根arr_length.size(的属性如下Nod是语法生成树的节点Nod节点/privat String nam父节/privat Node fathe/子节publi List<Node>son/属Map<String,String>attribut publi使用哈希表这是因为各个节点的属性不是统一的的类型是哈Ma其atrribut以方便地创建、使用属性主要功能函数说(2因为语义分析过程与语法分析同步进此次试验的语义分析部分并没有新的功能函数文法符号匹配的过程中,插入语义的,代码都是在第二次第二次实验的基础上,LL(l的功能发作代码。

所以,只有句法分析函analysis(List<Token> token_list了变化,添加了语义分析的功能,其他函数功能基本与实验二相同(3程序核心部分的程序流程图..是否否是否是3-1图四、实验结果及分析得分..要求:对实验结果进行描述和分析,基本内容包括针对一测试程序输出其语义分析结果输出针对此测试程序对应的语义错误报告输出针对此测试程序经过语义分析后的符号表对实验结果进行分析注:其中的测试样例需先用已编写的词法分析程序进行处理测试程序void main () {double d;int a[2][3];d = 0;a[0][1] = 2;if (d == 0) {a[0][1] = d;}else {a[1][1] = 0;}while (a[0][1]<3) {++a[0][1];}}分析结果以及错误报告:. .4-1 图标识符表:4-2图实验结果分析:. ..。

编译原理语义分析实验报告

编译原理语义分析实验报告

实验3 语义分析实验报告一、实验目的二、通过上机实习, 加深对语法制导翻译原理的理解, 掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。

三、实验要求四、采用递归下降语法制导翻译法, 对算术表达式、赋值语句进行语义分析并生成四元式序列。

五、算法思想1.设置语义过程。

(1)emit(char *result,char *ag1,char *op,char *ag2)该函数的功能是生成一个三地址语句送到四元式表中。

四元式表的结构如下:struct{ char result[8];char ag1[8];char op[8];char ag2[8];}quad[20];(2) char *newtemp()该函数回送一个新的临时变量名, 临时变量名产生的顺序为T1, T2, …char *newtemp(void){ char *p;char m[8];p=(char *)malloc(8);k++;itoa(k,m,10);strcpy(p+1,m);p[0]=’t’;return(p);}六、 2.函数lrparser 在原来语法分析的基础上插入相应的语义动作: 将输入串翻译成四元式序列。

在实验中我们只对表达式、赋值语句进行翻译。

源程序代码:#include<stdio.h>#include<string.h>#include<iostream.h>#include<stdlib.h>struct{char result[12];char ag1[12];char op[12];char ag2[12];}quad;char prog[80],token[12];char ch;int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针, m是token的指针char *rwtab[6]={"begin","if","then","while","do","end"};void scaner();char *factor(void);char *term(void);char *expression(void);int yucu();void emit(char *result,char *ag1,char *op,char *ag2);char *newtemp();int statement();int k=0;void emit(char *result,char *ag1,char *op,char *ag2){strcpy(quad.result,result);strcpy(quad.ag1,ag1);strcpy(quad.op,op);strcpy(quad.ag2,ag2);cout<<quad.result<<"="<<quad.ag1<<quad.op<<quad.ag2<<endl;}char *newtemp(){char *p;char m[12];p=(char *)malloc(12);k++;itoa(k,m,10);strcpy(p+1,m);p[0]='t';return (p);}void scaner(){for(n=0;n<8;n++) token[n]=NULL;ch=prog[p++];while(ch==' '){ch=prog[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){token[m++]=ch;ch=prog[p++];}token[m++]='\0';p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0'&&ch<='9')){{sum=0;while((ch>='0'&&ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}else switch(ch){case'<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}else if(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'>':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}else{syn=17;p--;}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;break;}}int lrparser(){//cout<<"调用lrparser"<<endl;int schain=0;kk=0;if(syn==1){scaner();schain=yucu();if(syn==6){scaner();if(syn==0 && (kk==0))cout<<"success!"<<endl;}else{if(kk!=1)cout<<"缺end!"<<endl;kk=1;}}else{cout<<"缺begin!"<<endl;kk=1;}return(schain);}int yucu(){// cout<<"调用yucu"<<endl;int schain=0;schain=statement();while(syn==26){scaner();schain=statement();}return(schain);}int statement(){//cout<<"调用statement"<<endl;char *eplace,*tt;eplace=(char *)malloc(12);tt=(char *)malloc(12);int schain=0;switch(syn){case 10:strcpy(tt,token);scaner();if(syn==18){scaner();strcpy(eplace,expression());emit(tt,eplace,"","");schain=0;}else{cout<<"缺少赋值符!"<<endl;kk=1;}return(schain);break;}return(schain);}char *expression(void){char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt =(char *)malloc(12);strcpy(eplace,term ()); //调用term分析产生表达式计算的第一项eplacewhile((syn==15)||(syn==16)){if(syn==15)strcpy(tt,"+");else strcpy(tt,"-");scaner();strcpy(ep2,term()); //调用term分析产生表达式计算的第二项ep2strcpy(tp,newtemp()); //调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2); //生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char *term(void){// cout<<"调用term"<<endl;char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,factor());while((syn==13)||(syn==14)){if(syn==13)strcpy(tt,"*");else strcpy(tt,"/");scaner();strcpy(ep2,factor()); //调用factor分析产生表达式计算的第二项ep2strcpy(tp,newtemp()); //调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2); //生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char *factor(void){char *fplace;fplace=(char *)malloc(12);strcpy(fplace,"");if(syn==10){strcpy(fplace,token); //将标识符token的值赋给fplacescaner();}else if(syn==11){itoa(sum,fplace,10);scaner();}else if(syn==27){scaner();fplace=expression(); //调用expression分析返回表达式的值if(syn==28)scaner();else{cout<<"缺)错误!"<<endl;kk=1;}}else{cout<<"缺(错误!"<<endl;kk=1;}return(fplace);}void main(){p=0;cout<<"**********语义分析程序**********"<<endl;cout<<"Please input string:"<<endl;do{cin.get(ch);prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();}七、结果验证1、给定源程序begin a:=2+3*4; x:=(a+b)/c end#输出结果2、源程序begin a:=9; x:=2*3-1; b:=(a+x)/2 end#输出结果八、收获(体会)与建议通过此次实验, 让我了解到如何设计、编制并调试语义分析程序, 加深了对语法制导翻译原理的理解, 掌握了将语法分析所识别的语法成分变换为中间代码的语义翻译方法。

《编译原理教程》第四章语义分析和中间代码生成

《编译原理教程》第四章语义分析和中间代码生成

控制流分析和数据流分析案例
总结词
控制流分析和数据流分析是编译器设计中两种重要的 语义分析技术。
详细描述
在控制流分析案例中,我们以一个具有条件语句和循环 的程序为例,分析其控制流图(Control Flow Graph, CFG)。CFG是一个有向图,用于表示程序中各个基本块 之间的控制流程关系。通过CFG,编译器可以检测到潜 在的程序错误,如死代码和无限循环。在数据流分析案 例中,我们使用数据流方程来跟踪程序中变量的值在执 行过程中的变化。我们以一个简单的程序为例,该程序 包含一个变量在函数调用后被修改的情况。通过数据流 分析,我们可以确定变量的最新值,以便在后续的语义 分析中使用。
定义
三地址代码是一种中间代码形式,它由一系列的三元组操作数和 操作符组成。
特点
三地址代码具有高度规范化,易于分析和优化,且易于转换成目 标代码。
常见形式
常见的三地址代码有三种基本形式,即加法、减法和赋值。
循环优化
定义
循环优化是指在编译过程中,对循环结构进行优化, 以提高目标代码的执行效率。
常见方法
将源程序分解成一个个的词素或标记。
语法分析
根据语言的语法规则,将词素或标记组合成一个个的语句或表达式。
语义分析
对语法分析得到的语句或表达式进行语义检查,确保其语义正确。
中间代码生成
基于语义分析的结果,生成中间代码。
02
语义分析技术
类型检查
类型检查是编译过程中对源代码进行语义分析的重要环节,其主要目的是 确保源代码பைடு நூலகம்类型安全。
常见的循环优化方法包括循环展开、循环合并、循环 嵌套等。
优化效果
通过循环优化,可以减少循环的次数,提高程序的执 行效率。

编译原理课程设计之第六章 语义分析

编译原理课程设计之第六章 语义分析

mcy
2
语义分析的任务:
计算各类语法成分的语义信息(属性信息),一般将收集
的语义信息存放到相应的信息表中,在编译程序中符号 表是用来存放源程序中标示符相关属性(语义)信息的一 种信息表。 静态语义检查
类型检查:指类型相容问题的检查,如果操作符作用于不相容的操作数, 则编译器应该报错。 上下文有关问题的检查:当某个对象出现时,要求它必须在前面的某个 适当位置已经出现过。 唯一性检查:有时,要求某个对象只能被定义一次。 控制流检查:引起控制流从某个结构中跳转出来的语句,必须能够决定 控制流转向的目标地址。
(1)所采用的语法分析方法
(2)属性的计算次序。 语法分析方法都要求从左向右处理输入程 序,等价于要求属性能通过从左向右遍历 分析树进行赋值。
mcy
44
定义属性a1,...,ak 的一个属性文法是L-属性(Lattributed)文法,如果满足
mcy
37
num→digit
num.val=digit.val digit.base=num.base digit.val=0 digit.val=1 digit.val=7
digit→0 digit→1 ...... digit→7
mcy
38
digit→8
digit→9
if digit.base=8 then digit.val=error else digit.val= 8 if digit.base=8 then digit.val= error else digit.val 9
mcy
29
文法规则
语义规则 var-list.dtype = type.dtype type.dtype = integer type.dtype = real

编译原理中的词法分析与语法分析原理解析

编译原理中的词法分析与语法分析原理解析

编译原理中的词法分析与语法分析原理解析编译原理是计算机科学中的重要课程,它研究的是如何将源程序翻译成目标程序的过程。

而词法分析和语法分析则是编译过程中的两个重要阶段,它们负责将源程序转换成抽象语法树,为接下来的语义分析和代码生成阶段做准备。

本文将从词法分析和语法分析的原理、方法和实现技术角度进行详细解析,以期对读者有所帮助。

一、词法分析的原理1.词法分析的定义词法分析(Lexical Analysis)是编译过程中的第一个阶段,它负责将源程序中的字符流转换成标记流的过程。

源程序中的字符流是没有结构的,而编程语言是有一定结构的,因此需要通过词法分析将源程序中的字符流转换成有意义的标记流,以便之后的语法分析和语义分析的进行。

在词法分析的过程中,会将源程序中的字符划分成一系列的标记(Token),每个标记都包含了一定的语义信息,比如关键字、标识符、常量等等。

2.词法分析的原理词法分析的原理主要是通过有限状态自动机(Finite State Automaton,FSA)来实现的。

有限状态自动机是一个数学模型,它描述了一个自动机可以处于的所有可能的状态以及状态之间的转移关系。

在词法分析过程中,会将源程序中的字符逐个读取,并根据当前的状态和字符的输入来确定下一个状态。

最终,当字符读取完毕时,自动机会处于某一状态,这个状态就代表了当前的标记。

3.词法分析的实现技术词法分析的实现技术主要有两种,一种是手工实现,另一种是使用词法分析器生成工具。

手工实现词法分析器的过程通常需要编写一系列的正则表达式来描述不同类型的标记,并通过有限状态自动机来实现这些正则表达式的匹配过程。

这个过程需要大量的人力和时间,而且容易出错。

而使用词法分析器生成工具则可以自动生成词法分析器的代码,开发者只需要定义好源程序中的各种标记,然后通过这些工具自动生成对应的词法分析器。

常见的词法分析器生成工具有Lex和Flex等。

二、语法分析的原理1.语法分析的定义语法分析(Syntax Analysis)是编译过程中的第二个阶段,它负责将词法分析得到的标记流转换成抽象语法树的过程。

程序设计语言与编译原理_第九章语义分析和中间代码生成

程序设计语言与编译原理_第九章语义分析和中间代码生成
为每个产生式配上一个语义子程序,完成语义检查和 语义处理:在语法分析过程中,当用一个产生式进行 匹配或归约时,就调用相应的语义程序进行翻译。
语义检查和语义处理 核心是生成相应的中间代码
程序设计语言与编译
三、语义值
在描述语义动作时,需要赋予每个文法符号以各种不 同的“值”,这些值统称为“语义值”.如,“类型”, “种属”,“地址”或“代码”等。通常用 X.TYPE,X.CAT,X.VAL来表示这些值。
形如x:=y op z的赋值语句,op为二目算术
算符或逻辑算符;
赋值语句x:=op y,op为一元算符,如一元
减uminus, not, 移位及转换算符(如将定点 数转换为浮点数);
赋值语句x:=y; 无条件转移语句 goto L;
16
程序设计语言与编译
条件转移语句 if x relop y goto L 或 if a goto
动态语义检查

需要生成相应的目标代码,它是在运行时进行的;

例如:除零溢出错误。
静态语义检查

在编译时完成的,它涉及以下几个方面:

(1) 类型检查

(2) 控制流检查

(3) 一致性检查
程序设计语言与编译
(1) 类型检查
int x; float f(); x = f();
符合变量声明的语法、语义 符合函数声明的语法、语义 符合赋值语句的语法、不符合语义
得较为容易,但语义分析不像词法分析和
语法分析那样可以分别用正规文法和上下
文无关文法描述。

由于语义是上下文有关的,因此语
义的形式化描述是非常困难的,目前较为
常见的是用属性文法作为描述程序语言语

编译原理 第9章 语义分析和代码生成(Modified)

编译原理 第9章 语义分析和代码生成(Modified)
精品课件
9.2 中间代码
精品课件
9.2 中间代码
波兰后缀表示除可用来表示表达式类的语言结构以外, 也能够通过操作符的扩充来表示其他的语言结构。
例(P171) 条 件 语 句 : if <expr> then <stmt1> else <stmt2> 可转换成波兰后缀表示:
<expr><label1>BZ<stmt1><label2>BR<stmt2 > 注意:在该波兰表示中,引入了BZ和BR操作符。
精品课件
9.2 中间代码
波兰后缀表示的特点: 操作符位于操作数之后。
例(P170) 算术表达式:F*3.1416*R*(H+R)
波兰后缀表示: F3.1416*R*HR+* 赋值表达式:S=F*3.1416/R*(H+R)
波兰后缀表示: SF3.1416*R/HR+*=
精品课件
9.2 中间代码
精品课件
9.2 中间代码
使用中间代码的优点: ➢不考虑机器的特性,使生成的中间代码较为简单。 ➢生成中间代码的编译程序移植性好,只需为该中 间代码开发一个解释器或者将中间代码翻译为目标 机指令就能在目标机上运行。 ➢在中间代码上更便于做优化处理。
常见的中间代码: ➢(1)波兰后缀表示 ➢(2)N-元表示
三元式 四元式
9.2 中间代码
用一个抽象机的汇编语言作为TEST编译器的目标语 言。TEST机的指令仅能作为TEST语言的目标。TEST 机的模拟程序直接从一个文件中读取汇编代码并执行 它,因此避免了由汇编语言翻译为机器代码的过程。 但是,这个模拟程序并非是一个真正的汇编程序,它 没有符号地址或标号。

编译原理课件-语义分析

编译原理课件-语义分析
end;{quicksort} begin readarray; quicksort(1,9) end. {sort }
22/94
Wensheng Li BUPT @ 2008
符号表的逻辑结构
sort nil head area a x readarray exchange quicksort
exchange head area
–控制流检查
• 检查控制语句是否使控制转移到一个合法的位置。
–唯一性检查
• 一个标识符在同一程序块中必须而且只能被说明一次 • CASE语句中用于匹配选择表达式的常量必须各不相同 • 枚举类型定义中的各元素不允许重复
–关联名字的检查
5/94
Wensheng Li BUPT @ 2008
类型检查
由类型检查程序完成 检验结构的类型是否和它的上下文所期望的一致, 如:
countx_totalb_loop
14/94
目标地址
指示运行时变量值存放的相对位置 对于静态存储分配的语言(如Fortran),目标地 址按连续的顺序分配,从0开始到m(m是分配给一 个程序的数据区的最大值)。 对于块结构的语言(如Pascal),通常采用二元地 址<BL,NO>
–BL:块的嵌套深度,用于确定分配给声明变量的块的数 据区的基址。
–编译程序在处理声明语句时调用两种操作
• 检索:查重、确定新表目的位置 • 插入:建立新的表目
–在程序中引用变量名时,调用检索操作
• 查找信息,进行语义分析、代码生成 • 可以发现未定义的名字
允许变量隐式声明的语言:
–标识符的每次出现都按首次出现处理 –检索:
• 已经声明,进行类型检查,... • 首次出现,插入操作,从其作用推测出该变量的全部属性
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

machunyan
西北工业大学软件与微电子学院
7
5.1 属性和属性文法
至今没有形式化的系统来描述语义,但 存在一种属性文法,将语义信息和程序 设计语言的语法结构联系起来。 补充说明合法程序的规格说明
machunyan

西北工业大学软件与微电子学院
8
5.1 属性和属性文法(续)
每个属性文法是一个三元式: A=(G, V, F) G是一个上下文无关文法; V是一个属性的有限集合; F是一个与属性有关的语义规则的有限集 合。
2. 静态语义检查举例:
类型检查:指类型相容问题的检查,如果操作符作用于不 相容的操作数,则编译器应该报错。 上下文有关问题的检查:当某个对象出现时,要求它必须 在前面的某个适当位置已经出现过。 唯一性检查:要求某个对象只能被定义一次。 控制流检查:引起控制流从某个结构中跳转出来的语句, 必须能够决定控制流转向的目标地址。 Break和continue语句是否在循环结构中? 对于一个方法调用,实际参数的类型和实际参数的个数是 否与方法的声明的参数特征相符? 数组下标引用是否超出范围? 数组下标是否是整数?
machunyan 西北工业大学软件与微电子学院 11
5.1 属性和属性文法(续)
属性a1,...,ak的属性文法是文法所有产生式的语 义规则的集合。一般将属性文法写成表格形式, 每个产生式用相应语义规则列出,如下所示:
文法规则
产生式1 ... 产生式n
语义规则
相关的属性等式 ... 相关的属性等式
machunyan
西北工业大学软件与微电子学院
12
5.1 属性和属性文法(续)
属性文法的作用? 根据已求得的各产生式的语义规则,遍历 语法分析的结果---语法树或分析树,计 算任意句子的推导过程中各文法符号对应 的属性值(例如:变量的数据类型、表达式的值、存 储器中变量的位置、程序的目标代码、或数的有效位数等), 根据属性值分析相关语义,或者将属性值 存储在符号表中,以供编译的后续阶段使 用。
machunyan
西北工业大学软件与微电子学院
9
5.1 属性和属性文法(续)
V: 每个文法符号(终结符号或非终结符 号)都有一个属性集(语义信息)。 如果X是一个文法符号,与X关联的属 性a的值记作X.a。
文法符号关联的属性可以代表

2018/10/15
变量的数据类型 表达式的值 存储器中变量的位置 程序的中间或目标代码片段 数的有效位数 ……等
西北工业大学软件与微电子学院
17
5.1 属性和属性文法(续)
属性文法的求解方法: 给出一个句子最左推导对应的分析树,而 且该句子的推导过程中基本涵盖各种语法 规则(即产生式规则)的运用。 根据该句子的分析树和已知文法符号的属 性值,概括出各节点属性值的计算规则, 将该计算规则作为节点对应的产生式的语 义规则,最后得到属性文法。
西北工业大学软件与微电子学院 machunyan 10
5.1 属性和属性文法(续)
F: 每个产生式都有一个与文法符号属性相关的 语义规则集合。对于上下文无关文法中的任一产 生式X0→X1X2...Xn,其语义规则定义格式如下: Xi.aj=fij(X0.a1,...,X0.ak,X1.a1,..., X1.ak,...,Xn.a1,...,Xn.ak) 其中,a1,...,ak是与各文法关联的属性集合;fij是 一个数学函数,表示文法符合Xi的第j个属性aj 是如何计算得到的。 所以,产生式的语义规则是产生式中相关文法符 号属性值的等式。
machunyan
西北工业大学软件与微电子学院
2
编译器逻辑结构的组成 常数表 符号表 错误处理器
源 代 码
词 法 分 析 程 序
语 法 分 析 程 序
语 义 分 析 程 序
中 间 代 码 生 成
代 码 优 化 程 序
目 标 代 码 生 成
目 标 代 码
machunyan
西北工业大学软件与微电子学院
machunyan
西北工业大学软件与微电子学院
16
文法规则 digit → 0 digit → 1 digit → 2 digit → 3 . . .
语义规则 digit.val = 0 digit.val = 1 digit.val = 2 digit.val = 3 . . .
machunyan
3
第5章 语义分析(续)
语义分析的任务:
1. 计算各类语法成分的语义信息(属性信息), 一般将收集的语义信息存放到相应的信息 表中,在编译程序中符号表是用来存放源 程序中标示符相关属性(语义)信息的一种 信息表。
machunyan
西北工业大学软件与微电子学院
4
第5章 语义分析(续)
语义分析的任务:
课程内容 第1章 概论 第2章 词法分析 第3章上下文无关文法 第4章语法分析 第5章语义分析 第6章运行时环境 第7章代码生成
2018/10/15
西北工业大学软件与微电子学院 machunyan
1
第5章 语义分析
程序设计语言的语义分为静态语义和动态语 义两种。 静态语义是指在编译阶段能够检查的语义; 动态语义是指在目标程序运行阶段能够检 查的语义。
machunyan 西北工业大学软件与微电子学院 13
5.1 属性和属性文法(续)
例5.1:求解下述无符号数文法的val(十进制 值)属性的属性文法。 number→number digit |digit digit→0|1|2|3|4| 5 |6|7|8|9 文法定义的合法的句子举例: 345对应的分析树
2018/10/15 西北工业大学软件与微电子学院 machunyan 5
第5章 语义分析(续)
2018/10/15
西北工业大学软件与微电子学院 machunyan
6
第5章 语义分析
5.1 属性和属性文法 5.2 符号表 5.3 数据类型和类型检查
文法符号语 义信息的计 算技术 语义分析 的两个主 要方面
machunyan
西北工业大学软件与微电子学院
14
数345对应 的分析树
machunyan
西北工业大学软件与微电子学院
15
文法规则 number1→number2 digit
语义规则 number1.val = number2.val*10 + digit.val
number→digit
number.val =digit.val
相关文档
最新文档