编译原理 TINY语言 词法分析 语法分析

合集下载

编译原理词法分析与语法分析的核心算法

编译原理词法分析与语法分析的核心算法

编译原理词法分析与语法分析的核心算法编译原理是计算机科学与技术领域中的一门重要课程。

在编程中,我们常常需要将高级语言编写的程序翻译成机器语言,使计算机能够理解并执行我们编写的程序。

而编译原理中的词法分析和语法分析是编译器的两个核心算法。

一、词法分析词法分析是编译器的第一个阶段,它负责将输入的字符序列(源代码)划分为一个个的有意义的词素(Token),并生成相应的词法单元(Lexeme)。

词法分析的核心算法主要包括以下两个步骤:1. 正则表达式到有限自动机的转换:正则表达式是一种描述字符串匹配模式的表达式,它可以用来描述词法分析中各种词素的规则。

而有限自动机则是一种用来识别或匹配正则表达式所描述的模式的计算模型。

将正则表达式转换为有限自动机是词法分析的关键步骤之一。

2. 词法分析器的生成:在将正则表达式转换为有限自动机后,我们可以使用生成器工具(如Lex、Flex等)来生成词法分析器。

词法分析器可以按照预定的规则扫描源代码,并将识别出的词素转换成相应的词法单元,供后续的语法分析使用。

二、语法分析语法分析是编译器的第二个阶段,它负责分析和处理词法分析阶段生成的词法单元序列,并根据预定的语法规则确定语法正确的序列。

语法分析的核心算法主要包括以下两个步骤:1. 上下文无关文法的定义:上下文无关文法(Context-Free Grammar,简称CFG)是一种用于描述形式语言的文法。

它由一组产生式和终结符号组成,可以用于描述语法分析中的语法规则。

在语法分析中,我们需要根据具体编程语言的语法规则,编写相应的上下文无关文法。

2. 语法分析器的生成:通过使用生成器工具(如Yacc、Bison等),我们可以根据上下文无关文法生成语法分析器。

语法分析器可以根据预先定义的文法规则,对词法单元序列进行分析,并构建出语法树(Parse Tree)供后续的语义分析和代码生成使用。

综上所述,词法分析与语法分析是编译原理中的两个重要阶段,也是实现编译器的核心算法。

TINY词法分析编译程序的部分实现

TINY词法分析编译程序的部分实现

TINY编译程序的部分实现TINY的程序结构很简单,它在语法上与Ada或Pascal的语法相似:仅是一个由分号分隔开的语句序列。

另外,它既无过程也无声明。

所有的变量都是整型变量,通过对其赋值可较轻易地声明变量(类似FORTRAN或BASIC)。

它只有两个控制语句:if语句和repeat语句,这两个控制语句本身也可包含语句序列。

if语句有一个可选的else部分且必须由关键字end结束。

除此之外,read语句和write语句完成输入/输出。

在花括号中可以有注释,但注释不能嵌套。

TINY的表达式也局限于布尔表达式和整型算术表达式。

布尔表达式由对两个算术表达式的比较组成,比较使用<与=比较算符。

算术表达式可以包括整型常数、变量、参数以及4个整型算符+、-、*、/,此外还有一般的数学属性。

布尔表达式可能只作为测试出现在控制语句中——而没有布尔型变量、赋值或I/O。

虽然T I N Y缺少真正程序设计语言所需要的许多特征——过程、数组和浮点值,是一些较大的省略——但它足可以用来例证编译器的主要特征了。

TINY编译器简单说明TINY编译器包括以下的C文件,(为了包含而)把它的头文件放在左边,它的代码文件放在右边:globals.h main.cutil.h util.cscan.h scan.cparse.h parse.csymtab.h symtab.canalyze.h analyze.ccode.h code.ccgen.h cgen.c除了将main.c放在globals.h的前面之外,这些文件的源代码及其行号都按顺序列在附录B中了。

任何代码文件都包含了globals.h头文件,它包括了数据类型的定义和整个编译器均使用的全程变量。

main.c 文件包括运行编译器的主程序,它还分配和初始化全程变量。

其他的文件则包含了头/代码文件对、在头文件中给出了外部可用的函数原型以及在相关代码文件中的实现(包括静态局部函数)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编译原理词法分析与语法分析的过程与方法

编译原理词法分析与语法分析的过程与方法

