搜档网
当前位置:搜档网 › 语义分析与中间代码生成

语义分析与中间代码生成

语义分析与中间代码生成
语义分析与中间代码生成

实验内容:

可选择LL1分析法、算符优先分析法、LR 分析法之一,实现如下表达式文法的语法制导翻译过程。文法G[E]如下所示:

E →E+T | E-T | T

T →T*F | T/F | F

F →P^F | P

P →(E) | i

要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。

实验目的:

1.掌握语法制导翻译的基本功能。

2.巩固对语义分析的基本功能和原理的认识。

3.能够基于语法制导翻译的知识进行语义分析。

4.掌握类高级语言中基本语句所对应的语义动作。

5.理解并处理语义分析中的异常和错误。

实验要求:

1.在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;

2.要求详细描述所选分析方法进行制导翻译的设计过程;

3.完成对所设计分析器的功能测试,并给出测试数据和实验结果;

4.为增加程序可读性,请在程序中进行适当注释说明;

5.整理上机步骤,总结经验和体会;

6.认真完成并按时提交实验报告。

实验步骤:

---1语义子程序为:(会生成四元式的部分:)

(1) P →i

(2) E →E+T emit(+,E.place,T.place,E.place);

(3) E →E-T emit(-,E.place,T.place,E.place);

(4) T →T*F emit(*,T.place,F.place,T.place);

(5) T →T/F emit(/,T.place,F.place,T.place);

(6) F →P^F emit(^,P.place,F.place,F.place);

(7) P →(E)

开始 词法分析

中间代码

语法、语义分析 出错处理 语法、语义分析

中间代码生成 结束

#include

#include

#include

#include

using namespace std;

int table[10][10] = {

{ 1, 1, -1, -1, -1, -1, -1, 1, 1 },

{ 1, 1, -1, -1, -1, -1, -1, 1, 1 },

{ 1, 1, 1, 1, -1, -1, -1, 1, 1 },

{ 1, 1, 1, 1, -1, -1, -1, 1, 1 },

{ 1, 1, 1, 1, -1, -1, -1, 1, 1 },

{ 1, 1, 1, 1, 1, 2, 2, 1, 1 },

{ -1, -1, -1, -1, -1, -1, -1, 0, 1 },

{ 1, 1, 1, 1, 1, 2, 2, 1, 1 },

{ -1, -1, -1, -1, -1, -1, -1, 2, 0 } };//1表示优先,-1表示落后,0表示同等,2表示不具可比性

char stSymbol[100];// 定义栈,用来存储终结符

char stSemantic[100];//语义栈

int top = -1 ;//栈顶指针

int i = 0;

static int count = 75;//新建的符号的小标

// 判断是否为终结符

int IsVT(char str) {

if (str=='+' || str=='-' || str=='*' || str=='/' || str=='^' || str=='(' || str=='i' || str==')' || str=='#' ) return 1;

return 0;

}

// 操作符判断

int IsOpe(char str) {

if (str=='+' || str=='-' || str=='*' || str=='/' || str=='^')

return 1;

return 0;

}

// 有字符判断该字符在table数组中的位置

int Index(char str) {

switch (str) {

case '+':

return 0;

case '-':

return 1;

case '*':

return 2;

case '/':

case '^':

return 4;

case 'i':

return 5;

case '(':

return 6;

case ')':

return 7;

case '#':

return 8;

}

return 0;

}

int Compare(char top, char input) {

int i = Index(top);

int j = Index(input);

return table[i][j];

}

//动作分析

string Action(char vt,char &s1,char &s2,int i,string &s3){ string str;

switch(vt){

case 'i':

s1 = 'F';

s2 = stSemantic[i];

s3 = "1";

return "";

case '+':

s1 = 'E';

s2 = (char)count++;

s3 = "2";

str = "(+,";

str += stSemantic[i-1];

str += ",";

str += stSemantic[i+1];

str += ",";

str += s2;

str += ")";

return str;

case '-':

s1 = 'E';

s2 = (char)count++;

s3 = "3";

str = "(-,";

str += stSemantic[i+1];

str += ",";

str += s2;

str += ")";

return str;

case '*':

s1 = 'T';

s3 = "4";

s2 = count++;

str = "(*,";

str += stSemantic[i-1];

str += ",";

str += stSemantic[i+1];

str += ",";

str += s2;

str += ")";

return str;

case '/':

s1 = 'T';

s2 = (char)count++;

s3 = "5";

str = "(/,";

str += stSemantic[i-1];

str += ",";

str += stSemantic[i+1];

str += ",";

str += s2;

str += ")";

return str;

case '^':

s1 = 'F';

s2 = (char)count++;

s3 = "6";

str = "(^,";

str += stSemantic[i-1];

str += ",";

str += stSemantic[i+1];

str += ",";

str += s2;

str += ")";

return str;

case ')':

s1 = stSymbol[top-1];

return "";

case '#':

return "";

}

return "";

}

void Fenxi(char* input)

