语义分析和语法制导翻译-编译原理-06-(二)

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

编译原理语法分析实验报告 - 班级:XXX 学号:XXX 姓名:XXX 年月日 1、摘要: 用递归子程序法实现对pascal的子集程序设计语言的分析程序 2、实验目的: 通过完成语法分析程序,了解语法分析的过程和作用 3、任务概述 实验要求:对源程序的内码流进行分析,如为文法定义的句子输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用 4、实验依据的原理 递归子程序法是一种自顶向下的语法分析方法,它要求文法是LL(1)文法。通过对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时,程序能够按LL(1)形式唯一地确定选择某个候选式进行推导,最终识别输入串是否与文法匹配。 递归子程序法的缺点是:对文法要求高,必须满足LL(1)文法,当然在某些语言中个别产生式的推导当不满足LL(1)而满足LL(2)时,也可以采用多向前扫描一个符号的办法;它的另一个缺点是由于递归调用多,所以速度慢占用空间多,尽管这样,它还是许多高级语言,例如PASCAL,C等编译系统常常采用的语法分析方法。

为适合递归子程序法,对实验一词法分析中的文法改写成无左递归和无左共因子的,,,如下: <程序>?<程序首部><分程序>。 <程序首部>?PROGRAM标识符; <分程序>?<常量说明部分><变量说明部分><过程说明部分> <复合语句> <常量说明部分>?CONST<常量定义><常量定义后缀>;|ε <常量定义>?标识符=无符号整数 <常量定义后缀>?,<常量定义><常量定义后缀> |ε <变量说明部分>?VAR<变量定义><变量定义后缀> |ε <变量定义>?标识符<标识符后缀>:<类型>; <标识符后缀>?,标识符<标识符后缀> |ε <变量定义后缀>?<变量定义><变量定义后缀> |ε <类型>?INTEGER | LONG <过程说明部分>?<过程首部><分程序>;<过程说明部分后缀>|ε <过程首部>?PROCEDURE标识符<参数部分>; <参数部分>?(标识符: <类型>)|ε <过程说明部分后缀>?<过程首部><分程序>;<过程说明部分后缀>|ε <语句>?<赋值或调用语句>|<条件语句>|<当型循环语句>|<读语句> |<写语句>|<复合语句>|ε <赋值或调用语句>?标识符<后缀> <后缀>?:=<表达式>|(<表达式>)|ε <条件语句>?IF<条件>THEN<语句> <当型循环语句>?WHILE<条件>DO <语句> <读语句>?READ(标识符<标识符后缀>)

语法制导翻译

for循环语句翻译递归下降法输出三地址码///////////// #define MAX 100 #include #include #include char str[MAX]; char ch; int turn; char strToken[MAX]; int kind; int n=0;//存放strtoken[]元素的个数 struct Word//结构体存放单词 { int sort; char word[MAX];//存放strtoken[]的内容 }; //record[x]=new Word; Word *record[12];//放所有识别出来的单词,分别存放他们的编号以及字符串,x是其下标 ////////////////////词法分析/////////////////////// int buffer()//载入 { int i=0; cout<<"输入程序,以“#”作为结束标志。"<>str[i]不可用,用C语言读入字符。 if(str[i]=='#') break;///////如果尾数为识别码#,则表示程序读完,跳出循环. } break; } return(i);

bool IsLetter(char ch)///////////判断是否是字母 { if(ch>=65&&ch<=90||ch>=97&&ch<=122) return(true); else return(false); } bool IsDigit(char ch)//////////判断是否是数字 { if(ch>=48&&ch<=57) return(true); else return(false); } char GetChar(int i)///////读取字符 { char ch; ch=str[i]; return(ch); } char GetBC(char ch)////判断是不是空格或者换行,如果是,直接读取下一个字符直道不再空白为止{ if(ch==32||ch==10) { turn++; ch=GetChar(turn); ch=GetBC(ch);/////////递归实现 return(ch); } else return(ch); } void Concat()/////////////连接,即为strtoken[]赋值 { strToken[n]=ch; n++;

编译原理-编写递归下降语法分析器