编译原理词法分析与语法分析的过程与方法编译原理是计算机科学领域中的重要内容之一,它研究如何将高级语言程序转化为机器语言的过程。

其中,词法分析和语法分析是编译原理中的两个重要阶段。

本文将详细介绍词法分析与语法分析的过程与方法。

一、词法分析的过程与方法词法分析是编译器的第一个阶段,其主要任务是将源程序的字符序列划分成有意义的语言单元,也就是词法单元。

以下是词法分析的过程与方法:1. 扫描:词法分析器从源程序中读取字符序列,并按照事先定义的规则进行扫描。

2. 划分词法单元:根据事先定义的规则,词法分析器将字符序列划分为不同的词法单元,如关键字、标识符、常量、运算符等。

3. 生成词法单元流:将划分好的词法单元按照顺序生成词法单元流,方便后续的语法分析阶段使用。

4. 错误处理:在词法分析过程中,如果发现了不符合规则的字符序列,词法分析器会进行错误处理,并向用户报告错误信息。

二、语法分析的过程与方法语法分析是编译器的第二个阶段,其主要任务是分析词法单元流,并判断是否符合语法规则。

以下是语法分析的过程与方法:1. 构建语法树:语法分析器根据语法规则构建抽象语法树(AST),用于表示源程序的语法结构。

2. 自顶向下分析:自顶向下分析是一种常用的语法分析方法,它从根节点开始,按照语法规则向下递归分析,直到生成叶子节点对应的词法单元。

3. 底部向上分析:底部向上分析是另一种常用的语法分析方法,它从词法单元开始,逐步合并为更高级的语法结构,直到生成抽象语法树的根节点。

4. 错误处理:在语法分析过程中,如果发现了不符合语法规则的词法单元流,语法分析器会进行错误处理,并向用户报告错误信息。

三、词法分析与语法分析的关系与区别词法分析和语法分析在编译原理中起着不同的作用:1. 关系:词法分析是语法分析的前置阶段,它为语法分析提供了有意义的词法单元流。

语法分析基于词法单元流构建语法树,判断源程序是否满足语法规则。

2. 区别:词法分析主要关注词法单元的划分和分类,它是基于字符序列的处理;而语法分析主要关注词法单元之间的组合和语法结构的判断,它是基于语法规则的处理。

编译原理课程设计C编译器词法分析与语法分析的实现

编译原理课程设计C编译器词法分析与语法分析的实现

编译原理课程设计报告课落款称: C-编译器词法分析与语法分析的实现提交文档学生姓名:黄臻旸提交文档学生学号: 1043041227 同组成员名单:无指导教师姓名:金军指导教师评阅成绩:指导教师评阅意见:..提交报告时刻:2021年 6 月 5 日编译原理课程设计报告 (1)一、课程设计目标 (3)二、分析与设计 (3)2.一、说明所用的方式: (3)2.二、系统总图: (3)2.2.一、scanner部份: (3)2.2.二、parse部份: (5)2.2.3、代码设计说明 (7)3、程序代码实现 (10)3.一、获取输入部份(在main.c中): (10)3.二、词法分析部份(在scan.c中): (10)3.3、语法分析部份(在parse.c中): (15)3.4、输出与结点的成立(在util.c中) (29)3.五、TokenType、treeNode与结点类型的声明(在globals.h中) (35)4、测试结果 (36)五、总结 (40)5.一、收成 (43)5.二、不足 (43)一、课程设计目标本次实验,本C- 编译器要紧设计而且实现了C- 编译器的词法分析功能与语法分析功能。

