IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)
目录
1 系统描述(问题域描述) (2)
2 文法及属性文法的描述 (2)
2.1文法 (2)
2.2 属性文法 (2)
3 语法分析方法描述及语法分析表设计 (3)
3.1语法分析方法描述 (3)
3.1.1 LR方法的基本思想 (3)
3.1.2 LR分析器模型 (4)
3.2语法分析表设计 (5)
4中间代码形式的描述及中间代码序列的结构设计 (6)
4.1中间代码形式的描述 (6)
4.2中间代码序列的结构设计 (6)
5 编译系统的概要设计 (6)
6 详细的算法描述 (7)
6.1系统流程图 (7)
6.2算法描述 (7)
7 软件的测试方法和测试结果 (18)
7.1软件的测试方法 (18)
7.2测试结果 (18)
8设计的特点、不足、收获与体会 (21)
8.1特点与不足 (21)
8.2收获与体会 (21)
9 参考文献 (21)
10本科生课程设计成绩评定表 (22)
IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)
1 系统描述(问题域描述)
对条件语句: if 〈布尔表达式〉then〈赋值语句〉 else 〈赋值语句〉,进行词法,LR(1)语法分析,并根据语法制导翻译方法将条件语句翻译成四元式中间代码形式,最后输出翻译后的四元式代码。
2 文法及属性文法的描述
2.1文法
G[S]: S->CS
S->TS
S->A
C->if E then
T->CS else
T->else
其中,E代表布尔表达式,可由界符()括起来,A代表赋值表达式。在这里E、A都代表终结符,具体的表达式在程序会判断其类型。
2.2 属性文法
S->C S
{S.clain:=merge(C.clain,S.clain)}
S->T S
{S.clain:=merge(T.clain,S.clain)}
S->A
{S.clain:0/* 空链*/}
C->if E then
{backpatch(E.true,nextstat) C.clain:=E.false}
T->C S else
{ q:=nextstat
Emit(‘GOTO’—)
Backpatch(C.clain,nextstat)
T.clain:=merge(S.clain,q)}
3 语法分析方法描述及语法分析表设计
3.1语法分析方法描述
3.1.1 LR方法的基本思想
一个LR分析器实质上是一个带先进后出存储器的确定有限状态自动机。我们将把“历史”和“展望”材料综合地抽象成某些“状态”。分析栈用来存放状态。栈里的每个状态概括了从分析开始直到某一归约阶段的全部“历史”和“展望”资料。任何时候,栈顶的状态都代表了整个的历史和已推测出的展望。因此,在任何时候都可从栈顶状态得知所想了解的一切,而绝对没有必要从称底而上翻阅整个栈。LR分析器的每一步工作都是由栈顶
状态和现行输入符号所唯一决定的。为了有助于明确归约手续,我们把已归约出的文法符号串也同时放在栈里。于是,我们可以把栈的结构看成是:
栈的每一项内容包括状态S和文法符号X两部分。(S0,#)为分析开始前预先放到栈里的初始状态和句子括号。栈顶状态为SM,符号串X1X2….XM是至今已移进归约出的部分。
3.1.2 LR分析器模型
LR分析器模型如下图:
LR分析器的核心部分是一张分析表。这张分析表包括两部分,一是“动作”(ACTION)表,另一个是“状态转换表”(GOTO)表。它们都是二维数组。ACTION[s,a]规定了当状态s面临输入符号a时应采取什么动作。GOTO[s,a]规定了状态s 面对文法符号X(终结符或非终结符)时下一个状态是什么。显然GOTO[S,x]定义了一个以文法符号为字母表的DFA。
每一项ACTION[s,a]所规定的动作不外是下述四种可能之一:
1. 移进把(S,A)的下一状态S=GOTO[S,A]和输入符号A推进栈,下一输入符号变成现行输入状态。
2. 规约指用某一产生式A-> 进行规约。假若的长度为r,归约动作是A,去除栈顶的r个项,使状态Sm-r变成栈顶状态,然后把(Sm-r,A)的下一状态S1=GOTO[Sm-r,A]和文法符号A推进栈。归约动作不改变现行输入符号。执行归约动作意味着(=Xm-r+1….Xm)已呈现于栈顶而且是一个相对于A的句柄。
3. 接受宣布分析成功,停止分析器的工作。
4. 报错发现源程序含有错误,调用出错处理程序。
LR分析器的总控程序本身的工作是非常简单。它的任何一步只需要按栈顶状态和现行输入符号a执行ACTION[S,a]所规定的动作。不管什么分析表,总控程序都是一样地工作。
一个LR分析器的工作过程可看成是栈里的状态序列,已归约串和输入串所构成的三元式的变化过程。分析地的初始三元式(S0,#,a1a2…an#)其中,S0为分析器的初态;#为句子的左括号;a1a2…an为输入串;其后的#为结束符。分析
过程每步的结果可表示为(s0s1…sm,# X1X2…,ai….an#)分析器的下一步动作是由栈顶状态Sm和现行输入符号ai所唯一决定。即,执行ACTION[Sm,ai]所规定的动作。经执行每种可能的动作之后,三元式的变化的情形是:
(1)若ACTION[Sm,ai]为移进,且S=GOTO[Sm,ai],则三元式变成:
(S0S1…Sm,#X1X2…Xmaian#)
(2)若ACTION[Sm,ai]={A-> },则按产生式A-> 进行归约。此时三元式变为
(S0S1…Sm-rS,#X1…Xm-rA,aiai+1…an#)
此处S =GOTO[Sm-r,A],r为的长度,=Xm-r+1…Xm。
(3)若ACTION[Sm,ai]为:接受,则三元式不再变化,变化过程终止,宣布分析成功。
(4)若ACTION[Sm,ai]为“报错”,则三元式的变化过程终止,报告错误。一个LR分析器的工作过程就是一步一步地变换三元式,直至执行“接受”或“报错”为止。
3.2语法分析表设计
(1)Sj 把下一状态j和现行输入符号移进栈;
(2)rj 按第j个产生式进行规约;
(3)acc 接受;
(4)空白格出错标志,报错;
4中间代码形式的描述及中间代码序列的结构设计4.1中间代码形式的描述
四元式是一种比较普遍采用的中间代码形式。四元式的四个组成部分是:操作符OP,第一个和第二个运算对象ARG1和ARG2及运算结果RESULT。运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。例如a:=b*c+b*d的四元式表示如下:
(1)(*,b,c,t1)
(2)(*,b,d,t2)
(3)(+,t1,t2,t3)
(4)(:=,t3,-,a)
4.2中间代码序列的结构设计
If E then A1else A2
100 (关于E的布尔表达式)
101 (goto, - , - ,104)
102 (关于A1的赋值表达式)
103 (goto, - , - ,105)
104 (关于A2的赋值表达式)
105 exit
5 编译系统的概要设计
本课程设计需要写一个条件语句的LR文法及其属性文法,运用LR分析方法对此文法进行语法和语义分析,中间代码采用四元式输出。在这个条件语句的翻译分析程序设计中,主要通过以下四个过程来完成:
1.词法分析。由于编译程序是在单词的级别上来分析和翻译源程序的,那么在这里,词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个一个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。所以词法分析是编译的基础。在此程序中是将词法分析作为一遍处理的,通过一次分析把全部的字符串都分析完成,并将其保存在数组中便于下一步进行语法分析。
2.语法分析。在完成词法分析的基础上对条件语句进行语法分析,在这里我采用了自下而上分析法SLR(1)分析方法,来分析判定程序的语法结构是否符合语法规则,在分析前首先要构造SLR(1)分析表,然后在进行语法分析,在此程序中,以‘;’为结束符号来判断一条条的条件语句,并且独立的对每条语句进行语法分析。并把算法中的移近、规约操作
3.语义分析、输出四元式。在进行语法分析的同时进行语义分析,在此次设计中式将二者结合起来作为一遍进行处理的。在进行语义时同时生成中间语言四元
式。
4.出错处理。如果在词法分析时遇到非法字符就会输出出错信息,同时输出从出错点开始往后的一串字符,但是它仍然能跳过该非法字符继续分析;如果在语法分析中有错误的话,就会显示在DOS环境下输出“ERROR”,但是它能跳过出错的地方继续往后执行,分析出一部分结果并保存在文件中。
6 详细的算法描述
6.1系统流程图
6.2算法描述
本程序中,选用C++程序设计语言的部分常用的单词作为词法分析的对象,词法分析后,将识别的所有单词符号以及相关信息保存在数组中,以便后面语法分析和语意分析及中间代码生成使用,同时将识别出的单词符号输出到文件中,
并分类别地存储到相应的数组中一便进行查看。
采用SLR(1)分析法,生成状态表,然后根据栈的移近、移出生成分析过程表。
在经过语法、语义分析之后,生成中间代码四元式,同时进行出错管理。
void initGrammar();//初始化产生式表
bool isJchar(char c)//检测是否为分界符
int word() //进行词法分析,并存到fenxi.txt文件中
wnode* lexcial(wnode *head)//把词法分析得来的词分类别放到表达式数组int check(int s,char v);//查LR分析表
void gammarAnalysis(wnode *head);//语法分析及进行相应的语义操作并产生四元式
void showS(int opS[],int tops,char opC[],int topc,wnode *hp);//显示分析栈的内
源程序代码:
# include
#include
#include
# include
#include
#include
using namespace std;
char Filename[100];
struct wnode
{
char id;
int n;//编号
char text[20];
wnode * next;
};
struct Gnode//存储产生式
{
string gen;
int id;
};
Gnode grammar[6];
void initGrammar();//初始化产生式表
wnode* lexcial(wnode *head);
int check(int s,char v);//查LR分析表
void gammarAnalysis(wnode *head);//语法分析及进行相应的语义操作并产生四元式
void showS(int opS[],int tops,char opC[],int topc,wnode *hp);//显示分析栈的内容
//用于if-else分析
int LR[11][9]={
//________ACTION_________|___GOTO___
// i t e A E # S C T
{105, 0, 0,104, 0, 0,101,102,103},//0
{ 0, 0, 0, 0, 0, -1, 0, 0, 0},//1
{105, 0, 0,104, 0, 0,106,102,103},//2
{105, 0, 0,104, 0, 0,110,102,103},//3
{ 0, 0, 3, 0, 0, 3, 0, 0, 0},//4
{ 0, 0, 0, 0,108, 0, 0, 0, 0},//5
{ 0, 0,107, 0, 0, 1, 0, 0, 0},//6
{ 5, 0, 0, 5, 0, 0, 0, 0, 0},//7
{ 0,109, 0, 0, 0, 0, 0, 0, 0},//8
{ 4, 0, 0, 4, 0, 0, 0, 0, 0},//9
{ 0, 0, 2, 0, 0, 2, 0, 0, 0} //10
};
void initGrammar()
{
grammar[0].gen="S'->S";
grammar[0].id=0;
grammar[1].gen="S->CS";
grammar[1].id=1;
grammar[2].gen="S->TS";
grammar[2].id=2;
grammar[3].gen="S->A";
grammar[3].id=3;
grammar[4].gen="C->if E then";
grammar[4].id=4;
grammar[5].gen="T->CS else";
grammar[5].id=5;
cout<<"所用文法:"< int i,j; for(i=1;i<6;i++) cout< cout<<"5"<<'\t'<<"T->else"< cout<<"注:i--if t--then e--else"< cout<<" E——布尔表达式(在语法分析中看成是终结符)"< cout<<" A——赋值语句(在语法分析中看成是终结符)"< cout<<"SLR(1)分析表:"< cout< cout< < for(i=0;i<11;i++) { cout< for(j=0;j<9;j++) { if(LR[i][j]>=110) cout< else if(LR[i][j]>100) cout< else if(LR[i][j]>0) cout< else if(LR[i][j]==0) cout< else cout< } cout< } } bool isJchar(char c)//检测是否为分界符 { bool r=false; switch(c) { case' ': case'\n': case';':r=true;break; default:; } return r; } int word() { char ch=' '; int num=0; ifstream source("source.txt"); ofstream fenxi("fenxi.txt"); char yunsuanfu[11]={'+','-','*','/','<','>','=','!','%','&','|'}; char jiefu[9]={',',';','(',')','{','}','[',']','#'}; char *guanjianzi[20]={"int","if","else","then","do","while","break","continue","switch","ret urn","when","for","double","main","break","include","short","long","float","char",}; char *biaoshifu[100]={"\0"}; ///////////////////////////////// while(!source.eof()) { source.get(ch); char shuzi[20]=""; int i=1; if(ch>='0'&&ch<='9') //判断数字 { shuzi[0]=ch; source.get(ch); while(((ch>='0'&&ch<='9')||ch=='.')&&!source.eof()) { cout< shuzi[i++]=ch; source.get(ch); } fenxi< } for(i=0;i<=10;i++) //运算符判断 { if(ch==yunsuanfu[i]) { fenxi< } } for(i=0;i<9;i++) //界符 { if(ch==jiefu[i]) { fenxi< } } if(ch>='a'&&ch<='z') //关键字判断 { char str1[20]; int sign=0; int n=0; while(((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')||ch=='_')&&!source.eof()) { str1[n]=ch; source.get(ch); n++; } str1[n]='\0'; for(i=0;i<20;i++) { if(!strcmp(str1,guanjianzi[i])) { fenxi< sign=1; } } if(sign==0) { fenxi< } for(i=0;i<=10;i++) //运算符判断 { if(ch==yunsuanfu[i]) { fenxi< } } for(i=0;i<9;i++) //界符 { if(ch==jiefu[i]) { fenxi< } } } } fenxi.close(); source.close(); return 0; } wnode* lexcial(wnode *head) { string str; int loc=-1; char c; int i,k=0,mark=0; int Acount=0,Ecount=0; wnode *p,*q; p=head; q=new wnode; q->text[0]='\0'; q->n=0; q->next=NULL; fstream infile(Filename);//根据输入的路径名来打开这个文件while (infile.get(c)) { if(isJchar(c)) { if(mark==1) { q->text[k]='\0'; for(i=0;q->text[i]!='\0';i++) if(q->text[i]=='=') loc=i; if(p->id=='i') {q->id='E';q->n=++Ecount;} else if(loc!=-1) {q->id='A';q->n=++Acount;} else { q->id=q->text[0]; if(q->id=='i') head->n++; } p->next=q; p=q; mark=0; } }else { if(mark==0) { q=new wnode; q->n=0; q->next=NULL; loc=-1; k=0; mark=1; } q->text[k++]=c; } } //在末尾加上一个'#' q=new wnode; q->next=NULL; q->id='#'; q->text[0]='\0'; q->n=0; p->next=q; return head; } //语法分析 void gammarAnalysis(wnode *head) { char E[20]; char A[20]; char r,d1,d2; int tn=0,en=head->n; ofstream table; table.open("siyuanshi.txt"); if(!table) { cout<<"Cannot open output file!"< exit(1); } cout<<"语法分析过程:"< cout<<"分析栈输入串操作"< int opS[20];//记录状态,状态栈 char opC[20];//记录符号,符号栈 int mark=-1,i,count=0; int loc=99;//指示程序指令地址 char c; wnode *p; p=head->next; int tops=0; int topc=0; opS[tops]=0; opC[topc]='#'; while(p) { showS(opS,tops,opC,topc,p); if(tops c=opC[tops+1]; else { c=p->id; if(c=='E') { for(i=0;i<20&&p->text[i]!='\0';i++) E[i]=p->text[i]; E[i]='\0'; } if(c=='A') { for(i=0;i<20&&p->text[i]!='\0';i++) A[i]=p->text[i]; A[i++]=';'; A[i]='\0'; } } mark=check(opS[tops],c); switch(mark) { case -1:cout<<'\t'<<"语法分析,翻译成功 ~~~"< case 1:tops=tops-2;topc=topc-1;opC[topc]='S'; cout<<'\t'<<'\t'<<" 归约 "< case 2:tops=tops-2;topc=topc-1;opC[topc]='S'; cout<<'\t'<<'\t'<<" 归约 "< case 3:tops=tops-1;topc=topc-0;opC[topc]='S'; cout<<'\t'<<'\t'<<" 归约 "< r=A[3];d1=A[2];d2=A[4]; table<<++loc<<"\t("< table<<++loc<<"\t("<<'='<<'\t'<<'T'< break; case 4:tops=tops-3;topc=topc-2;opC[topc]='C';cout<<'\t'<<'\t'<<" 归约 "< r=E[2];d1=E[1];if(r=='=')d2=E[4];else d2=E[3]; table<<++loc<<"\t("< if(r=='=')table< else table<<'\t'< if(en==1) table<<++loc<<"\t("<<"goto"<<'\t'<<'\t'<<'\t'< else table<<++loc<<"\t("<<"goto"<<'\t'<<'\t'<<'\t'< break; case 5:tops=tops-3;topc=topc-2;opC[topc]='T';cout<<'\t'<<'\t'<<" 归约 "< table<<++loc<<"\t("<<"goto"<<'\t'<<'\t'<<'\t'< break; case 101: case 102: case 103: case 104: case 105: case 106: case 107: case 108: case 109: case 110:if(tops==topc)p=p->next;opS[++tops]=mark-100;if(tops>topc)opC[++topc]=c; cout<<'\t'<<'\t'<<" 移入"< case 0:cout<<"ERROR!"< } } } void showS(int opS[],int tops,char opC[],int topc,wnode *hp) { // cout< int i=0,j=0; wnode *tp=hp; for(i=0;i<=topc;i++) cout< cout<<'\t'; while(tp) { cout< tp=tp->next; } cout< for(i=0;i<=tops;i++) cout< //cout< } int check(int s,char v) { int t=-1; switch(v) { case'i':t=0;break; case't':t=1;break; case'e':t=2;break; case'A':t=3;break; case'E':t=4;break; case'#':t=5;break; case'S':t=6;break; case'C':t=7;break; case'T':t=8;break; default:; } int r=LR[s][t]; return r; } int main() { FILE *fp; int n=100; cout<<"\n***IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)***"< cout<<"请输入文件名:"; cin.getline(Filename,n); fp=fopen(Filename,"r"); while (fp==NULL)//若打入的文件没有,则提示继续打入有效的路径名 { cout<<"Sorry,文件不存在!"< cout<<"请重新输入文件名:"; cin.getline(Filename,n); fp=fopen(Filename,"r"); } wnode *wlist; wlist=new wnode; wlist->id='#'; wlist->n=0; wlist->text[0]='\0'; wlist->next=NULL; wlist=lexcial(wlist); fclose(fp); word(); gammarAnalysis(wlist); ifstream fin("siyuanshi.txt"); string s; cout<<"输出四元式为:"< while( getline(fin,s) ) { cout<< s << endl; } return 0; } 7 软件的测试方法和测试结果 7.1软件的测试方法 程序刚写完时,有几个错误,根据系统的提示,合理设置断点进行调试7.2测试结果 运行程序出现DOS界面,显示所用语法与SLR(1)分析表 输入保存已写好的程序的文件名source.txt,回车键,词法分析生成单词表,语法分析生成语法分析过程和中间代码四元式 条件语句代码: 词法分析单词表: 最常用的翻译方法——古文今译六字法:对译法、增删法、移位法、保留法、替换法、意译法,简括为“对、增、移、留、换、意”六字。 对译法:就是用现代汉语中对等的词去对换被译的文言词。如“野芳发而幽香”,可译为“野花开散发出清幽的香味”。 增删法:就是将文言文中的单音节变成双音节词。如“齐师伐我”,可译为“齐国的军队攻打我们”,对少数没有相当的词表示的文言虚词可以不译或删去。“夫环而攻之”中的“夫”在译文时可以删去。 移位法:对一些与现代汉语句式结构不相同的文言句子,在译文时应换成现代汉语的语序加以调整。如“何陋之有”,是“有何陋”;又如“战于长勺”,应按照“于长勺战”的语序来翻译。 保留法:凡是古今意思相同的词(国号、帝号、年号、人名、地名、官名、度量衡单位等)可照录,不必另作翻译。如“庆历四年春,滕子京谪守巴陵郡”中的“庆历四年春”“滕子京”“巴陵”可照录不译。 替换法:对少数文言词语所表示的意义,在译文时可用现代汉语中意义相当的词去替换。如“吾欲之南海”中的“吾”替换为“我”,“之”替换为“去”,全句应译为“我想要去南海”。 意译法:对少数文词不能紧扣原文逐字逐句翻译的,要能在理解句子大概意义的前提下,找出相近的含义加以表示。如“鸢飞戾天者,望峰叹心”,直译为“鸢飞到天上,看到山峰,就会平息那心”,意译为“那些追逐名利想要飞黄腾达的人,远远望见这些雄奇的山峰,就平息那些热衷于功名利禄的心。”两相比较联系上下文意义,显然意译要比直译更准确。又如“不以物喜,不以己悲”,倘直译则为“不因为外物的变化而高兴,不因为自己的得失而悲伤”显然不符合语境,此处作者采用的是互文,因此要译为“不因外物的好坏和自己的得失或喜或悲”。 二、正确解释文言实词的技巧 1、由字形、字音推求字义 由象形、会意、指示三种造字法造出的汉字,其字义均和字形有关,这些字占了汉字的绝大部分,分析其字形结构,能帮助我们准确的理解词义。 如“日”构成的汉字多于光和时间有关,据此可以推知《岳阳楼记》中“春和景明”、“日星隐曜”中的“景”和“曜”分别为“日光”和“光芒”。 由于古汉语中存有大量的同音假借现象,我们在解释词义时就不能字字拘泥于本字本义的分析。当“疑于义者,以声求之”,这就是说一个字在具体的语言环境中,用本义和引申义都解释不通,不妨从字音方面去考虑。 如《三峡》“两岸连山,略无阙处”,其中的“阙”若用本义解释为“宫阙”在此显然不通,从字音考虑与“缺”通假,意思就准确了。 2、利用句子结构推断词义 句式的整齐、语意的对应是汉语一大特点,文言文中表现尤为突出,根据这一特点可以推知词义,进而准确地理解原文。 如《捕蛇者说》“殚其地之出,竭其庐之入”中“竭”的含义是“使……竭”,即“尽”的意思,那么与其对应的“殚”的含义也可为“使……殚”,即“尽”的意思。 3、利用词的构成推断词义 在文言文里,结构相同的词语或者作同一句子成分的词,往往在意义上具有相同、相近或相反的特点,利用这一特点,可以正确解释词语。 如:“优柔寡断”,“优”对“寡”,“柔”对“断”,后面的“寡断”是“少果断”,那么前面的“优柔”就应该是“多柔和”。 《文言文句子的翻译》 【教学目的】 1、落实《考试说明》“阅读浅显文言文能力”的训练,集中训练文言句子翻译的能力。 2、在学生已掌握文言文翻译的一般原则、技巧的基础上,加强踩点得分意识,以难词难句为突破口,指导学生掌握好高考文言句子翻译的方法技巧。 【教学重难点】 1、抓关键词句(关键词语、特殊句式),洞悉得分点。 2、掌握解题步骤、翻译方法,学以致用。 3、借助积累(课内文言知识、成语、语法结构、语境等),巧解难词难句。 【教学设计】 1、本课以学法指导和能力训练为重点,帮助学生归纳系统的文言句子的翻译方法(直译),并指导其应用。 2、在学生掌握了“信、达、雅”三字翻译目标和“翻译六字诀”的基础上,针对学生在文言翻译中的盲点,力图引导学生总结归纳出解决翻译疑难的技巧,并通过训练验证这些技巧的可操作性,使学生能举一反三,从而增强文言文翻译的信心。 3、本设计重在让学生易于掌握,便于利用,注重实用性和可操作性。 【教学步骤】 一.课堂导入 1、提问:从高考的特点与考查目的出发,文言文翻译要严格遵循的两个原则是什么? 第一: 忠于原文,力求做到_____、_____、_____ 。(信达雅) 第二: 字字落实,以_____为主,以_____为辅(直译意译) (①让学生用自己语言表述文言文翻译“信、达、雅”三字原则的理解 ②直译:指译文要与原文保持对应关系,重要的词语要相应的落实,要尽力保持原文遣词造句的特点和相近的表达方式,力求语言风格也和原文一致。意译:指着眼于表达原句的意思,在忠于愿意的前提下,灵活翻译原文的词语,灵活处理原文的句子结构。) 2、提问: 文言文翻译的“六字决”? ①对:一般指把原名中的文言单音词对译为现代汉语的双音或多音词。 ②换:有些词语意义已经发展,用法已经变化,语法已经不用,在译文中,应换这些古语为今语。 ③留:人名、地名、年号、国号、庙号、谥号、书名、物名都保留不译;与现代汉语表达一致的词语可保留。 ④删:一些没有实在意义的虚词,如表敬副词、发语词、部分结构助词等,同义复用的实词或虚词中的一个和偏义复词中陪衬的词应删去。 ⑤补:省略的部分;词语活用相应的部分;代词所指的内容;使上下文衔接连贯的内容等。 目录 1 系统描述 (2) 1.1目的 (2) 1.2设计内容: (2) 1.3翻译过程 (2) 1.4初始条件: (3) 1.5 开发平台 (3) 2文法及属性文法的描述 (3) 3 语法分析表设计 (4) 3.1 LR分析概述 (4) 3.2 LR(0)分析表 (5) 3.3 LR语法分析过程的设计思想及算法 (7) 3.4 翻译方法 (8) 4 中间代码形式的描述及中间代码序列的结构设计 (8) 5简要的分析与概要设计 (9) 6详细的算法描述 (9) 6.1 main函数 (10) 6.2词法分析 (10) 6.3 语法分析 (12) 7 测试方法和测试结果 (13) 7.1测试过程 (13) 7.2 测试结论 (14) 8 研制报告 (14) 8.1研制过程 (14) 8.2本设计的评价 (15) 8.3个人心得体会 (15) 9 参考文献 (16) 本科生课程设计成绩评定表 (17) FOR循环语句的翻译程序设计 ——LR方法、输出四元式 1 系统描述 1.1目的 通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。 1.2设计内容: 本设计按照要求设计出for语句的简单文法,并使用LR分析法对用户输入的程序进行分析和翻译。 对下列正确的程序输入: for(i=0;i<10;i++) { m=m+i; } 结果程序要对该输入进行词法分析,然后利用LR分析法对词法分析后得到的单词序列进行语法分析,经过语法制导翻译显示出等价的四元式表示的中间代码。 对于错误的程序输入,如: for(i=0;i<10) { m=m+i; } 结果程序要指出程序出错。 1.3翻译过程 IF-ELSE条件语句的翻译程序设计 1 问题描述 要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。 2 问题分析及编译系统的概要设计 编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。 这次实验涉及到词法分析、语法分析、语义分析及表格管理和出错管理。其中,词法分析至少要能识别关键字“if”、“then”和“else”,标识符(即自定义变量),数字,和运算符等等;语法分析要分析程序结构的合法性,即是否为文法的句子;语义分析要能够语法制导翻译出中间代码(三地址)并将其输出;表格管理是指符号表;出错处理是指在语法分析时,所有非文法句子的错误类型处理. 3 文法及属性文法的定义 3.1 文法: 文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序. IF-ELSE条件语句的文法如下所示: 0.A->EB 1.B->+EB|-EB|ε 2.E->FT 3.T->*FT|/FT|ε 4.F->i|(E) 或者能够更简洁一点: 0.S->if A THEN B ELSE C 1.A->m rop n 3.C->x=n arop m 4.rop->=|<|> 5.arop->+|-|*|/ 3.2 属性文法: 属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。 在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规 则的形式为:b:=f(c 1,c 2 ,…,c k )其中f是一个函数,而且或者①b是A的一个综合属性 并且c 1,c 2 ,…,c k 是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有 继属性,文法开始符号的所有继承属性作为属性计算前的初始值。 属性文法为: if(VT[opr]=='=') //{"="判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='='; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='>') //{">"判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='>'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } 文言文翻译方法及解题技巧 文言文翻译方法 一、基本方法:直译和意译 文言文翻译的基本方法有直译和意译两种。 所谓直译,是指用现代汉语的词对原文进行逐字逐句地对应翻译,做到实词、虚词尽可能文意相对。直译的好处是字字落实;其不足之处是有时译句文意难懂,语言也不够通顺。 所谓意译,则是根据语句的意思进行翻译,做到尽量符合原文意思,语句尽可能照顾原文词义。意译有一定的灵活性,文字可增可减,词语的位置可以变化,句式也可以变化。意译的好处是文意连贯,译文符合现代语言的表达习惯,比较通顺、流畅、好懂。其不足之处是有时原文不能字字落实。 这两种翻译方法当以直译为主,意译为辅。 二、具体方法:留、删、补、换、调、变。 “留”:就是保留。凡是古今意义相同的词,以及古代的人名、地名、物名、官名、国号、年号、度量衡单位等,翻译时可保留不变。例如:《晏子使楚》中的“楚王”、“晏婴”、“晏子”等不用翻译。 “删”,就是删除。删掉无须译出的文言虚词。例如:“寡人反取病焉”的“焉”是语气助词,可不译,本句的意思就是“我反而自讨没趣。”(《晏子使楚》)又如:“子猷、子敬俱病笃,而子敬先亡”中的“而”是连词,可不译,整句意思是“子猷与子敬都病重,子敬先死去。” “补”,就是增补。(1)变单音词为双音词,如《桃花源记》中“率妻子邑人来此绝境”,“妻子”一词是“妻子、儿女”的意思;(2)补出省略句中的省略成分,如《人琴俱亡》中“语时了不悲”,翻译为:(子猷)说话时候完全不悲伤。 “换”,就是替换。用现代词汇替换古代词汇。如把“吾、余、予”等换成“我”,把“尔、汝”等换成“你”。 “调”就是调整。把古汉语倒装句调整为现代汉语句式。例如《人琴俱亡》中“何以都不闻消息”,“何以”是“以何”的倒装,宾语前置句,意思是“为什么”。 “变”,就是变通。在忠实于原文的基础上,活译有关文字。“子猷问左右”(人琴俱亡))中的“左右”指的是“手下的人”,“左右对曰”(《晏子使楚》中的“左右”指的是“近臣”。 古文翻译口诀 古文翻译,自有顺序,首览全篇,掌握大意; 先明主题,搜集信息,由段到句,从句到词, 全都理解,连贯一起,对待难句,则需心细, 照顾前文,联系后句,仔细斟酌,揣摩语气, 力求做到,合情合理,词句之间,联系紧密。 若有省略,补出本意,加上括号,表示增益。 人名地名,不必翻译,人身称谓,依照贯例, "吾""余"为我,"尔""汝"为你。省略倒装,都有规律。 实词虚词,随文释义,敏化语感,因句而异。 译完之后,还须仔细,逐句对照,体会语气, 句子流畅,再行搁笔。 三、考试文言文翻译方法十字诀例析 (一)增。就是增补,在翻译时增补文言文省略句中的省略成分。注意:补出省略的成分或语句,要加括号。 文言文哲理句子加翻译 经典句子 文言文哲理句子加翻译 1、见侮而不斗,辱也。译:当正义遭到侮辱、欺凌却不挺身而出,是一种耻辱的表现。 2、不戚戚于贫贱,不汲汲于富贵。译:不为贫贱而忧愁,不热衷于发财做官。 3、一寸山河一寸金。译:祖国的每一寸山河比一寸黄金还要宝贵,是绝不能让给外人的。 4、勿以恶小而为之,勿以善小而不为。译:对任何一件事,不要因为它是很小的、不显眼的坏事就去做;相反,对于一些微小的。却有益于别人的好事,不要因为它意义不大就不去做它。 5、不迁怒,不贰过。译:犯了错误,不要迁怒别人,并且不要再犯第二次。 6、邑人奇之,稍稍宾客其父,或以钱币乞之。译:同县的人对他能作诗感到惊奇,渐渐地请他的父亲去做客,有的人还用钱求仲永题诗。 7、三人行,必有我师焉,择其善者而从之,其不善者而改之。译:三个人在一起,其中必有某人在某方面是值得我学习的,那他就可当我的老师。我选取他的优点来学习,对他的缺点和不足,我会引 以为戒,有则改之。 8、人生自古谁无死,留取丹心照汉青。译:自古以来,谁都难免会死的,那就把一片爱国的赤胆忠心留在史册上吧! 9、三人行,必有我师焉;择其善者而从之,其不善者而改之。译:几个人在一起走路,其中一定有人可以当我的老师。应当选择他们的优点去学习,看到自己也有他们的缺点就要改正。 10、中峨冠而多髯者为东坡。译:中间戴着高高的帽子长着浓密胡子的人是苏东坡。 11、有益国家之事虽死弗避。译:对国家有利的事情要勇敢地去做,就算有死亡的危险也不躲避。 12、良药苦于口而利于病,忠言逆于耳而利于行。译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。 13、少顷,但闻屏障中抚尺一下,满坐寂然,无敢哗者。译:过了一会儿,只听到围幕中抚尺一拍,全场都安静下来,没有一个敢大声说话的。 14、小来思报国,不是爱封侯。译:从小就想着报效祖国,而不是想着要封侯当官。 15、屠大窘,恐前后受其敌。译:屠户很窘迫,恐怕前后受到两狼的攻击。 16、宾客意少舒,稍稍正坐。译:宾客们的心情稍微放松了,身子渐渐坐正了。 课程设计任务书 学生姓名:辛波专业班级:计算机0707班 指导教师:彭德巍工作单位:计算机科学与技术学院 题目: FOR循环语句的翻译程序设计(递归下降法、输出四元式) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码四元式的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 01月 08日 系主任(或责任教师)签名: 2010年 01月 08日 《文言文语句翻译》(高三参赛) 一、设计说明 高考对文言文语句翻译的考查,虽然材料选自课外,但是考查立足于课内,立足于考查学生对所学文言知识能否灵活运用之上,对学生理解并翻译语句能力的客观考查,符合课程改革和语文教学的发展方向。结合《课程标准》,立足教材本身,勾连高考试题,我设计引导学生在理解和运用语言的实践活动中悟法、学法、用法,调动学生自主、合作、探究学习的积极性,进行适合学生实际水平的有效复习。 该学案分三部分,课前案重在引导学生了解高考命题要求及考点阐释,通过自主复习,运用课内掌握的文言基础知识,总结出语句翻译的具体方法。课中案重在就学生自主反馈的翻译方法进行展示和纠正,以练—讲—练的形式,将课内例句与高考样题衔接起来,渐次推进,引导学生灵活运用翻译方法,总结答题规律,提升掌握语言文字的能力。课后案作为当日作业,旨在让学生夯实基础,巩固演练,继续钻研,锐意进取。二、材料依据 必修教材篇目《师说》《赤壁之战》《鸿门宴》《齐桓晋文之事》等,《〈史记〉选读》篇目《信陵君窃符救赵》《廉颇蔺相如列传》及08—10年高考部分省份样题。 三、设计内容: 学习目标: 知识与能力:了解并掌握文言文语句翻译的具体要求,探求翻译的具体方法。 过程与方法:解读考点,夯实旧知,练中悟法、学法。 情感态度与价值观:培养扎实严谨的学习作风。 课前复习步骤: 一、解读考点 阅读并勾画要点:考纲中“理解并翻译文中的句子”,意思是说“翻译”须以“理解”为前提,“理解”,就是准确把握字句在文段中的正确的意义;而“翻译”则是将文言句子译为规范的现代汉语。考查的句子是有特点的,在实词、虚词、句式、活用、通假字等方面有典型性的句子。测试题目出在“课外”,答案在“课内”。这里“课外”的含义一般指“选材”是学生没学过的,题目是没做过的;“课内”的含义可从两个方面理解:一是指测试的知识是学生“课内”学过的,二是学生可以利用学过的知识加以推断。 二、明确原则 文言文语句翻译原则——信(忠实原文)、达(文意通达流畅)、雅(语言富有文采)。 三、链接课内 根据参考篇目,结合梳理笔记,复习文言基础知识。 四、探求方法 1、翻译下列句子,注意句中划线和括号处,并用一个词概括所用方法。要求书写规范。第一组:魏安釐王二十年,秦昭王已破赵长平军,又进兵围邯郸。 译文:。 劳苦而功高如此,未有封侯之赏…… 译文:。 WHILE循环语句的翻译程序设计(简单优先法、输出四元式) 1 需求说明或问题描述 1.1 问题描述 对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。 1.2 需求说明 1 写出符合给定的语法分析方法的文法及属性文法 2 完成题目要求的中间代码四元式的描述 3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计 4 设计若干用例,上机通过测试 2 文法及语法设计 2.1文法及属性文法: 文法G=(V N ,V T ,P ,S) 其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;} P={ S -> w(B){E} E -> C C -> CA C -> A A -> iPA A -> i; P -> +|-|*|/ B -> iTi B-> i T -> >|<|>=|<=|== } 2.2 语法分析方法描述及语法分析表设计 2.2.1 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将各种文言文最常用的翻译方法整理
文言文句子的翻译
FOR循环语句的翻译程序设计
IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2
文言文翻译方法及解题技巧
文言文哲理句子加翻译
for循环语句的翻译
《文言文语句翻译》
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)