学号107 成绩 编译原理上机报告 名称:编写递归下降语法分析器 学院:信息与控制工程学院 专业:计算机科学与技术 班级:计算机1401班 姓名:叶达成 2016年10月31日

一、上机目的 通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、基本原理和上机步骤 递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。 递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。 每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。 自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。 无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。 无回溯:对于任一非终结符号U的产生式右部x1|x2|…|x n,其对应的字的首终结符号两两不相交。 如果一个文法不含回路(形如P?+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。 三、上机结果 测试数据: (1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (2)输出结果:i+i*i#为合法符号串 (3)输入一符号串如i+i*#,要求输出为“非法的符号串”。 程序清单: #include #include char str[50]; int index=0; void E(); //E->TX; void X(); //X->+TX | e void T(); //T->FY void Y(); //Y->*FY | e void F(); //F->(E) | i int main() /*递归分析*/ { int len; int m;

编译原理实验报告(语法分析器)

. 编译原理实验专业:13级网络工程

语法分析器1 一、实现方法描述 所给文法为G【E】; E->TE’ E’->+TE’|空 T->FT’ T’->*FT’|空 F->i|(E) 递归子程序法: 首先计算出五个非终结符的first集合follow集,然后根据五个产生式定义了五个函数。定义字符数组vocabulary来存储输入的句子,字符指针ch指向vocabulary。从非终结符E函数出发,如果首字符属于E的first集,则依次进入T函数和E’函数,开始递归调用。在每个函数中,都要判断指针所指字符是否属于该非终结符的first集,属于则根据产生式进入下一个函数进行调用,若first集中有空字符,还要判断是否属于该非终结符的follow集。以分号作为结束符。 二、实现代码 头文件shiyan3.h #include #include

#include using namespace std; #define num 100 char vocabulary[num]; char *ch; void judge_E(); void judge_EE(); void judge_T(); void judge_TT(); void judge_F(); 源文件 #include"shiyan3.h" void judge_E() { if(*ch==';') { cout<<"该句子符合此文法!"<

int a=0; cout<<"按1结束程序"<>a; if(a==1) exit(0); } else if(*ch=='('||*ch=='i') { judge_T(); judge_EE(); } else { cout<<"该句子不匹配此文法!"<>a; if(a==1) exit(0); }

编译原理词法分析和语法分析报告 代码(C语言版)

词法分析 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 扫描子程序主要部分流程图 其他

词法分析程序的C语言程序源代码: // 词法分析函数: void scan() // 数据传递: 形参fp接收指向文本文件头的文件指针; // 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。 void scan() { char ch; int flag,j=0,i=-1; while(!feof(fp1)) { ch=fgetc(fp1); flag=judge(ch); printf("%c",ch);//显示打开的文件 if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;} else if(flag==4) {i++;buffer[i]='?';line[i]=row;} else if(flag==5) {i++;buffer[i]='~';row++;} else if(flag==7) continue; else cout<<"\n请注意,第"<

语义语法

仗剑独行编辑 为了能够在网络上进行更好的传输,首先将每幀图像划分为NAL单元,为了提高压缩率及错误处理能力提出了RBSP编码算法。 nal_unit(NumBytesInNALunit){//NumBytesInNALunit规定了NAL单元的大小forbidden_zero_bit nal_ref_idc//nal_ref_idc如果不为0,说明NAL单元的内容包含一个序列参数集或一个图像参数集,或一个参考图像条带,或一个参考图像的条带数据分割。 nal_unit_type//指明含在NAL单元中的RBSP数据结构的类型 NumBytesInRBSP=0 for(i=1;i

编译原理-语法分析-算符优先文法分析器

编译原理实验报告 实验名称:编写语法分析分析器实验类型: 指导教师: 专业班级: 学号: 电子邮件: 实验地点: 实验成绩:

一、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。 1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,至少选一题。 2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。 二、实验过程 编写算符优先分析器。要求: (a)根据算符优先分析算法,编写一个分析对象的语法分析程序。读者可根据自己的能力选择以下三项(由易到难)之一作为分析算法中的输入: Ⅰ:通过构造算符优先关系表,设计编制并调试一个算法优先分析程序Ⅱ:输入FIRSTVT,LASTVT集合,由程序自动生成该文法的算符优先关系矩阵。 Ⅲ:输入已知文法,由程序自动生成该文法的算符优先关系矩阵。(b)程序具有通用性,即所编制的语法分析程序能够使用于不同文法以及各种输入单词串,并能判断该文法是否为算符文法和算符优先文法。 (c)有运行实例。对于输入的一个文法和一个单词串,所编制的语法分析程序应能正确地判断,此单词串是否为该文法的句子,并要求输出分析过程。 三、实验结果 算符优先分析器: 测试数据:E->E+T|T T->T*F|F F->(E)|i 实验结果:(输入串为i+i*i+i)

四、讨论与分析 自下而上分析技术-算符优先分析法: 算符文法:一个上下无关文法G,如果没有且没有P→..QR...(P ,Q ,R属于非终结符),则G是一个算符文法。 FIRSTVT集构造 1、若有产生式P →a...或P →Qa...,则a∈FIRSTVT(P)。 2、若有产生式P→...,则FIRSTVT(R)包含在FIRSTVT(P)中。由优先性低于的定义和firstVT集合的定义可以得出:若存在某个产生式:…P…,则对所有:b∈firstVT(P)都有:a≦b。 构造优先关系表: 1、如果每个非终结符的FIRSTVT和LASTVT集均已知,则可构造优先关系表。 2、若产生式右部有...aP...的形式,则对于每个b∈FIRSTVT(P)都有

TEST语法语义规则

TEST语言语法语义规则 程序中最后的声明必须是一个函数声明,名字为main。没有原型说明, 约定:主调函数的定义必须在被调函数的定义之前。 1.→{ fun_declaration } 2. → function ID’(‘‘ )’< function_body> 3.→main’(‘‘ )’ < function_body> 4.→ ‘{‘’}’ 5.→{} 6. →int ID; 7. | ε →{} 8.||| || | | < call _stat> 9. → if ‘(‘) [else < statement >] 10. → while ‘(‘’)’ < statement > 11. → for’(‘;;’)’ 12. →write ; 13. →read ID; 14. →’{‘’}’ 15. →< expression >;|; 16. < call _stat>→call I D’(‘’‘) 17. < expression >→ ID=| 18. -> |< additive_expr >(>|<|>=|<=|==|!=)< additive_expr > 19. < additive_expr>→{(+|-)< term >} 20. < term >→{(*| /)< factor >} 21. < factor >→’(‘< additive_expr >’)’|ID|NUM 有待扩充: 1.函数名、变量名都不可以重名。(有待修改:同一函数内部变量名不能相同,但不同函数的变量名可以相同,符号表的处理会更复杂) 2.考虑函数带返回值的情况; 3.考虑函数带参数的情况。

编译原理 语法分析器 (java完美运行版)

实验二语法分析器 一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。 二、实验内容 ◆根据某一文法编制调试LL (1 )分析程序,以便对任意输入的符号串 进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分 析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号 以及LL(1)分析表,对输入符号串自上而下的分析过程。 三、LL(1)分析法实验设计思想及算法 ◆模块结构: (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

四、实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下:

五、实验源程序 LL1.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.sql.*; import java.util.Vector; public class LL1 extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = 1L; JTextField tf1; JTextField tf2; JLabel l; JButton b0; JPanel p1,p2,p3; JTextArea t1,t2,t3; JButton b1,b2,b3;

语法、语义和语用三个平面的联系与区别

语法、语义、语用三个平面的区别与联系 2004年北京语言大学对外汉语专业的考研题 近年来,国内外有些语言学家在语法研究中注意到区别三个不同的平面,即句法平面、语义平面和语用平面,这是语法研究方法上的新进展,有助于语法学科的精密化、系统化和实用化。但这样研究语法还仅仅是开始。如何在语法分析中,特别是在汉语的语法分析中全面地、系统地把句法分析、语义分析和语用分析既界限分明地区别开来,又互相兼顾地结合起来,这是摆在语法研究工作者面前的新课题,是值得进行深入探索的。 (一)语法研究中的句法平面,是指对句子进行句法分析。句中词语与词语(即符号与符号)之间有一定的关系,这种关系是属于句法的(Syntactic)。词语与词语按照一定的方式组合起来,构成一定的句法结构,对句法结构进行分析,就是句法分析。对句子进行句法分析,主要从两方面进行。 一方面,对句法结构内部的词语与词语之间的关系进行成分分析,也就是着眼于句子成分的确定和结构方式的判别。传统语法学进行语法分析时,总要把句子分为若干成分,如主语、谓语、宾语、定语、状语、补语等等,这些都是句法分析的术语。传统语法学分析一个句子,就是要分析句子里各类实词(包括名词、动词、形容词、数词、代词、副词等)充当什么句子成分。比如“张三批评了李四”,就得分析成主谓句,其中“张三”是主语,“批评了李四”是谓语,“批评”是谓语动词,“李四”是宾语。假如说成“李四被张三批评了”,也得分析成主谓句,

但这句里“李四”是主语,“被张三批评了”是谓语,“被张三”是介词短语作状语,“张三”是介词“被”的宾语,“批评”是谓语动词。这样的成分分析,讲什么词充当什么句子成分,都是着眼于句子结构分析出来的。与确定句子成分有联系的,就是结构类型的判别。结构类型决定于结构成分之间的关系,也就是决定于结构方式。比如“鸟飞”“身体健康”,是由主语和谓语两成分组成的,通常称为主谓结构;“飞鸟”“健康的身体”,是由定语和它的中心语两成分组成的,通常称为偏正结构;“读书”“建设祖国”,是由动词和它的宾语两成分组成的,通常称为动宾结构。研究一个组合体是什么结构,也是句法分析的重要内容。另一方面,对句法结构内部的词语与词语之间的层次关系进行分析,也就是着眼于句法结构的层次切分。这种层次分析,要求把句法结构中词语之间的关系分为直接关系和间接关系、内部关系和外部关系,也就是要句法结构的直接成分和间接成分以及内部成分和外部成分区别开来。例如“干大事的人”,这个句法结构里“干大事”和“人”之间是直接关系,“干”和“大事”之间也是直接关系,但“干”和“人”之间以及“大事”和“人”之间都是间接关系。又如“张三的哥哥批评了李四的弟弟”这个句子,进行层次分析,词语间的直接关系可图示如下: 三的哥哥批评了四的弟弟 直接关系直接关系 直接关系 直接关系 这个句子里“张三”与“批评”之间、“李四”与“批评”之间、“哥哥”与“李

昆明理工大学 编译原理 实验二 语法分析器

昆明理工大学信息工程与自动化学院学生实验报告 (2011 —2012 学年第 1 学期) 课程名称:编译原理开课实验室: 445 2011年 12 月 19日年级、专业、 班 计科093 学号200910405310 姓名孙浩川成绩 实验项目名称语法分析器指导教师严馨 教 师评语 该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□ 该同学的实验能力: A.强□ B.中等□ C.差□ 该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□ 实验报告是否规范: A.规范□ B.基本规范□ C.不规范□ 实验过程是否详细记录: A.详细□ B.一般□ C.没有□ 教师签名: 年月日 一、实验目的及内容 实验目的:编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检 查和结构分析。 实验内容:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。 已知待分析的C语言子集的语法,用EBNF表示如下: <程序>→main()<语句块> <语句块> →‘{’<语句串>‘}’ <语句串> → <语句> {; <语句> }; <语句> → <赋值语句> |<条件语句>|<循环语句> <赋值语句>→ID=<表达式>

<条件语句>→if‘(‘条件’)’<语句块> <循环语句>→while’(‘<条件>’)‘<语句块> <条件> → <表达式><关系运算符> <表达式> <表达式> →<项>{+<项>|-<项>} <项> → <因子> {* <因子> |/ <因子>} <因子> →ID|NUM| ‘(’<表达式>‘)’ <关系运算符> →<|<=|>|>=|==|!= 二、实验原理及基本技术路线图(方框原理图或程序流程图)

语法、语义、语用

语法、语义、语用的区别 (2012-12-23 22:38:32) 汉语是缺乏形态标志的语言,注重意合是汉语语法的一个主要特点。汉语的语序对语义的制约性很强,句法成分之间存在着较复杂的语义关系,在许多情况下仅对语法形式进行句法结构分析是解释不了句子的内部规律的。教学实践表明,让外国学生按照教材上所展示的句法结构模式去造句,他们有时会造出许多符合句法但不合情理也不能使用的句子来,究其原因,正是错在句子语义搭配和语用选择上。 句法、语义和语用这三个平面既有联系又有区别。句法是基础,语义和语用都要通过句法结构才能表现。句法结构中构成成分之间存在着诸如主谓、动宾、动补、偏正等句法关系意义,同时也存在着诸如动作与施事、受事、处所、工具等语义关系意义,还存在着诸如陈述、话题、焦点和预设、已知信息与新信息等语用意义。但是,句法、语义和语用实际上又处于不同平面上,它们之间并没有严格的对应。例如:“写文章”、“写毛笔”、“写黑板”,句法结构完全相同(动宾),但分别表达了“动作与结果”、“动作与工具”、“动作与处所”不同的语义关系;又如:“客人来了”与“来了客人”,两个句法结构的语义关系基本相同,“客人”与“来”都是“施事”与“动作”的关系,但句法关系分别是主谓和动宾。语用意义也不相同,前一个结构的“客人”是定指,表达已知信息,后一个结构的“客人”是非定指,表达新信息。更复杂一点的结构,如:①“床上躺着一个人”;②“那个人在床上躺着”;③“那个人躺在床上”;④“床上的那个人躺着”,这几个句子的句法结构关系各不相同,但语义关系基本相同,“人”、“床上”、“躺”之间都是“施事”、“处所”与“动作”的关系。 语法教学中进行语义分析,除了上述指出的句法成分间的语义规定性,即施事(主体)、受事与事(客体)、对象、处所、时间、结果、原因、目的、方式等之外,主要还是对语义指向的分析。由于汉语句法上的结合关系与语义的结合关系存在着不一致的现象,语义指向分析对理解句子的语义结构显得尤其重要。如:①“这些书我都看过了”;②“这本书我们都看过了”;③“这些书我们都看过了”。这三个句子中的“都”在句法上均与动词“看”结合,构成偏正关系,在语义上“都”的语义指向分别是①“这些书”(受事),②“我们”(施事),③在没有特定语境时,“都”所涉及的可以是“我们”,也可以是“这些书”,还可以是“我们”和“这些书”。再如:①“饭吃多了”。②“饭吃饱了”;③“饭吃快了”; ④“饭吃完了”。以上几例按照句法分析,它们的层次构造完全一样,但分析其语义指向,“多”指“吃的饭”多了,“饱”指吃饭的人“饱”了,“快”说明的是“吃”这一动作行为,而“完”既可以说明“饭”完了(即“饭吃光了”),也可以说明吃饭这一动作行为的结束。以上几个句法结构体,“多”“饱”“快”“完”都与“吃”是句法上的直接成分(动补),但语义结构上却有区别。④ 语法教学中的语用分析,是对语言现象的动态分析,指明其使用的条件和语境,以利于学生恰当地使用学过的句子去交际。⑤比如动词重叠式,主要表示“短时、尝试、轻微、少量”的意义,但在具体语言环境中,意义又有所侧重,有着不同的表达功能和限定条件。如为什么我们可以说“讨论这个问题”,但不能说“讨论讨论一个问题”呢?这是因为后一句违背了“动词重叠后,其宾语前带数量词作定语时,数量词须为确定的。”这样一条语用规则。 ⑥其他如:动词带补语时,不用重叠形式,所以不能说“我想想清楚再说”,“请把房间收拾收拾整齐。”又如,否定式陈述句不用动词重叠式,不能说“我不想去唱唱歌”。(但可以说“你怎么不去唱唱歌?”);动词做修饰限制语的成分时,也不能用重叠式,不能说“你试试的那件衣服很合身。”等等。类似这样的各种条件限制,对汉语为母语的人来说,一般

编译原理语法分析器实验

语法分析器的设计 一、实验内容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 语法分析程序的流程图如图5-4所示。 语法分析程序流程图 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。 三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出&的符号; (6)求某一符号能否推出‘& ’; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M; (13)句型判别算法; (14)一个用户调用函数; (15)主函数; 下面是其中几部分程序段的算法思想: 1、求能推出空的非终结符集 Ⅰ、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c为空符号 char temp[10];定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then将该条产生式左部符号保存在临时数组temp中 将临时数组中的元素合并到记录可推出&符号的数组empty中。 } Ⅱ、求某一符号能否推出'&' int _emp(char c) { //若能推出&,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt里,标识此字符已查找其是否可推出空字 如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为c的产生式 j=strlen(right[i]); //j为c所在产生式右部的长度 if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空) if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符) else

编译原理实验二语法分析器LL(1)实现

编译原理程序设计实验报告 ——表达式语法分析器的设计班级:计算机1306班:涛学号:20133967 实验目标:用LL(1)分析法设计实现表达式语法分析器 实验容: ⑴概要设计:通过对实验一的此法分析器的程序稍加改造,使其能够输出正确的表达式的token序列。然后利用LL(1)分析法实现语法分析。 ⑵数据结构: int op=0; //当前判断进度 char ch; //当前字符 char nowword[10]=""; //当前单词 char operate[4]={'+','-','*','/'}; //运算符 char bound[2]={'(',')'}; //界符 struct Token { int code; char ch[10]; }; //Token定义

struct Token tokenlist[50]; //Token数组struct Token tokentemp; //临时Token变量struct Stack //分析栈定义 { char *base; char *top; int stacksize; }; ⑶分析表及流程图

逆序压栈 int IsLetter(char ch) //判断ch是否为字母 int IsDigit(char ch) //判断ch是否为数字 int Iskey(char *string) //判断是否为关键字 int Isbound(char ch) //判断是否为界符 int Isboundnum(char ch) //给出界符所在token值int init(STack *s) //栈初始化 int pop(STack *s,char *ch) //弹栈操作 int push(STack *s,char ch) //压栈操作 void LL1(); //分析函数 源程序代码:(加入注释)

语义语法与翻译表达

语义语法与翻译表达 在影响翻译表达的诸多因素中,首先遇到的莫过于对句中词汇意思的、对句子结构的分析,也就是语义和语法这两个方面。在翻译过程中这两个方面的问题解决得好,那么翻译的东西可以说基本上达到了"信"和"达"。至于"雅"的问题,它与译者的文笔修养及其他一些因素等联系甚紧,本文无意谈及。笔者只想从语义和语法的角度对翻译表达中出现的一些问题用实例加以分析,旨在证明语义和语法这两个因素在翻译表达中的重要性。 一、语义理解应准确 符号学的观点认为,一门语言就是一个系统,表达概念的词可以看作是系统中的实体,这些实体只有在系统中才有意义。这就是说词汇是静态的,句子是动态的。词汇只有置于句子才有意义,而只有根据句子乃至语篇来确定某个词汇的准确含义,才能真正达到翻译便是译意的目的。所以,语义的理解应力求准确。不仅要突出文字的表层意思,有的还必须译出其深层的涵义。这样译文表达才可能正确无误。可见理解准确是翻译准确的前提,否则便会译不达意,贻笑大方。现就语义理解的重要性以若干实例加以说明: 1. Health is above wealth, for this cannot give so much happiness as that. 译文:健康比财富更重要,因为财富不能像健康那样给人们带来幸福。 原句中this代替就近的名词,即wealth(财富),that代替较远的名词,即health(健康)。要把两个代词翻译成所代之名词才说得通。如果把this和that拘泥于表面原意译成"这个"和"那个",这样指代很不明确,放到译文中则让人不知所云。再如: There are two classes of people: the selfish and the selfless; these are respected, while those are looked down upon. 此句中的these指前面靠近的the selfless(忘我的人),those指较远的the selfish(自私的人)。所以全句应译成: 世上有两种人:自私者和忘我者;忘我的有受到尊敬,而自私的人则遭鄙视。 2. Men and nations working apart created these problems, men and nations working together must solve them. 译文:人与人之间以及国与国之间离心离德产生了这些问题:人与人之间以及国与国之间同心同德必定能解决这些问题。 句中men和nations都是复数。如果简单地译成"人们"和"国家"但不合原意,甚至被理解为人同国家之间离心离德和同心同德。故此,应在"人"和"国家"之后加上"之间",使句子不仅准确地表达了men和nations两个词在句中的深层含义,而且读起来也通顺。 3.He was astounded but highly pleased that the man who presided over the destinies of the mighty British Empire should come pleading to him. 译文:他又惊又喜,那位掌握着大英帝国命运的人居然来向他央求。 Should作为情态动词有"应该"的意思,但是当句子中有pity, surprise, shame, shock等表达说话人感情色彩的词时,从句中的should就往往被译成"居然","竟然"等,把说话人的同情、吃惊、羞怯、不满、赞叹、怀疑等感情表达出来。原文中有astounded和pleased表示惊喜的词,所以should应译民"居然",如果译成"应该",就错了。 4. Hairless Yunus has a few marbles missing because he is a wrestler. 译文:秃头尤诺斯是个角力士,他缺几个心眼。

22词汇和语法的关系

第22讲词汇和语法的关系 词汇和语法之间有密切关系。 《孟子滕文公》:“舍皆取诸宫中而用之”中的“舍”,有人解释为疑问代词“什么”,王力先生认为是不对的,因为上古没有“疑问代词后面跟范围副词”这种句式,这是从语法上证明语义。很多古汉语字典把“适”解释为“往也”,这也是不对的,应该解释为“之也”。因为上古“往”是一个纯粹的内动词,“往”的目的地是不说出或不能说出的,如果需要说出目的地,则常常不用“往”而用其他动词如“之”“如”“就”等。如:庄辛去之赵。驱而之薛。屈完如師。而“适”后的目的地是必须说出的。如“适彼乐土。”所以,“适”和“往”是不同的。 这说明,语法和语义有密切的关系,不能抛开语法孤立地考察词义。 洪成玉《古汉语词义分析》(天津人民出版社,1985):“词具有两重性,既具有词汇属性,也具有语法属性。离开对词的语法属性的分析,就很难对一个词的意义做出正确的判断。”并举例:丘迟《与陈伯之书》:“将军勇冠三军,才为世出。”一些注本把“才为世出”解释为“才能是世界上杰出的”,这是错误的。因为古汉语中“出”是动词,单用时不做形容词,也尚未产生“杰出”的意义。“为”如理解为“是”,后面就要求名词或名词性词语,而这里却不是,所以,上句应理解为“才能为适应时代而生。”“为”是介词,“出”是动词。

这些例子说明了词汇和语法的关系:第一,一个词有某种词义,就必然会有相应的语法属性。因此,也就决定了它能进入某一种语法结构,和不能进入另一种语法结构。 第二,有时一个词的某种语法属性会使它区别于一些近义词,如“往”是内动词,“适”是外动词。 以上说明同一时代平面上词汇和语法的密切关系。从语言的历史发展看,词汇和语法也是相互影响的。 一、由语法关系而造成的词义变化 在语言的历史发展过程中,语法对词义变化的影响最明显地表现在下面一种事实上:有的词义的发展变化,是它长期处于某种语法位置造成的。“是”字的变化即属此类。这样的例子还有:1、为 古汉语“为”的基本用法是动词。但有时它可以放在疑问句的句尾。 《论语颜渊》:君子质而已矣,何以文为? 《论语季氏》:是社稷之臣也,何以伐为? 《庄子逍遥游》:奚以之九万里而南为? 《谷梁传定公十年》:两君合好,夷狄之民,何为来为? 对这种“为”字,有两种观点:疑问语气词(杨树达《词诠》) 动词,(王力《古代汉语》) 王力说:这样的句子,实际上是动词“为”的宾语“何”放在作状语的介词结构前面去了,意思是“用……做什么”。

相关文档
最新文档