二、分析与设计2.一、说明所用的方式:各部份的实现方式(scanner:手工实现、Lex;parser:递归下降、LL(1)、LR(0)、SLR(1)、2.二、系统总图:2.2.一、scanner部份:2.2.1.一、实验原理:扫描程序的任务是从源代码中读取字符并形成由编译器的以后部份(一般是分析程序)处置的逻辑单元。

由扫描程序生成的逻辑单元称作记号(token),将字符组合成记号与在一个英语句子中将字母将字母组成单词并确信单次的含义很相像。

在此程序中,我将记号分成了以下类型:typedef enum {ENDFILE,ERROR,IF,ELSE,INT,RETURN,VOID,WHILE,ID,NUM,ASSIGN,PLUS,MINUS,TIMES,OVER,L T,LET,BT,BET,EQ,NEQ,// = + - * / < <= > >= == !=LPAREN_1,RP AREN_1,SEMI,COM,LPAREN_2,RP AREN_2,LPAREN_3,RP AREN_3,LIN,RIN// { } ; , [ ] ( ) /*} TokenType;其中,关键字有:else、if、int、return、void、while;专用符号有:+、-、*、/、<、<=、>、>=、==、~=、=、;、,、(、)、[、]、{、}、/*、*/其他标记是ID、NUM,通过以下正那么表达式概念:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9小写大写字母是有区别的。

编译原理实验 词法分析&语法分析程序

编译原理实验 词法分析&语法分析程序

编译原理实验词法分析程序实验一:词法分析程序1、实验目的从左至右逐个字符的对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号形式的中间程序。

2、实验内容表C语言子集的单词符号及内码值单词符号种别编码助记符内码值while 1 while --if 2 if --else 3 else --switch 4 switch --case 5 case --标识符 6 id id在符号表中的位置常数7 num num在常数表中的位置+ 8 + --- 9 - --* 10 * --<= 11 relop LE< 11 relop LT== 11 relop LQ= 12 = --; 13 ; --输入源程序如下if a==1 a=a+1;else a=a+2;输出对应的单词符号形式的中间程序3、实验过程实验上机程序如下:#include "stdio.h"#include "string.h"int i,j,k;char s ,a[20],token[20];int letter(){if((s>=97)&&(s<=122))return 1;else return 0;}int Digit(){if((s>=48)&&(s<=57))return 1;else return 0;}void get(){s=a[i];i=i+1;}void retract(){i=i-1;}int lookup(){if(strcmp(token, "while")==0)return 1;else if(strcmp(token, "if")==0)return 2;else if(strcmp(token,"else")==0)return 3;else if(strcmp(token,"switch")==0)return 4;else if(strcmp(token,"case")==0)return 5;else return 0;}void main(){printf("please input you source program,end('#'):\n");i=0;do{i=i+1;scanf("%c",&a[i]);}while(a[i]!='#');i=1;memset(token,0,sizeof(char)*10);j=0;get();while(s!='#'){if(s==' '||s==10||s==13)get();else{switch(s){case'a':case'b':case'c':case'd':case'e':case'f':case'g':case'h':case'i':case'j':case'k':case'l':case'm':case'n':case'o':case'p':case'q':case'r':case's':case't':case'u':case'v':case'w':case'x':case'y':case'z':while(Digit()||letter()){token[j]=s;j=j+1;get();}retract();k=lookup();if(k==0)printf("(6,%s)\n",token); elseprintf("(%d,null)\n",k); break;case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':while(Digit()){token[j]=s;j=j+1;get();}retract();printf("(%d,%s)\n",7,token); break;case'+':printf("(+,null)\n"); break;case'-':printf("(-,null)\n"); break;case'*':printf("(*,null)\n"); break;case'<':get();if(s=='=')printf("(relop,LE)\n"); else{retract();printf("(relop,LT)\n");}break;case'=':get();if(s=='=')printf("(relop,EQ)\n"); else{retract();printf("(=,null)\n");}break;case';':printf("(;,null)\n"); break;default:printf("(%c,error)\n",s);break;}memset(token,0,sizeof(char)*10);j=0;get();}}}4、实验结果实验结果分析:if是关键字,对应种别编码为2,输出(2,null)a是标识符,对应种别编码为6,值为a,输出(6,a)==的助记符是relop,内码值为LE,输出(relop,LE)1是常数,对应种别编码为7,值为1,输出(7,1)a是标识符,对应种别编码为6,值为a,输出(6,a)=是赋值符号,直接输出,(=,null)a是标识符,对应种别编码为6,值为a,输出(6,a)+是运算符,直接输出(=,null)1是常数,对应种别编码为7,值为1,输出(7,1);是语句结束符号,直接输出(;,null)else是关键字,对应种别编码为3,输出(3,null)a是标识符,对应种别编码为6,值为a,输出(6,a)=是赋值符号,直接输出,(=,null)a是标识符,对应种别编码为6,值为a,输出(6,a)+是运算符,直接输出(=,null)2是常数,对应种别编码为7,值为2,输出(7,2);是语句结束符号,直接输出(;,null)#是输入结束标志编译原理实验语法分析程序实验二:语法分析程序1、实验目的:将单词组成各类语法单位,讨论给类语法的形成规则,判断源程序是否符合语法规则3、实验内容:给定文法:G[E]:E→E+E|E-E|E*E|E/E|(E)E→0|1|2|3|4|5|6|7|8|9首先把G[E]构造为算符优先文法,即:G’[E]:E→E+T|TT→T-F|FF→F*G|GG→G/H|HH→(E)|i得到优先关系表如下:+ - * / i ( ) # + ·><·<·<·<·<··>·> - ·>·><·<·<·<··>·> * ·>·>·><·<·<··>·> / ·>·>·>·><·<··>·>i ·>·>·>·>·>·>( <·<·<·<·<·<·=) ·>·>·>·>·>·> # <·<·<·<·<·<·=构造出优先函数+ - * / i ( ) #f 6 8 10 12 12 2 12 2g 5 7 9 11 13 13 2 2要求输入算术表达式:(1+2)*3+2*(1+2)-4/2输出其对应的语法分析结果4、实验过程:上机程序如下:#include "stdio.h"#include "string.h"char a[20],optr[10],s,op;int i,j,k,opnd[10],x1,x2,x3;int operand(char s){if((s>=48)&&(s<=57))return 1;else return 0;}int f(char s){switch(s){case'+':return 6;case'-':return 8;case'*':return 10;case'/':return 12;case'(':return 2;case')':return 12;case'#':return 2;default:printf("error");}}int g(char s){switch(s){case'+':return 5;case'-':return 7;case'*':return 9;case'/':return 11;case'(':return 13;case')':return 2;case'#':return 2;default:printf("error");}}void get(){s=a[i];i=i+1;}void main(){printf("请输入算数表达式,并以‘#’结束:\n");i=0;do{scanf("%c",&a[i]);i++;}while(a[i-1]!='#');i=0;j=0;k=0;optr[j]='#';get();while((optr[j]!='#')||(s!='#')){if(operand(s)){opnd[k]=s-48;k=k+1;get();}else if(f(optr[j])<g(s)){j=j+1;optr[j]=s;get();}else if(f(optr[j])==g(s)){if(optr[j]=='('&&s==')'){j=j-1;get();}else if(optr[j]=='('&&s=='#'){printf("error\n");break;}else if(optr[j]=='#'&&s==')'){printf("error\n");break;}}else if(f(optr[j])>g(s)){op=optr[j];j=j-1;x2=opnd[k-1];x1=opnd[k-2];k=k-2;switch(op){case'+':x3=x1+x2;break;case'-':x3=x1-x2;break;case'*':x3=x1*x2;break;case'/':x3=x1/x2;break;}opnd[k]=x3;k=k+1;printf("(%c,%d,%d,%d)\n",op,x1,x2,x3);}else{printf("error\n");break;}}if(j!=0||k!=1)printf("error\n");}5、实验结果:实验结果分析:(1+2)*3+2*(1+2)-4/2#因为‘)’优先级大于‘*’,先计算1+2=3,并输出(+,1,2,3)原式变为:3*3+2*(1+2)-4/2#因为‘*’优先级大于‘+’,先计算3*3=9,并输出(*,3,3,9)原式变为:9+2*(1+2)-4/2#因为‘)’优先级大于‘-’,先计算1+2=3,并输出(+,1,2,3)原式变为:9+2*3-4/2#因为‘*’优先级大于‘-’,先计算2*3=6,并输出(*,2,3,6)原式变为:9+6-4/2#因为‘/’优先级大于‘#’,先计算4/2=2,并输出(/,4,2,2)原式变为:9+6-2#因为‘-’优先级大于‘#’,先计算6-2=4,并输出(-,6,2,4)原式变为:9+4#因为‘+’优先级大于‘#’,计算9+4=13,并输出(+,9,4,13)原式变为13#优先级等于#,跳出while循环,运算结束!。

TINY部分源码分析报告

TINY部分源码分析报告

TINY部分源码分析报告TINY是一种简单的编程语言,用于教学目的。

它的语法规则非常简单,只有几个基本的关键字和语句。

在这篇报告中,我将对TINY的部分源码进行分析。

首先,让我们来看一下TINY的词法分析器部分的源码。

TINY的词法分析使用了一种基于有限自动机的方法。

源码中定义了几个关键字和运算符的正则表达式模式,并使用这些模式进行匹配。

如果匹配成功,就返回对应的记号。

接下来是语法分析器部分的源码。

TINY的语法分析使用了递归下降的方法。

源码中定义了几个非终结符的函数,每个函数对应语法中的一个产生式。

函数根据当前输入的记号,选择适当的产生式,并继续递归下降,直到匹配整个输入。

TINY的语法规则非常简单,只有if语句、while语句、表达式、赋值语句等几个基本的语法结构。

在语法分析器的源码中,每个函数都对应一个语法规则。

例如,函数parseStatement用于解析语句,它根据当前输入的记号,选择适当的产生式,例如if语句的产生式或赋值语句的产生式。

为了简化语法分析过程,TINY使用了LL(1)文法。

LL(1)文法是指,对于任意一个非终结符X和一个记号a,最多只有一个产生式可以选择。

这样可以使得语法分析过程更加简单和高效。

除了词法分析器和语法分析器,TINY还包括了一个解释器部分的源码。

解释器使用了递归下降的方法,根据语法分析的结果进行解释执行。

解释器遵循TINY的语义规则,例如执行赋值语句将变量的值更新为表达式的值。

总结起来,TINY是一种简单的编程语言,它的源码包括词法分析器、语法分析器和解释器部分。

词法分析器负责将源代码转化为记号序列,语法分析器负责根据记号序列生成抽象语法树,解释器负责执行抽象语法树中的操作。

TINY的源码采用了有限自动机和递归下降的方法,通过正则表达式模式和LL(1)文法来进行匹配和选择。

整个源码非常简洁,适合用于教学和学习。

C语言编译原理词法分析和语法分析

C语言编译原理词法分析和语法分析

C语言编译原理词法分析和语法分析编程语言的编写和使用离不开编译器的支持,而编译器的核心功能之一就是对代码进行词法分析和语法分析。

C语言作为一种常用的高级编程语言,也有着自己的词法分析和语法分析规则。

一、词法分析词法分析是编译器的第一阶段,也是将源代码拆分为一个个独立单词(token)的过程。

在C语言中,常见的单词包括关键字(如if、while等)、标识符(如变量名)、常量(如数字、字符常量)等。

词法分析器会根据预定义的规则对源代码进行扫描,并将扫描到的单词转化为对应的符号表示。

词法分析的过程可以通过有限自动机来实现,其中包括各种状态和状态转换规则。

词法分析器通常会使用正则表达式和有限自动机的方法来进行实现。

通过词法分析,源代码可以被分解为一个个符号,为后续的语法分析提供基础。

二、语法分析语法分析是编译器的第二阶段,也是将词法分析得到的单词序列转换为一棵具有语法结构的抽象语法树(AST)的过程。

在C语言中,语法分析器会根据C语言的文法规则,逐句解析源代码,并生成相应的语法树。

C语言的语法规则相对复杂,其中包括了各种语句、表达式、声明等。

语法分析的过程主要通过递归下降分析法、LR分析法等来实现。

语法分析器会根据文法规则建立语法树的分析过程,对每个语法结构进行逐步推导和分析,最终生成一棵完整的语法树。

三、编译器中的词法分析和语法分析在编译器中实现词法分析和语法分析是一项重要的技术任务。

编译器通常会将词法分析和语法分析整合在一起,形成一个完整的前端。

在C语言编译器中,词法分析和语法分析器会根据C语言的词法规则和文法规则,对源代码进行解析,并生成相应的中间表示形式,如语法树或者中间代码。

词法分析和语法分析的结果会成为后续编译器中各个阶段的输入,如语义分析、中间代码生成、目标代码生成等。

编译器的优化和错误处理也与词法分析和语法分析有密切关系。

因此,对词法分析和语法分析的理解和实现对于编译器开发者而言是非常重要的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京信息工程大学 编译原理 课程设计 2 / 12
一、设计题目:
根据给定的 TINY 语言规范,为 TINY 语言设计编译器,要求完成 TINY 语言的词法分析和语法分析部分。
二、课题解析
词法分析 词法分析的主要任务是:输入源程序,对构成源程序的字符串扫描和分解,识别出一个个的单词,如关 键字、标识符、数字、运算符等等。 词法分析要完成的工作有:
关键字
if then else end repeat until read write
标识符(Identifier)
[a-zA-Z][a-zA-Z0-9]*
数字(Number)
[0-9]+
运算符
+ - * / < = :=
分隔符
;()
注释
{和}之间的内容为 TINY 源代码中的注释
文法
Program →
token.Append(ch); reader.Read(); } string data = token.ToString(); result.Add(new Token(row, col, Definition.GetWordType(data), data)); } else if (isDigit(ch)) { token.Append(ch); while ((ch = reader.ViewOne()) != '\0' && isDigit(ch)) { token.Append(ch); reader.Read(); } result.Add(new Token(row, col, TokenType.Number, token.ToString())); } else switch (ch) { case ':':
四、相关数据结构
class Token //单词
{ int Row;//单词所在行 int Col;//单词所在列 TokenTypes Type;//单词类型 int Value//单词值
}
class TINYNode //语法树中一个单词节点 {
String Data;//单词值 List<TINYNode> Children;//子节点 }
七、收获和体会
通过这次课程设计,加深了对编译原理的理解,了解了编译器的构造,能实验简单的编译器前段,对以 后的学习很有帮助。
南京信息工程大学 编译原理 课程设计 6 / 12
附录一:TINY 语言文法规范
字符集
ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghjklmnopqrs tuvwxyz0123456789:=;()+-*/<{}
三、算法说明
本课程设计完成了处理 TINY 语言的词法分析和语法分析部分。 词法分析部分,根据 TINY 语言的定义,构造出识别 TINY 语言 Token 的 DFA m,在此基础上进行编 程,完成词法分析工作。词法分析结果为一个 Token 串,包括 Token 所在行、所在列、Token 类型和 Token 值。 语法分析部分,根据 TINY 语言的文法,初始化程序的过程中。导入 TINY 语言文法,根据文法识别出 TINY 语言的终结符(NT)和非终结符(VT)。消除文法的左递归,提取左公因子,初始化 First 集合 Follow 集, 构造 LL1 分析表,采用自顶向下的分析方法进行语法分析。若输入的 Token 串符合文法的定义,则给出语 法树;否则指出错误所在的地方,并在已经生成的语法树中表示出相应的出错地点。
row = reader.Row; col = reader.Col; token = new StringBuilder(); if (isLetter(ch)) {
token.Append(ch); while ((ch = reader.ViewOne()) != '\0' && isLetterOrDigit(ch)) {
过滤掉源程序中的空白字符和注释,因为这些信息仅增加了源程序的可读性,便于程序员阅读 和维护源代码,而对语法分析是完全无用的。
识别各种常量,并且把字符形式的表示翻译成编译器的内部表示。 识别标识符和关键字。 识别源程序中德各种符号。 语法分析 语法分析的主要任务是接收词法分析程序识别出来的单词符号串,判断它们是否由某种语言的文法产 生,即判断被识别符号串是否为某种语法成分。除此之外,还要进行语法检查,为后面的语义分析和代码生 成做准备。 通过语法分析,可以建立相应的语法树。根据建立语法树方式的不同,可以把语法分析过程分为两大 类,即自顶向下和自底向上的分析法。自顶向树根的方向建立。
编译原理
课程设计
题 目 TINY 语言词法分析语法分析
学生姓名 学号 院系 指导教师
54andy1@ 计算机与软件学院
年月 日
目录
一、设计题目: ......................................................................................................................................................... 3 二、课题解析 ............................................................................................................................................................. 3
词法分析 ..................................................................................................................................................... 3 语法分析 ..................................................................................................................................................... 3 三、算法说明 ............................................................................................................................................................. 3 四、相关数据结构 ..................................................................................................................................................... 3 五、实验截图 ............................................................................................................................................................. 4 六、运行结果分析 ..................................................................................................................................................... 6 七、收获和体会 ......................................................................................................................................................... 6 七、附录一:TINY 语言文法规范........................................................................................................................... 7 八、附录二:部分程序源代码 ................................................................................................................................. 8
南京信息工程大学 编译原理 课程设计 7 / 12
附录二:部分程序源代码
词法分析部分
public static List<Token> GetResult(string SourceCode) {
List<Token> result = new List<Token>(); SourceReader reader = new SourceReader(SourceCode); char ch; StringBuilder token; int row, col; while ((ch = reader.Read()) != '\0') {
stmt-sequence →
statement →
if-stmt

repeat-stmt →
assign-stmt →
read-stmt →
write-stmt →
相关文档
最新文档