{

cout<<"************************生成四元式的过程************************"<

cout<<"输入串\t\t 符号栈\t 语义栈\t 生成四元式\t"<

char ch;

char subInput;

do {

string sbSym,sbSem,sbTag3;

char sbTag1,sbTag2;

if (IsVT(stSymbol[top]) == 1)

i = top ;

else

i = top-1;//栈中相连的必有一个非终结符

if(*input == '#'){

ch = *input ;

}else{

subInput = input[0];//输入符的首字符

if(IsOpe(subInput) == 0)//不是操作符

ch = 'i';

else{

ch = subInput;

subInput = '_';

}

}

if (Compare(stSymbol[i], ch) == 0 || Compare(stSymbol[i], ch) == -1){ for(int j=0; j<= top; j++){

sbSym += stSymbol[j];

sbSem += stSemantic[j];

}

if(ch != '#'){

cout<

stSymbol[++top] = ch;

stSemantic[top] = subInput;

input = input++;

continue;

}else{//只剩下'#'时

return;

}

}

else if(Compare(stSymbol[top], ch) == 2){

cout<<"非法语句!!"<

return;

}

if (Compare(stSymbol[i], ch) == 1) {

char com;

int t = i;

do {//找出最左素短语

com = stSymbol[t];

if (IsVT(stSymbol[t-1]) == 1)

t = t -1;

else

t = t -2;

} while (Compare(stSymbol[t], com) == 0);

for(int j=0; j<= top; j++){

sbSym += stSymbol[j];//栈中内容

sbSem += stSemantic[j];

}

string temp;

temp = Action(stSymbol[i],sbTag1,sbTag2,i,sbTag3);

cout<

top = t+1;

stSymbol[top] = sbTag1;//规约入栈

stSemantic[top] = sbTag2;//语义入栈

}

} while(ch != '#' || top > 0);

}

void main()

{

//初始化栈

stSymbol[++top] = '#';

stSemantic[top] = '_';

char input[30];

cout<<"************************请输入要检验的输入串(以#结束):*************************"<

cout<<"************************此程序仅限于输入不含'(',')'的输入串:*******************"<

cin>>input;

Fenxi(input);

}

---4结果截图:

实验总结

通过实验实现语法制导翻译功能,得到四元式,初步掌握分析器的功能测试【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

编译原理语义分析实验报告——免费!

语义分析实验报告 一、实验目的: 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 二、实验要求: 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 三、算法思想: 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 #include #include #include 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);

实验五 编译 用语法制导方式生成中间代码生成器

实验5 用语法制导方式生成中间代码生成器 一、实验目的 掌握语法制导定义和翻译的原理和技术,在语法分析器的基础上,加上语义分析,构造一个中间代码生成器。 二、实验内容 在实验四生成的语法分析器基础上加入语义动作,将源程序翻译为对应的中间代码序列。 三、实验要求 1. 个人完成,提交实验报告。实验报告必须包括设计的思路,以及测试报告(输入测试例子,输出结果)。 2. 实验报告中给出采用测试源代码片断,及其对应的三地址码形式(内部表示形式可以自行考虑)。 例如,程序片断 对应的中间代码为:

