Pascal语言编译器的设计与实现
- 格式:doc
- 大小:146.50 KB
- 文档页数:15
第16卷 增刊3 广西工学院学报 V ol.16 Sup3 2005年10月 JO U RN A L OF GU AN G XI U N IV ERSIT Y OF T ECHNO L OG Y Oct.2005文章编号:1004-6410(2005)S3-0083-04GPJ_Pascal集成开发坏境——词法分析、语法分析、语义分析和中间代码生成计算机科学与技术 011班 2001041148 张 弦指导教师:原庆能摘 要:G PJ_Pascal是P ASCA L的一个子集。
G PJ_P ascal集成开发环境是编辑、编译和执行GP J_Pascal程序的平台,具有可视化的用户界面。
本文主要介绍了GP J_P ascal编译器的构造,其中,词法分析器扫描源程序,根据语言的词法规则,分解和识别出每个单词,同时进行词法检查;语法分析器以词法分析器生成的符号表为基础,验证单词符号串序列是否是语言文法的一个句子;在分析过程中,符号表被频繁地用来建立表项、查找表项、填充和引用表项;语法分析子程序采用了自上而下的递归子程序法,在语法分析的同时,也根据程序的语义生成有利于程序移植的相应三元式代码,并提供了出错处理的机制。
GP J_P ascal编译器总体结构完整、清晰,含义明确、易读、易理解,出错少,可靠性大,并易于对G PJ_Pascal的词法和语法进行扩充。
关 键 词:词法分析;语法分析;符号表;三元式Abstract:GPJ_Pascal is a subset of Pascal.GPJ_Pascal Integ rated Developm ent Env ir onm ent is a platform w ith a visual user's interface,and the GPJ_Pascal pro gram can be edited,co mpiled and perform ed.In the paper,the structure o f the GPJ_Pascal compiler is mainly intr oduced,the lexer can scan the sour ce prog ram acco rding to the m orphology rule o f lang uag e w hich can decompose and disting uish ev ery w or d,and car ry out mor pholog y inspection at the sam e tim e;the parser is the basis o f the sym bol table generated by verify ing w hether a w ord sym bo l string is a sentence of the lang uage gramm ar o r not;in analysis process,the item is utilized to establish,seek,fill and reference for m frequently;the parse subprog ram has adopted top-botto m recursiv e subprog ram law while parsing,it also gener ates the corresponding triple code according to the semantic, w hich is helpful for prog ram transplant,and offers mistaken handle m echanism.The overall structure of the GPJ_Pascal co mpiler is com plete,distinct,clear m eaning,easily r eading and understanding,co mpiling fewer m istakes,big reliability,and easily ex panding the morpholog y and g rammar.Key words:lex er;par ser;symbol table;triple一、课题分析GPJ_Pascal是PASCAL的一个子集,包含了Pascal大部分的语法成分,能满足一般的编程需要。
pascal源代码编译
Pascal是一种编程语言,它的源代码需要编译成可执行文件才能在计算机上运行。
下面是一个简单的Pascal源代码编译的步骤:
1. 编写Pascal源代码
首先,您需要使用文本编辑器编写Pascal源代码。
例如,您可以使用Notepad、Sublime Text、Visual Studio Code等文本编辑器。
2. 保存源代码文件
将Pascal源代码保存为以“.pas”为扩展名的文件。
例如,您可以将其命名为“hello.pas”。
3. 安装Free Pascal编译器
Free Pascal编译器是一种免费的Pascal编译器,您可以从其官方网站下载并安装它。
安装完成后,您可以在命令行中运行“fpc”命令来启动编译器。
4. 编译源代码文件
在命令行中,导航到保存Pascal源代码文件的目录,并运行以下命令来编译源代码文件:
```
fpc hello.pas
```
如果编译成功,将在当前目录中生成一个名为“hello.exe”的可执行文件。
5. 运行可执行文件
在命令行中,运行以下命令来运行可执行文件:```
hello.exe
```
如果一切正常,您应该能够看到程序的输出。
PASCAL语言程序设计知识讲解资料PASCAL是一种结构化程序设计语言,起初由尼科劳斯·维尔特设计于1968年。
它是一种意图激发清晰结构化编程方法的语言,因此在计算机科学教育中得到广泛应用。
现在,PASCAL仍然是一种非常流行的教学语言,用于教授编程基础和算法。
1.结构化编程:PASCAL语言的一个重要设计目标是通过结构化编程来提高代码的可读性和可维护性。
PASCAL提供了块、子程序、循环结构和条件语句等结构来帮助程序员组织代码并降低编程错误的可能性。
2.关注类型安全:PASCAL是一种静态类型语言,它要求在编译时为每个变量明确指定数据类型。
这样做有助于提前发现类型错误,并增加程序的可靠性。
PASCAL还支持用户自定义类型,使程序员能够创建抽象数据类型来更好地组织和管理数据。
3.丰富的标准库:PASCAL提供了丰富的标准库,其中包括文件操作、字符串处理、图形绘制、数学计算等常用功能。
这些库函数使程序员能够更轻松地开发复杂的应用程序,同时也可以节省大量的编写和调试代码的时间。
4. 跨平台支持:PASCAL编译器可以生成适用于不同操作系统的可执行代码,包括Windows、Mac和Linux等。
这种跨平台支持使得程序员可以在不同的操作系统上编写和运行PASCAL程序,而无需进行太多的修改。
5.功能强大:虽然PASCAL是一种教学语言,但它仍然具备很强的功能。
它支持递归、指针操作、动态内存分配等高级特性,为程序员提供了更多的灵活性和控制力。
下面是一个简单的示例程序,展示了PASCAL的基本语法和特性:```program HelloWorld;varname: string;beginwriteln('Please enter your name:');readln(name);writeln('Hello, ', name, '!');end.```在这个例子中,程序首先输出提示用户输入姓名的消息,然后读取用户输入的姓名,并输出欢迎消息。
目录第一部分 PASCAL语言程序设计 (1)第一章 PASCAL语言基础 (1)第一节程序的组成与上机调试运行 (2)第二节常量、变量与数据类型 (3)第三节表达式与标准函数 (6)第四节赋值语句、输入与输出语句 (9)习题 (12)第二章程序的三种基本结构 (15)第一节顺序结构 (15)第二节选择结构 (15)第三节循环结构 (17)习题 (20)第三章数组 (22)第一节一维数组 (22)第二节二维数组及应用 (25)习题 (26)第四章字符与字符串操作 (29)第一节字符和字符数组 (29)第二节字符串变量 (29)第三节字符串应用举例 (31)习题 (33)第五章函数与过程 (35)第一节自定义函数 (35)第二节自定义过程 (38)第四节递归 (42)第五节递归与回溯 (45)习题 (50)第一部分 PASCAL语言程序设计第一章 PASCAL语言基础Pascal语言是瑞士苏黎士工科大学的Niklans Wirth(沃思)1971年发表的,是为了纪念17世纪法国著名哲学和数学研究者Blaisc Pascal而将它命名为Pascal程序设计语言。
Pascal语言是信息学奥赛中普遍使用的程序设计语言。
第一节程序的组成与上机调试运行一、程序的组成我们先看一道例题。
例1-1 输入两个整数a和b,计算a和b的和(a+b)。
【参考程序】program a1(input,output); //程序首部var a,b,c:integer; //程序说明部分,a,b,c被说明为整型变量begin //程序执行部分,下面是程序的内容write('a='); //在屏幕上输出一个字符串“a=”,输出完后不换行read(a); //从键盘输入一个数值赋给变量awrite('b='); //在屏幕上输出一个字符串“b=”,输出完后不换行read(b); //从键盘输入一个数值赋给变量bc:=a+b; //计算a+b的和,并将这个和赋值给变量cwriteln(a,'+',b,'=',c); //输出a+b=c的等式,输出完后换行 end. //程序结束【样例输入】a=10b=30【样例输出】10+30=40由上可以看出,一个Pascal程序由以下三部分组成:(1)由Program 引导的一行是Pascal程序的首部。
基于Pascal的编译器设计与实现一、引言编译器是一种将高级语言翻译成机器语言的程序,它在计算机科学领域扮演着至关重要的角色。
Pascal是一种结构化程序设计语言,由Niklaus Wirth于1968年设计并于1970年首次发布。
本文将探讨基于Pascal的编译器设计与实现,介绍编译器的基本原理、Pascal语言特性以及如何将Pascal代码转换为目标机器代码的过程。
二、编译器的基本原理编译器通常由词法分析器、语法分析器、语义分析器、中间代码生成器、优化器和代码生成器等模块组成。
其中,词法分析器负责将源代码转换成单词流,语法分析器将单词流转换成语法树,语义分析器检查语法树是否符合语义规则,中间代码生成器将语法树转换成中间代码,优化器对中间代码进行优化,最后由代码生成器将优化后的中间代码转换成目标机器代码。
三、Pascal语言特性Pascal是一种结构化程序设计语言,具有严格的语法规则和清晰的程序结构。
它支持过程和函数的定义,具有强大的数据类型系统和丰富的控制结构。
Pascal还提供了丰富的标准库函数,方便程序员进行开发。
四、基于Pascal的编译器设计在设计基于Pascal的编译器时,首先需要编写词法分析器和语法分析器来解析Pascal源代码。
词法分析器负责将源代码转换成单词流,而语法分析器则将单词流转换成抽象语法树。
接着需要实现语义分析器来检查抽象语法树是否符合Pascal语言规范,并生成中间代码。
最后通过优化器和代码生成器将中间代码转换成目标机器代码。
五、编译过程详解词法分析:词法分析阶段将源代码按照规定的单词规则进行划分,生成单词流。
语法分析:语法分析阶段将单词流转换成抽象语法树,检查源代码是否符合Pascal语言的语法规则。
语义分析:语义分析阶段检查抽象语法树是否符合Pascal语言的语义规则,并进行类型检查等操作。
中间代码生成:中间代码生成阶段将经过语义分析的抽象语法树转换成中间表示形式,如三地址码或者四元式。
PL/0语言编译程序分析PL/0语言是Pascal语言的一个子集,我们这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。
PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。
词法分析和代码生成作为独立的子程序供语法分析程序调用。
语法分析的同时,提供了出错报告和出错恢复的功能。
在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。
词法分析子程序分析:词法分析子程序名为getsym,功能是从源程序中读出一个单词符号(token),把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。
(注意:语法分析器每次用完这三个变量的值就立即调用getsym子程序获取新的单词供下一次使用。
而不是在需要新单词时才调用getsym过程)。
getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。
getch过程中使用了行缓冲区技术以提高程序运行效率。
词法分析器的分析过程:调用getsym时,它通过getch过程从源程序中获得一个字符。
如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到则为保留字,把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym 置为ident,把这个单词存入id变量。
查保留字表时使用了二分法查找以提高效率。
如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。
如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把sym则成相应的类型。
如果遇到不合法的字符,把sym置成nul。
语法分析子程序分析:语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语意生成相应的代码,并提供了出错处理的机制。
如何进行编译器设计和解释器开发编译器和解释器是软件开发中非常重要的工具,它们用于将源代码转换为可以被计算机执行的机器码或者解释执行源代码。
编译器是将源代码一次性地转换为目标代码,而解释器是逐行地解释源代码并执行相应的操作。
本文将介绍编译器的设计和解释器的开发过程,并提供一些实用的技巧和建议。
一、编译器设计编译器设计是一个复杂的任务,需要掌握词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等多个环节。
下面是编译器设计的一般流程:1.词法分析:将源代码分解为一个个token,例如关键词、标识符、数字、操作符等。
可以使用正则表达式或者有限状态自动机来进行词法分析。
2.语法分析:根据语法规则将token组成一个个语法结构,例如函数、表达式、语句等。
可以使用上下文无关文法和语法分析算法(如LL(1)或者LR(1))来进行语法分析。
3.语义分析:对语法结构进行语义检查,例如类型检查、作用域检查、类型转换等。
在这一阶段还可以进行符号表的构建,用于保存变量和函数的信息。
4.中间代码生成:将源代码转换为一种中间表示形式,通常是一个抽象的指令序列,例如三地址码、虚拟机指令、中间表达式等。
中间代码的生成可以使用递归下降、语法制导翻译或者语法制导翻译的变体等方法。
5.代码优化:对中间代码进行优化,以提高代码的执行效率和减小代码的体积。
常见的优化技术包括常量折叠、公共子表达式消除、死代码删除、循环优化等。
6.目标代码生成:将中间代码转换为目标机器的机器码或者汇编代码。
目标代码生成可以分为两个阶段:指令选择(选择适合目标机器的指令)和寄存器分配(将变量分配到寄存器或者内存中)。
7.代码生成完成后,还需要进行链接和装载,将目标代码与库文件进行链接,并将最终的可执行文件加载到内存中执行。
二、解释器开发与编译器不同,解释器是逐行地解释和执行源代码,不需要将源代码先转换为目标代码。
下面是解释器的开发过程:1.词法分析:同编译器设计一样,解释器也需要进行词法分析,将源代码分解为一个个token。
基于Pascal的编程语言设计与实现一、引言Pascal是一种结构化编程语言,由Niklaus Wirth于1968年至1969年间设计并实现。
它被广泛用于教学和软件开发领域,具有清晰的语法结构和强大的表达能力。
本文将探讨基于Pascal的编程语言设计与实现,包括语言特性、语法规则、编译器实现等方面的内容。
二、Pascal语言特性Pascal语言具有以下几个显著特点: 1. 结构化:Pascal是一种结构化编程语言,支持模块化、过程化的程序设计方法,有助于提高代码的可读性和可维护性。
2. 强类型:Pascal是一种强类型语言,要求在编译时进行类型检查,可以有效避免类型错误导致的程序异常。
3. 静态作用域:Pascal采用静态作用域规则,变量的作用域在编译时确定,有利于程序员理解代码逻辑和调试程序。
4. 结构体支持:Pascal提供了记录(record)类型,可以定义复杂的数据结构,方便处理多字段数据。
三、Pascal语法规则Pascal语言的语法规则包括关键字、标识符、常量、变量、运算符等内容。
下面是一个简单的Pascal程序示例:示例代码star:编程语言:pascalprogram HelloWorld;beginwriteln('Hello, World!');end.示例代码end 在上面的示例中,“program”是关键字,“HelloWorld”是标识符,“begin”和“end”表示程序块的开始和结束,“writeln”是输出函数,“‘Hello, World!’”是字符串常量。
四、基于Pascal的编程语言设计基于Pascal的编程语言设计需要考虑以下几个方面: 1. 语法扩展:可以在Pascal基础上扩展新的语法规则,如引入面向对象编程特性、Lambda表达式等。
2. 标准库增强:设计新的标准库函数和数据结构,提供更丰富的功能支持。
3. 工具链完善:开发相应的编译器、解释器和调试器,确保新语言可以被有效地编译和执行。
Pascal语言编译器的设计与实现我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。
编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分:(1) 词法分析部分(2) 语法分析处理及四元式生成部分(3) 输出显示部分一.词法分析器设计由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。
词法分析器的功能是输入源程序,输出单词符号。
我们规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值)#define ACC -2#define sy_if 0#define sy_then 1#define sy_else 2#define sy_while 3#define sy_begin 4#define sy_do 5#define sy_end 6#define a 7#define semicolon 8#define e 9#define sharp 10#define S 11#define L 12#define tempsy 15#define EA 18 //E and#define EO 19 //E or#define plus 34#define subtract 35#define times 36#define divide 37#define becomes 38#define op_and 39#define op_or 40#define op_not 41#define rop 42#define lparent 48#define rparent 49#define ident 56#define intconst 57函数说明1.读取函数readline( )、readchar ( )词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件” PAS.dat ”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行readchar ( )从输入缓冲区获得的;若缓冲区已被读空,则再执行readline( )从PAS.dat 中读取下一行至输入缓冲区。
2.扫描函数scan( )扫描函数scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。
3.变量处理find()变量处理中首先把以字母开头的字母数字串存到spelling[ ]数组中,然后进行识别。
识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配(变量匹配函数find ()),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量(值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。
4.数字识别number( )数字识别将识别出的数字填入二元式结果缓存数组。
5.显示函数显示函数的功能在屏幕上输出词法分析的结果(即二元式序列程序),同时给出二元式个数及源程序行数统计。
二.语法分析器设计语法分析器的核心是三张SLR 分析表以及针对这三张SLR 分析表进行语义加工的语义动作。
编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过SLR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。
在处理if 和while 语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。
1. 控制语句的SLR 分析表1 设计过程如下:将扩展文法G’0)S’ S1)S if e then S else S2)S while e do S3)S begin L end4)S a5)L S6)L S;L用∈_CLOSURE方法构造LR(0)项目规范簇为:. I0:S’·SS ·if e then S else SS ·while e do SS ·begin L endS ·a ;I1: S’ S·I2: S if·e then S else SI3: S while ·e do SI4: S begin·L endL ·SL ·S;LS ·if e then S else SS ·while e do SS ·begin L endS ·aI5: S a·I6: S if e·then S else SI7: S while e·do SI8: S begin L·endI9: L S·L S·;LI10: S if e then ·S else SS ·if e then S else SS ·while e do SS ·begin L endI11: S while e do ·SS ·if e then S else SS ·while e do SS ·begin L endS ·aI12: S begin L end ·I13: L S; ·LL ·SL ·S;LS ·if e then S else SS ·while e do SS ·begin L endS ·aI14: S if e then S·else SI15: S while e do S·I16: L S;L·I17: S if e then S·else SS ·if e then S else SS ·while e do SS ·begin L endS ·aI18: S if e then S else S·构造文法G’中非终结符的FOLLOW集如下:FOLLOW(L) = { end }FOLLOW(S) = {else , ; ,end,#}在LR(0)项目规范簇中,只有I9有“移进――归约”冲突,L S·L S·L因为FOLLOW(L) ∩FIRST(L) = ∮所以可以用SLR方法解决以上冲突,最后我们得到的SLR分析表如下:ACTION GOTO If then else while begin do end a;e#S L 0S2S3S4S511ACC2S63S74S2S3S4S5985R4R3R4R46S107S118S129R5S1310S2S3S4S51411S2S3S4S51512R3R3R3R313S2S3S4S5916 14S1715R2R2R2R216R617S2S3S4S51818R1R1R1R1 static int action[19][13]=/*0*/ {{2,-1,-1,3,4,-1,-1,5,-1,-1,10,1,-1},/*1*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1},/*2*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},/*3*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},/*4*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8},/*5*/ {-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1},/*6*/ {-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},/*7*/ {-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1},/*8*/ {-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},/*9*/ {-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},/*10*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},/*11*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,15,-1},/*12*/ {-1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1},/*13*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16},/*14*/ {-1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},/*15*/ {-1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1},/*16*/ {-1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1},/*17*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1},/*18*/ {-1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1}};其中,前9 列为action 值,后2 列为goto 值;0~16 表示17 个移进状态(即Si);-1表示出错;ACC 表示分析成功;而100~106 对应归约产生式:2. 算术表达式的LR 分析表2 设计如下:0)S’ E1) E E+E2) E E*E3) E (E)ACTION GOTO I+-*/()#E0S3S211S4S11S5S10ACC2S3S263R4R4R4R4R4R44S3S275S3S286S4S11S5S10S97R1R1S5S10R1R18R2R2R2R2R2R29R3R3R3R3R3R310S3S21211S3S21312R6R6R6R6R6R613R5R5S5S10R5R5static int action1[14][9]=/*0*/ {{3,-1,-1,-1,-1,2,-1,-1,1},/*1*/ {-1,4,11,5,10,-1,-1,ACC,-1},/*2*/ {3,-1,-1,-1,-1,2,-1,-1,6},/*3*/ {104,104,104,104,104,104,104,104,-1},/*4*/ {3,-1,-1,-1,-1,2,-1,-1,7},/*5*/ {3,-1,-1,-1,-1,2,-1,-1,8},/*7*/ {101,101,101,5,10,101,101,101,-1},/*8*/ {102,102,102,102,102,102,102,102,-1},/*9*/ {103,103,103,103,103,103,103,103,-1},/*10*/ {3,-1,-1,-1,-1,2,-1,-1,12},/*11*/ {3,-1,-1,-1,-1,2,-1,-1,13},/*12*/ {106,106,106,106,106,106,106,106,-1},/*13*/ {105,105,105,5,10,105,105,105,-1}};3.布尔表达式的SLR 分析表3 设计如下:(过程略)1)S’ B2) B i3) B i rop i4) B ( B )5) B NOT B6) A B AND7) B AB8)O B ORACTION GOTOi Rop()NOT AND OR#B A O 0S1S4S51378 1S2R1R1R1R12S33R2R2R2R24S1S4S51178 5S1S4S5678 6R4S9S10R47S1S4S51478 8S1S4S51578 9R5R5R510R7R7R711S12S9S1012R3R3R3R313S9S10ACC14R6S9S10R615R8S9S10R8static int action2[16][11]=/*0*/ {{1,-1,4,-1,5,-1,-1,-1,13,7,8},/*1*/ {-1,2,-1,101,-1,101,101,101,-1,-1,-1},/*2*/ {3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},/*3*/ {-1,-1,-1,102,-1,102,102,102,-1,-1,-1},/*4*/ {1,-1,4,-1,5,-1,-1,-1,11,7,8},/*6*/ {-1,-1,-1,104,-1,9,10,104,-1,-1,-1},/*7*/ {1,-1,4,-1,5,-1,-1,-1,14,7,8},/*8*/ {1,-1,4,-1,5,-1,-1,-1,15,7,8},/*9*/ {105,-1,105,-1,105,-1,-1,105,-1,-1,-1},/*10*/ {107,-1,107,-1,107,-1,-1,107,-1,-1,-1},/*11*/ {-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},/*12*/ {-1,103,-1,103,-1,103,103,103,-1,-1,-1},/*13*/ {-1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1},/*14*/ {-1,-1,-1,106,-1,9,10,106,-1,-1,-1},/*15*/ {-1,-1,-1,108,-1,9,10,108,-1,-1,-1}};LR 分析表控制语义加工的实现:当扫描LR 分析表的当前状态为归约状态时,则在调用与该状态对应的产生式进行归约的同时,调用相应的语义子程序进行有关的翻译工作。