四、实验过程 本次实验运用flex和bison工具进行中间代码的生成。并自动生成中间代码。 1.首先创建一个example文件夹,该文件夹中包含有flex.exe 2.用文本编译器编辑相应的flex文件mylex.l,此次mylex.l可以在上次实验的 l文件上做一些修改,再利用flex将l文件生成相应的lex.yy.c程序,mylex.l 的代码如下所示: mylex.l %{ #include "myyacc.tab.h" %} delim [ \t\n\r] ws {delim}+ letter [A-Za-z] digit [0-9] id {letter}({letter}|{digit})* integer {digit}+ exponent E[+-]?{integer} number {integer}{exponent}? real integer(\.integer)?{exponent}? %option noyywrap %% "<"|"<="|">"|">="|"!="|"==" { filloperator(&yylval, yytext); return( REL); }

语义分析和中间代码产生

第七章语义分析和中间代码产生 本章概述 上一章我们介绍了属性文法和语法制导翻译,本章我们将把上章所介绍的方法和技术应用于语义分析和中间代码产生中。 主要学习内容:中间语言的形式——后缀式、图表示法、三地址代码,说明语句的语义分析,赋值语句的翻译,布尔表达式的翻译,控制语句的翻译,过程调用的处理,类型检查。 学习目标:熟悉几种中间语言的描述,掌握各种语句的翻译方法,会给出各种语句的语义规则和语义子程序。 学习重点和难点:如何把属性文法和语法制导翻译的方法和技术应用于语义分析和中间代码产生中,特别是表达式和控制语句的翻译。 7.1 中间语言 7.1.1 中间语言 虽然源程序可以直接翻译为目标语言代码。但是许多编译程序都采用了独立于机器的、复杂性介于源语言和机器语言之间的中间语言。常见的中间语言形式包括:后缀式,三地址代码(包括三元式,四元式,间接三元式),DAG图表示和抽象语法树等。 1. 后缀式 后缀式表示法是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法,因此又称逆波兰表示法。这种表示法是,把运算量(操作数)写在前面,把算符写在后面(后缀)。例如,把a+b写成ab+,把a*b写成ab*。 2. 抽象语法树 在语法树中去掉那些对翻译不必要的信息,从而获得更有效的源程序中间表示。这种经变换后的语法树称之为抽象语法树(Abstract Syntax Tree)。 3. DAG 与抽象语法树一样,对表达式中的每个子表达式,DAG(Directed Acyclic Graph)中都有一个结点。一个内部结点代表一个操作符,它的孩子代表操作数。两者不同的是,在一个DAG 中代表公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树。 4. 三地址代码 三地址代码是由下面一般形式的语句构成的序列:

编译原理知识点汇总

编译原理的复习提纲 1.编译原理=形式语言+编译技术 2.汇编程序: 把汇编语言程序翻译成等价的机器语言程序 3.编译程序: 把高级语言程序翻译成等价的低级语言程序 4.解释执行方式: 解释程序,逐个语句地模拟执行 翻译执行方式: 翻译程序,把程序设计语言程序翻译成等价的目标程序 5.计算机程序的编译过程类似,一般分为五个阶段: 词法分析、语法分析、语义分析及中间代码生成、代码优化、目标代码生成 词法分析的任务: 扫描源程序的字符串,识别出的最小的语法单位(标识符或无正负号数等) 语法分析是: 在词法分析的基础上的,语法分析不考虑语义。语法分析读入词法分析程序识别出的符号,根据给定的语法规则,识别出各个语法结构。 语义分析的任务是检查程序语义的正确性,解释程序结构的含义,语义分析包括检查变量是否有定义,变量在使用前是否具有值,数值是否溢出等。

语法分析完成之后,编译程序通常就依据语言的语义规则,利用语法制导技术把源程序翻译成某种中间代码。所谓中间代码是一种定义明确、便于处理、独立于计算机硬件的记号系统,可以认为是一种抽象机的程序 代码优化的主要任务是对前一阶段产生的中间代码进行等价变换,以便产生速度快、空间小的目标代码 编译的最后一个阶段是目标代码生成,其主要任务是把中间代码翻译成特定的机器指令或汇编程序 编译程序结构包括五个基本功能模块和两个辅助模块 6.编译划分成前端和后端。 编译前端的工作包括词法分析、语法分析、语义分析。编译前端只依赖于源程序,独立于目标计算机。前端进行分析 编译后端的工作主要是目标代码的生成和优化后端进行综合。独立于源程序,完全依赖于目标机器和中间代码。 把编译程序分为前端和后端的优点是: 可以优化配置不同的编译程序组合,实现编译重用,保持语言与机器的独立性。 7.汇编器把汇编语言代码翻译成一个特定的机器指令序列 第二章 1.符号,字母表,符号串,符号串的长度计算P18,子符号串的含义,符号串的简单运算XY,Xn, 2.符号串集合的概念,符号串集合的乘积运算,方幂运算,闭包与正闭包的概念P19,P20A0 ={ε} 3.重写规则,简称规则。非xx(V

实验1-3-《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

编译原理课程设计(词法分析,语法分析,语义分析,代码生成)

编译原理课程设计(词法分析,语法分析,语义分析,代码 生成) #include #include #include #include #include #include using namespace std; /************************************************/ struct token// token { int code;// int num;// token *next; }; token *token_head,*token_tail;//token struct str// string { int num;// string word;// str *next; }; str *string_head,*string_tail;//string struct ivan// {

char left;// string right;// int len;// }; ivan css[20];// 20 struct pank// action { char sr;// int state;// }; pank action[46][18];//action int go_to[46][11];// go_to struct ike// { ike *pre; int num;// int word;// ike *next; }; ike *stack_head,*stack_tail;// struct L// { int k; string op;// string op1;// string op2;// string result;// L *next;// L *Ltrue;//true L *Lfalse;//false };

现代汉语语法的五种分析方法

现代汉语语法的五种分析方法

现代汉语语法的五种分析方法 很有用,请好好学习之。 北语之声论坛专业精华转贴 现代汉语语法的五种分析方法是语法学基础里 很重要的一个内容,老师上课也会讲到,我在这 里把最简略的内容写在下面,希望能对本科生的专业课学习有所帮助 详细阐释中心词分析法、层次分析、变换分析法、语义特征分析法和语义指向分析的具体内涵:一. 中心词分析法: 分析要点: 1.分析的对象是单句; 2.认为句子又六大成分组成——主语、谓语(或述语)、宾语、补足语、形容词附加语(即定语)和副词性附加语(即状语和补语)。 这六种成分分为三个级别:主语、谓语(或述语)是主要成分,宾语、补足语是连 带成分,形容词附加语和副词性附加语是附加成分; 3.作为句子成分的只能是词; 4.分析时,先找出全句的中心词作为主语和谓

语,让其他成分分别依附于它们; 5.分析步骤是,先分清句子的主要成分,再决定有无连带成分,最后指出附加成分。 标记: 一般用║来分隔主语部分和谓语部分,用══标注主语,用——标注谓语,用~~~~~~标注宾语,用()标注定语,用[ ]标注状语,用< >标注补语。 作用: 因其清晰明了得显示了句子的主干,可以一下子把握住一个句子的脉络,适合于中小学语文教学,对于推动汉语教学语法的发展作出了很大贡献。 还可以分化一些歧义句式。比如:我们五个人一组。 (1)我们║五个人一组。(2)我们五个人║一组。 总结:中心词分析法可以分化一些由于某些词或词组在句子中可以做不同的句子成分而造成的歧义关系。 局限性: 1.在一个层面上分析句子,

层次性不强; 2.对于一些否定句和带有修饰成分的句子,往往难以划分; 如:我们不走。≠我们走。 封建思想必须清除。≠思想清除。 3. 一些由于句子的层次关系 不同而造成的歧义句子无法分析; 如:照片放大了一点儿。咬死了猎人的狗。 二. 层次分析: 含义: 在分析一个句子或句法结构时,将句法构造的层次性考虑进来,并按其构造层次逐层进行分析,在分析时,指出每一层面的直接组成成分,这种分析就叫层次分析。 朱德熙先生认为,层次分析不能简单地将其看作是一种分析方法,而是应当看做一种分析原则,是必须遵守的。(可以说说为什么) 层次分析实际包含两部分内容:一是切分,一是定性。切分,是解决一个结构的直接组成成分到底是哪些;而定性,是解决切分所得的直接组成成分之间在句法上是什么关系。

现代汉语语法研究方法的演变及原因

现代汉语语法研究方法的演变及原因 摘要:本文以特定时期著名的语法理论和语法著作为研究对象,分析现代汉语语法研究方法在一个世纪的演变与发展,并试图找出语法研究方法演变与发展的原因。 关键词:语法研究、方法 一、现代汉语语法研究概况 1898年,马建忠参阅西洋语法,写出了《马氏文通》,才标志着中国现代语法学的全面建立。1924年,黎锦熙的《新著国语文法》问世,这是以白话文为对象,全面研究现代汉语语法的第一部力作。《新著国语文法》建立句本位,打破了《马氏文通》以来的“词类本位”的传统。他把句子划分成主语、述语、宾语、补足语、形容性的附加语、副词性附加语等六种成分,第一次明确地规定了分析句子的方法,建立了完备的现代汉语语法体系。这个时期,语法专题论文较少,最重要的当推赵元任的《北京、苏州、常州语助词的研究》(1926)。1938年,陈望道等人在上海发起了关于文法革新的讨论,这场讨论的目的是“以科学的方法严谨的态度缔造中国文法体系”。真正建立起新的汉语语法体系的是吕叔湘的《中国文法要略》(1942)和王力的《中国现代语法》(1943)此外,还有高名凯的《汉语语法论》(1948)美国赵元任的《国语入门》(1948)(《北京口语语法》)等重要作品问世。1949年新中国的成立,给汉语语法学带来了前所未有的变化,由于党和政府的提倡,社会上很快掀起了学习语法修辞的热潮。这个

时期可以称作语法学的发展时期。毛泽东对有关人士指示:“在报上写文章及为学校写文法教科书”,要在全社会普及“文法教育”。1951年6月6日,《人民日报》发表社论《正确使用祖国的语言,为语言的纯洁和健康而斗争!》。从此开始普及语法知识,重要的著作有吕叔湘、朱德熙的《语法修辞讲话》(1951)、吕叔湘的《语法学习》(1951)和张志公《汉语语法常识》(1952)等。一些学者进行科学的语法研究,对当时及以后的语言学产生了重要影响,如丁声树的《现代汉语语法讲话》、王力的《汉语史稿》和陆志韦的《汉语构词法》等。这个时期的语法研究还有一项引人注目的成果,即教学语法。中国第一次有了全国统一使用的教学语法体系——“暂拟汉语教学语法系统”。它划分词类是根据词的意义和语法特点,往往对每类词的语法特点都详加说明,分析句子时采用中心词分析法,在确定主语宾语时不依据施受关系,而大体依据位置的先后。到了新时期,汉语语法研究空前活跃,空前繁荣,空前深入,是语言学科中发展最快的一个部门,取得了举世瞩目的成就。吕叔湘的《汉语语法分析问题》(1979)、朱德熙的《现代汉语语法研究》(1980)影响深远。80年代以来,研究的实践越来越证明,对于现代汉语语法研究来说,“多角验证”的思路是既宽展又有效的。90年代以后,现代汉语语法研究比以往更加活跃,研究领域涉及汉语语法的各个方面,研究队伍更加壮大,取得的成果更加引人注目,新的理论、新的见解被提出来。“三个平面”理论、本位理论、配价语法、汉语的时体研究等问题都成为二十世纪末汉语语法研究的热点。这个时期,进一步加强了句法

中间代码生成具体实验过程含代码

实验三中间代码生成 学号:1152185;姓名:马小军 实验目的 1.了解并掌握中间代码的生成过程和作用 2.了解并掌握四元式 3.体会属性文法在中间代码生成过程中的作用 。 实验环境 Windows7操作系统vs2010编程环境 实验内容 从文件中读入表达式,输出其四元式的结果序列 本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式 实验原理 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符数字,则分析到该数字串的结束并将该数字存入数组。 (3)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (4)重复上述操作(2)-(3)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为四元式。 下面给出算法流程图

实验步骤 打开并运行软件 根据提示输入要分析的源程序(文件目录下有写好的文件源文件1.txt输入即可) 运行输出结果 例如将以下源文件放入test.txt 运行结果 a:=b*c+b*d 思考 同样的思路对算法进行适当改动就可以生成其它形式的中间代码 【其他部分】 设计原理和算法思想参考 《程序设计语言编译原理》第三版国防工业出版社作者陈火旺等

编译原理课程设计(词法分析,语法分析,语义分析,代码生成)

#include #include #include #include #include #include using namespace std; /*********************下面是一些重要数据结构的声明***************************/ struct token//词法token结构体 { int code;//编码 int num;//递增编号 token *next; }; token *token_head,*token_tail;//token队列 struct str//词法string结构体 { int num;//编号 string word;//字符串内容 str *next; }; str *string_head,*string_tail;//string队列 struct ivan//语法产生式结构体 { char left;//产生式的左部 string right;//产生式的右部 int len;//产生式右部的长度 }; ivan css[20];//语法20个产生式 struct pank//语法action表结构体 { char sr;//移进或归约 int state;//转到的状态编号 }; pank action[46][18];//action表 int go_to[46][11];//语法go_to表 struct ike//语法分析栈结构体,双链 { ike *pre; int num;//状态 int word;//符号编码 ike *next;

编译原理--词法分析,语法分析,语义分析(C语言)

词法分析 #include #include #include using namespace std; #define MAXN 20000 int syn,p,sum,kk,m,n,row; double dsum,pos; char index[800],len;//记录指数形式的浮点数 char r[6][10]={"function","if","then","while","do","endfunc"}; char token[MAXN],s[MAXN]; char ch; bool is_letter(char c) { return c>='a' && c<='z' || c>='A' && c<='Z'; } bool is_digtial(char c) { return c>='0' && c<='9'; } bool is_dot(char c) { return c==',' || c==';'; } void identifier()//标示符的判断 { m=0; while(ch>='a' && ch<='z' || ch>='0' && ch<='9') { token[m++]=ch; ch=s[++p]; } token[m]='\0';

ch=s[--p]; syn=10; for(n=0;n<6;n++) if(strcmp(token,r[n])==0) { syn=n+1; break; } } void digit(bool positive)//数字的判断{ len=sum=0; ch=s[p]; while(ch>='0' && ch<='9') { sum=sum*10+ch-'0'; ch=s[++p]; } if(ch=='.') { dsum=sum; ch=s[++p]; pos=0.1; while(ch>='0' && ch<='9') { dsum=dsum+(ch-'0')*pos; pos=pos*0.1; ch=s[++p]; } if(ch=='e') { index[len++]=ch; ch=s[++p]; if(ch=='-' || ch=='+') { index[len++]=ch; ch=s[++p]; } if(!(ch>='0' && ch<='9')) { syn=-1; } else

义素分析法分析“看的方式”语义场

义素分析法分析“看的方式”语义场 摘要:“看的方式”的语义场可以归为同义语义场。通过义素分析的方法,并写出 每个词的基本义的义素表达式,来分析该语义场内的词之间的异同。词不仅有理 性意义还有感性意义,通过感性意义能更好的区别和运用同义词。 关键字:义素分析法,同义词辨析,看的方式 一、义素分析法在同义词辨析中的运用 同义词辨析一直以来都是语言研究的重要方面,不仅是在语言研究,还是在 语言运用中,甚至在语言的教学中都具有特殊的意义。义素分析法是准确描写和 掌握词义的有效方法。词义并不是一个整体,而是有若干层次的结构,义素是构 成词义的最小意义单位。将义素分析法引入对外汉语词汇教学,可以对词义的微 观层面进行准确有效的分析,把词义分割成若干个义素的组合,不仅有利于准确 掌握同义词之间的大同小异,还能提高人们对语言的运用能力,有利于第二语言 学习者在语言学习中理解两个及两个以上抽象的同义词,加深对汉语词汇的理解 和运用。 本文主要通过义素分析法来分析比较“看的方式”的语义场,来说明义素分析 法在同义词比较中的运用。运用义素分析法的表达式来研究“看的意义相同或相近的词”。本文研究的看的方式词有:看、望、顾、瞪、瞥、瞅、盯、窥、伺、瞟、瞰。 二、“看的方式”的语义场义素分析的方法和步骤 1.确立语义场 语义场是通过不同词之间的对比,根据它们词义的共同特点或关系划分出来 的类。同义语义场相当于一些论著中讲的一组广义的同义词(即不包括等义词),它所包括的各个义位间大同小异。所谓的同,表现为基本义相同或者是基本义有 一部分相同。所谓的异,就是附加义不同,或者是基本义有一部分不同,又或是 不只是基本义有一部分不同附加义也不一样。“看的方式”语义场内的词是眼部动 作描写都有“用眼睛看”这一基本义项,因此,这些看的方式词都可以看作是“看” 这个词的同义词。那么“看的方式”就构成了一个眼部动作的同义语义场。根据义 素分析法的分析并通过表达式的比较,可以准确的辨析出同义语义场内各个词之 间的细微区别,有利于第二语言的学习。 2.通过义素的具体对比分析“看的方式:看、望、顾、瞪、瞥、瞅、盯、窥、伺、瞟、瞰”的异同。 这些字从现代汉语词典第七版中查到“看的方式”词的意义如下所示: (1)看: [动] 使视线接触人或物:~书|~电影|~了他一眼。 [动] 观察并加以判断:我~他是个可靠的人l你~这个办法好不好。 [动] 取决于;决定于:这件事能 不能成功全~你了|飞机能否准时起飞,要~天气如何。 [动] 访问;探望:~望|~朋友。 [动] 对待:~待|另眼相~|别拿我当外人~。 [动] 诊治:王大夫把我的病~好了。照料:照~l衣帽自~。 [动] 用在表示动作或变化的词或词组前面,表示预见到某 种变化趋势,或者提醒对方注意可能发生或将要发生的某种不好的事情或情况: 行情~涨|别跑!~摔着!|~饭快凉了,快吃吧。 [助] 用在动词或动词结构后面, 表示试一试(前面的动词常用重叠式):想想~I找找~|等一等~l评评理~先做几 天~。 (2)望: [动] 向远处看:登山远~|一~无际的稻田。观看;察看:~风!观~|~ 闻问切。探望:拜~|看~。盼望;希望①:~子成龙l~准时到会。盼头;希望②:

语言学概论分类模拟语法(四)

语言学概论分类模拟语法(四) 分析题 1. 分析下面两个有歧义的语言片段,分析造成歧义的原因: (1)你这倒霉蛋的弟弟(2)三个艺术学院的学生 答案:(1)你这倒霉蛋的弟弟 属于组合歧义中的词义歧义,语义指向不同造成歧义。“倒霉蛋”可以指向“我”,意思是我是个倒霉蛋,我有个弟弟。“倒霉蛋”还可以指向“弟弟”,意思是我的弟弟是个倒霉蛋。 (2)三个艺术学院的学生 属于组合歧义中的语法歧义,层次不同造成歧义。“三个”可以修饰“艺术学院”,意思是有三个艺术学院,学生是这三个艺术学院的。“三个”也可以修饰“学生”,意思是艺术学院的三个学生。 2. 分析下面语段的层次,并说明其中含有哪几个词组、哪几个词、哪几个语素: 两本儿书、一份报纸我都收起来了。 答案:分析下面语段的层次,并说明其中含有哪几个词组、哪几个词、哪几个语素: 词组:两本儿书一份报纸我都收起来了 词:两本书一份报纸我都收起来了 语素:两本书一份报纸我都收起来了 3. 下面是台湾高山族阿眉斯语的一些句子和对应的汉语意义: nipatafaj kaku tiniraan. 我去陪伴他。 陪伴我他 niala tnira tura awaw. 他去拿那盏灯。 拿他那灯 u parakataj tmi. 阿麦是司机。 是司机阿麦 tku wama nimi. 阿麦父亲叫古拉斯。

古拉斯叫父亲阿麦 nitala hu kaku tmian. 我再去等一下阿麦。 等再我阿麦 niama kami tmian. 我们去阿麦那儿玩。 去玩我们阿麦 (1)写出上述材料反映的句子成分的语序。 (2)上述材料反映出来的表人专名有什么语法范畴? (3)上述材料反映出来的人称代词有什么语法范畴? (4)上述语法范畴是用什么语法手段表示的? (5)写出阿眉斯语表示宾格的语素。 答案:(1)上述材料反映阿眉斯语的句子成分的优势语序是BAC,即动词——施事——受事。 (2)上述材料反映表人专名的语法范畴有“格”,包括主格(如阿麦的主格mi)、所有格(如阿麦的形容词性所有格nimi和名词性所有格mian)和宾格(如阿麦的宾格mian)。 (3)上述材料反映出来的人称代词的语法范畴有“格”和“数”,“格”包括主格(如他nira)、宾格(如他iniraan),“数”包括单数(如我kaku)和复数(如我们kami). (4)上述语法范畴是用外部附加(ni)和内部屈折(如kaku—kaini)表示的。 (5)阿眉斯语表示宾格的语素有前加的i和后加的an。 4. 试以变换分析法说明下列句子的意义差异。 (1)墙上挂着画。 (2)台上演着梆子戏。 (3)山上架着炮。 答案:以上句子可以变换为: (1)墙上挂着画。………………………………………(1)a画挂在墙上。√ (2)台上演着梆子戏。…………………………………(2)a梆子戏演在台上。× (3)山上架着炮。………………………………………(3)a炮架在山上。√ (1)墙上挂着画。………………………………………(1)b墙上正在挂画。× (2)台上演着梆子戏。…………………………………(2)b台上正在演梆子戏。√ (3)山上架着炮。………………………………………(3)b山上正在架炮。√ 通过变换可见:“挂”的语义特征[+存现][-持续],“演”的语义特征[-存现][+持续],“架”的语义特征[+存现][+持续],即(1)墙上挂着画。表示存现、附着。(2)台上演着梆子戏。表示持续。(3)山上架着炮。有歧义,既可表示存现,又可表示持续。

《编译原理》总复习-07级

《编译原理》总复习-07级 第一章编译程序的概述 (一)内容 本章介绍编译程序在计算机科学中的地位和作用,介绍编译技术的发展历史,讲解编译程序、解释程序的基本概念,概述编译过程,介绍编译程序的逻辑结构和编译程序的组织形式等。 (二)本章重点 编译(程序),解释(程序),编译程序的逻辑结构。 (三)本章难点 编译程序的生成。 (四)本章考点 全部基本概念。 编译程序的逻辑结构。 (五)学习指导 引论部分主要是解释什么是编译程序以及编译的总体过程。因此学习时要对以下几个点进行重点学习:翻译、编译、目标语言和源语言这几个概念的理解;编译的总体过程:词法分析,语法分析、语义分析与中间代码的生成、代码优化、目标代码的生成,以及伴随着整个过程的表格管理与出错处理。 第三章文法和语言课外训练 (一)内容 本章是编译原理课程的理论基础,主要介绍与课程相关的形式语言的基本概念,包括符号串的基本概念和术语、文法和语言的形式定义、推导与归约、句子和句型、语法分析树和二义性文法等定义、文法和语言的Chomsky分类。 (二)本章重点 上下文无关文法,推导,句子和句型,文法生成的语言,语法分析树和二义性文法。(三)本章难点 上下文无关文法,语法分析树,文法的分类。 (四)本章考点 上下文无关文法的定义。 符号串的推导。 语法分析树的构造。 (五)学习指导 要构造编译程序,就要把源语言用某种方式进行定义和描述。学习高级语言的语法描述是学习编译原理的基础。上下文无关文法及语法树是本章学习的重点。语法与语义的概念;程序的在逻辑上的层次结构;文法的定义,文法是一个四元组:终结符号集,非终结符号集,开始符号、产生式集;与文法相关的概念,字符,正则闭包,积(连接),或,空集,产生式,推导,直接推导,句子,句型,语言,最左推导,最右推导(规范推导);学会用文法来描述语言及通过文法能分析该文法所描述的语言;语法树及二义性的概念、能通过画语法树来分析一个文法描述的语言是否具有二义性;上下文无关文法的定义和正规文法的定义,能判断一个语言的文法是哪一类文法。 附训练试题:

中间代码生成-四元式设计

中间代码生成-四元式设计文档 实验任务: 在实验4的基础上,完成以下描述赋值语句和算数表达式文法G[A]的语法制导生成中间代码四元式的过程。 A-->V:=E V--><标识符> E,E+T|E-T|T T,T*F|T/F|F F,(E)|<标识符> 说明: 标识符的定义参见实验一 程序的功能描述 从文件中读入表达式,输出其四元式的结果序列本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式,其功能还需要进一步完善。 程序结构描述 打开文件 成功 N Y 结束 调用scan()函数从 文件读入表达式 输出所读入的表达式 调用生成四元式函数 siyuanshi() 表达式中是否有括号 N Y 处理括号内的

处理乘除加减和赋值运算sum=0 N Y 输出成功输出错误提示 结束 程序测试方案 测试用例一: d=a+b*(3*n)/(b-a) 测试用例二: x=x*(x+y-(x-y)/(z+x)-y)

实验总结 此程序基本达到了实验要求,能够生成简单的赋值及算数表达式中间代码的四元式,但其功能实在是过于简单。第一次调试通过后程序还存在以下不足: (1) 此程序只能从文件中读入一个表达式,读入多个则 会出错; (2) 所读入的表达式中若含有多于一个括号,程序会出 错; (3) 括号内若多于一个表达式则会出错; (4) 在测试用例二中的分析过程明显是错误的,这足以 看出程序的漏洞很多 但经过进一步优化算法,以上问题基本解决,但程序中仍然存在很多不足,例如时间效率和空间效率方面做的还不够好,要改善这些不足还需要进一步完善程序,在以后的学习生活中我会根据所学知识的不断深入而不断完善此程序,争取使其功能更加强大。 经过这次实验我更加深刻的理解了生成中间代码的算法思想,及时的将所学知识用于实践,更加深刻的掌握了所学知识。 附录 #include #include #include using namespace std; #define MAX 100 int m=0,sum=0;//sum用于计算运算符的个数 //m用于标记输入表达式中字符的个数 char JG='A'; char str[MAX];//用于存输入表达式

语义指向分析刍议

语文研究 1998年第3期(总第68期) 语义指向分析刍议 周 刚 80年代以来,我国汉语语法研究出现了一种新的语义分析方法,就是语义指向分析。随着语法研究从描写到解释不断深入和发展,语义指向分析已经越来越受到重视。但是,对这一方法的系统探讨和研究还不多见,本文旨在对语义指向分析的演进、类型、作用和语义指向的形式标志等问题加以探讨,以期起到抛砖引玉的作用。 1 语义指向分析的演进 1 1 语义指向分析的来源 关于语义指向分析的来源,语法学界已有两种说法:一种认为,(陆俭明1995)语义指向分析产生于80年代,胡树鲜(1982)在 两组副词的语义特点及其多项作用点 一文中已有萌芽,沈开木(1983)开始提到语义关系上的 指向 ,而第一次完整使用语义指向这个术语的是刘宁生(1984)。另一种则认为(沈开木1996),语义指向是由 指向 演化而来, 指向 是吕叔湘对沈开木(1983)一文审稿时提出来的,后来邵敬敏(1985)提出 语义指向 这一术语。 笔者有不同的看法。其实语义指向分析的源头还可以追溯到60年代,文炼(1960)就已指出汉语的句子在形式和意义上的不一致性,并且具体分析了这种语法现象: 他洗衣服洗得干干净净。 他看小说看得着了迷。 第 两句的格式相同,都是 主 谓 宾 谓(重用) 补 。但是表达的语义关系不完全一样:第 句的补语是说明宾语的,而第 句的补语是说明主语的。 文章虽然没有用到 语义指向 这一术语,但是使用了 说明 一词,相当于语义的指向。接着,李临定(1963)进一步讨论了有关补语跟其他成分的语义关系问题,却也没有使用 语义指向 这一术语,而延续使用 说明 一词。语义指向分析方法至此呈现萌芽状态。到70年代末,著名语言学家吕叔湘(1979)第一次明确地提出了 在语义上A指向C 的说法: 也有这种情形:论结构关系,A应该属于B,但是在语义上A指向C,例如:(a) 圆圆的排成一个圈 (圆的圈)|(b) 走了一大截冤枉路 (走得冤枉)|(c) 几个大商场我都跑了 (都总括几个)。 吕先生提纲挈领地分析了形容词状语、定语和副词状语三种成分的语义指向,为语法研究指出了一个新的方向。进入80年代,沈开木(1983)开始使用 指向 这一术语,分析了 也 字语义上的 多项指向 问题。刘宁生(1984)首次使用 语义指向 这一术语,论述了在句首的 在 介词结构的语义指向,指出 在 句法上是全句的修饰语,其语义指向却不一致,有时指向主语,有时指向谓语。此后, 语义指向 这一术语就使用开了,运用语

编译原理第二版课后习答案

《编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源

名词解释

名词解释 32.音节结构的元辅音分析法 这种音节结构分析方法以元辅音为基本分析单位,把音节结构分为V、C—V、V—C、C—V-C等四种基本类型(其中的V代表元音,C代表辅 音)。 例如汉语普通话中的(一)、[t‘i](题)、[an](安)、[t‘an](谈)等四个音节分别属于上述四种基本类型。 33.语义指向 语义指向是指句子中某个成分在语义上指向哪儿,或者说同哪个或哪些成分发生语义联系。例如,补语位臵上的成分,在语义上既可能 指向主语,如?我吃饱了?中的?我?;也可能指向宾语,如?我吃光了碗里的饭?中的?碗里的饭?。 34.意音文字 意音文字指一部分字符是意符,一部分字符是音符的文字。如汉字就是意音文字,汉字中许多字符是直接表意的,而假借字则是假借意符直接表音、间接表意的音符。 35.语言规划 语言规划是指社会对语言文字问题所作出的有组织的、有意识的管理、调节和改进。例如,我国国家语言文字工作委员会所作的推广普 通话、文字改革、语言规范化、制定正确的民族语言政策等工作。 四、简答题 36.举例说明为什么说音位的辨义功能实际上是由区别特征负担的。

(1)具体语言中的每个音位都可以分解为几个区别特征,不同音位之间的对立实际上可以进一步分解为区别特征之间的对立,因此音位 的辨义功能实际上是由区别特征来负担的。 (2)例如,汉语普通话里/k//k‘/和/p/三个音位具有辨义功能,它们的语音特征分别是?舌根、闭塞、不送气?、?舌根、闭塞、送气?和?双唇、闭塞、不送气,?/k/通过?不送气?和/k‘/相区别〃,通过?舌根?和/p/相区别。因此,像 ?干?/kan51八?看?/k‘an51/和?办?/pan51/等三个词在语音形式上的区别可以归结为这三个音位在区别特征上的对立。 37.请结合实例说明语法的抽象性表现在哪些方面。 (1)所谓?抽象?即对具体的东西进行类的概括。语法规则就是对人们说的话中的单位、结构和关系的某种类的概括。(2)语法单位类别的抽象。如以从词的用法建立词类为例。(3)语法关系类别的抽象。如以从结构形式建立语法结构为例。(4)语法意义类别的抽象。如以从形态或格式建立时态意义、句式意义等为例。 38.以实例说明义素分析的方法和主要步骤。 (1)确定对比的范围。一般来说,义素分析应该先从指称事物最小类别成员的一组词语开始,如有需要,再进一步扩大对比分析的范围。分析?男人?的义素,可以先从?男人?与?女人?、?男孩?的对比开始,因为它们同属于?人?这个最小类别。 (2)比较词义的异同。对比的范围确定之后:下一步就是运用对比分析的方法,找出不同词义在语义成分上的共同点和不同点,也就是提取它们的共同义素和区别义素。比如要分析?男人、女人、男孩?的义素,可以首先比较这三个词的意义,从中提取出共同义素[人],然后将?男人?与?女人?比较,提取出区别义素[±男性],再将?男人?和?男孩?比较,提取出区别义素[±成年]。利用这些共同义素和区别义素,不仅可以使这三个词的意义互相区别开来,而且也可以使它们同其他的词语相区别。通过对比分析,找出不同词语的共同义素和区别义

相关主题