Pascal语言编译器的设计与实现

合集下载

free pascal编程语言

free pascal编程语言

free pascal编程语言Free Pascal编程语言是一种跨平台的编程语言,它是一种强类型、过程化的语言,它的语法与Delphi相似。

Free Pascal的目标是提供一个免费的、高效的编译器,支持多种操作系统和处理器架构。

Free Pascal的特点之一是它的跨平台性。

它可以在多种操作系统上运行,包括Windows、Linux、Mac OS等。

这使得开发者可以使用同一套代码来开发不同平台的应用程序,大大提高了开发效率。

Free Pascal也支持多种处理器架构,包括x86、ARM、PowerPC 等。

这使得开发者可以在不同的硬件平台上使用同一套代码来开发应用程序。

这种灵活性使得Free Pascal成为一个非常受欢迎的编程语言。

Free Pascal是一种强类型语言,这意味着在编译时就会进行类型检查,从而避免了许多常见的编程错误。

它还支持面向对象编程,开发者可以使用类、对象、继承等概念来组织代码,使得代码更加结构化和可维护。

Free Pascal还提供了丰富的标准库,包括文件操作、字符串处理、图形界面等功能。

开发者可以直接使用这些库来简化开发过程,提高开发效率。

在Free Pascal中,开发者可以使用各种数据类型来存储和操作数据,包括整数、浮点数、字符、字符串等。

它还提供了丰富的运算符和控制结构,可以进行各种数学运算和逻辑操作。

Free Pascal还支持多线程编程,开发者可以使用多线程来实现并发处理,提高程序的性能和响应速度。

它还提供了各种同步机制,如互斥锁、信号量等,用于处理多线程之间的数据共享和同步问题。

Free Pascal的编译器是一种高效的编译器,它可以将代码编译成本地机器代码,从而提供了很高的性能。

与解释型语言相比,Free Pascal的执行速度更快,资源占用更低。

Free Pascal是一个功能强大、灵活、高效的编程语言。

它的跨平台性和强类型特性使得开发者可以使用同一套代码来开发不同平台的应用程序。

GPJ_Pascal集成开发坏境_词法分析_语法分析_语义分析和中间代码生成

GPJ_Pascal集成开发坏境_词法分析_语法分析_语义分析和中间代码生成

第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大部分的语法成分,能满足一般的编程需要。

Free Pascal

Free Pascal

简介
Free Pascal是个由国际组织开发的完全的win32的pascal语言编译器,类似delphi,可编写windows程序。
此前被广泛使用的PASCAL编译器普遍为Turbo Pascal&Borland pascal。但是它们可用的空间十分有限。 而Free Pascal理论上可以使用4GB内存。所以在利用Free Pascal编程的时候,可以改变原有思路,将大量时间 转嫁给空间,提高效率。
主要区别
与e Pascal尽量设计得和Turbo Pascal接近,但是由于以下的两个原因,两者之间还是 有一些区别的:1.Free Pascal是一个32位的编译器,而Turbo Pascal只是16位编译器;
2.Free Pascal是一个跨平台的编译器,而Turbo Pascal只在windows和DOS上使用。 如果你的代码遵守ANSI Pascal标准,那么将代码从Turbo Pascal移植到Free Pascal是没有问题的。 下面是在Turbo Pascal上可以使用,但是在Free Pascal就不能使用的一些语言特性: 1.函数和过程在使用时,参数的类型必须和定义时完全一致。原因是在Free Pascal中添加了函数重载功能 (可以用完全相同的多个标识符定义多个函数,只要它们的参数不同,就是不同的函数;在没有此功能时,非整 实型的实在参数可以与整形的形式参数赋值相容); 2.Protected、Public、Published、Try、Finally、Except、Raise成了关键字,不能作为标识符的名字; 3.Far、Near不再是关键字了,原因是Free Pascal是32位系统,不再需要这些关键字; 4.布尔表达式不一定要全部进行计算。
乱码解决
对于windows10无效 如果打开Free Pascal时显示的是一堆乱码,这是因为错误地使用中文编码所导致的。 解决过程解决方案如下: 1.在Free Pascal图标上单击右键,弹出快捷菜单,选择“属性”; 2.弹出“Free Pascal IDE”属性对话框,单击“选项”选项卡; 3.把“默认代码页”改为“437 (OEM -美国)”,单击“应用”,关闭对话框; 针对windows10 在完成“乱码解决(对于windows10无效)”第三步逗号以前的内容后,选择“使用旧版控制台”单击“应 用”,然后关闭对话框。

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代码

注释在Pascal中,注释括在大括号中或带星号的圆括号中。

Delphi 也认可C++ 风格的注释,即把注释放在双斜线后。

例如{this is a comment}(* this is another comment *)// this is a comment up to the end of the line第一种注释方式较简略,使用也较为普遍;第二种方式在欧洲使用较广,因为欧洲的键盘缺少大括号;第三种方式的注释是从C++借用来的,只在32位版本的Delphi中可用,它在给一行代码加短注释时非常有用。

在这本书中我用斜体表示注释,用粗体表示关键词,以此与默认的Delphi语法风格表示一致。

上述三种不同的注释方式有益于进行嵌套注释。

例如你要注销一段代码,而代码行中又包含真正的注释行,这时采用同一种注释方式是不对的:{ ... code{comment, creating problems}... code }正确的方法是插入第二种注释方式:{ ... code//this comment is OK... code }注意:如果左大括号或圆括号-星号后面跟美元符号($),那么其中的内容就成了编译指令,如 {$X+}。

实际上,编译指令仍是注释。

例如,{$X+ This is a comment} 是合法的。

这既是有效的编译指令又是一条注释,尽管明智的程序员很可能会注意把编译指令和注释分开。

使用大写字母Pascal 编译器(不象其他语言的编译器)不考虑字符的大小写,因此标识符Myname、 MyName、 myname、 myName、和MYNAME是完全相同的。

总体上来说,这是Pascal的一大优点,因为在大小写敏感的语言中,许多语法错误是由不正确的大写引起的。

注意:Pascal语言的大小写不敏感特性有一个例外:控件包中的Register 过程必须以大写字母R开始,因为需要与C++Builder 兼容。

PASCAL语言程序设计知识讲解资料

PASCAL语言程序设计知识讲解资料

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教程-自学完整版

pascal教程-自学完整版
• 用某种形式(如图形、自然语言、类计算 语言)表达以设计好的算法
• 在计算机上编辑、调试和测试编制好的程 直到正确满足问题的需求
2021/2/4
1
6
算法的描述方法
• 例1.1.1: • 交换a、b两数值 • 定义 c • a→c • b→a • c→b
2021/2/4
1
7
N-S图
• 1973年,美国学者I.Nassi和B.Shneiderm 提出了一种在流程图中完全去掉流程线, 部算法写在一个矩形框内,在框内还可以 含其它框的流程图。
解释类:执行方式类似于我们日常生活中的“同声翻 应用程序源代码一边由相应语言的解释器“翻译”成目标 (机器语言),一边执行,因此效率比较低,而且不能生 独立执行的可执行文件,应用程序不能脱离其解释器,但 方式比较灵活,可以动态地调整、修改应用程序。如较早 的Qbasic语言。
编译类:编译是指在应用源程序执行之前,就将程序 码“翻译”成目标代码(机器语言),因此其目标程序可 离其语言环境独立执行,使用比较方便、效率较高。但应 序一旦需要修改,必须先修改源代码,再重新编译生成新 标文件(* .OBJ)才能执行,只有目标文件而没有源代码 改2021很/2/4不方便。现在大多数的1 编程语言都是编译型的,1例8 如
汇编语言的实质和机器语言是相同的,都是直接 件操作,只不过指令采 汇编语言用了英文缩写的 识符,更容易识别和记忆。它同样需要编程者将 步具体的操作用命令的形式写出来。汇编程序通 三部分组成:指令、伪指令和宏指令。汇编程序 一句指令只能对应实际操作过程中的一个很细微 作,例如移动、自增,因此汇编源程序一般比较 复杂、容易出错,而且使用汇编语言编程需要有 的计算机专业知识,但汇编语言的优点也是显而 的2021,/2/4 用汇编语言所能完1 成的操作不是一般高级15 语

基于Pascal的编译器设计与实现

基于Pascal的编译器设计与实现

基于Pascal的编译器设计与实现一、引言编译器是一种将高级语言翻译成机器语言的程序,它在计算机科学领域扮演着至关重要的角色。

Pascal是一种结构化程序设计语言,由Niklaus Wirth于1968年设计并于1970年首次发布。

本文将探讨基于Pascal的编译器设计与实现,介绍编译器的基本原理、Pascal语言特性以及如何将Pascal代码转换为目标机器代码的过程。

二、编译器的基本原理编译器通常由词法分析器、语法分析器、语义分析器、中间代码生成器、优化器和代码生成器等模块组成。

其中,词法分析器负责将源代码转换成单词流,语法分析器将单词流转换成语法树,语义分析器检查语法树是否符合语义规则,中间代码生成器将语法树转换成中间代码,优化器对中间代码进行优化,最后由代码生成器将优化后的中间代码转换成目标机器代码。

三、Pascal语言特性Pascal是一种结构化程序设计语言,具有严格的语法规则和清晰的程序结构。

它支持过程和函数的定义,具有强大的数据类型系统和丰富的控制结构。

Pascal还提供了丰富的标准库函数,方便程序员进行开发。

四、基于Pascal的编译器设计在设计基于Pascal的编译器时,首先需要编写词法分析器和语法分析器来解析Pascal源代码。

词法分析器负责将源代码转换成单词流,而语法分析器则将单词流转换成抽象语法树。

接着需要实现语义分析器来检查抽象语法树是否符合Pascal语言规范,并生成中间代码。

最后通过优化器和代码生成器将中间代码转换成目标机器代码。

五、编译过程详解词法分析:词法分析阶段将源代码按照规定的单词规则进行划分,生成单词流。

语法分析:语法分析阶段将单词流转换成抽象语法树,检查源代码是否符合Pascal语言的语法规则。

语义分析:语义分析阶段检查抽象语法树是否符合Pascal语言的语义规则,并进行类型检查等操作。

中间代码生成:中间代码生成阶段将经过语义分析的抽象语法树转换成中间表示形式,如三地址码或者四元式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 tempsy15 #define EA 18 //E and #define EO 19 //E or#define plus 34 #define subtract 35 #define times 36 #define divide 37 #define bexxes 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 ( ) 词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件””中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行 readchar ( )从输入缓冲区获得的;若缓冲区已被读空,则再执行readline( )从中读取下一行至输入缓冲区。

2.扫描函数 scan( )扫描函数 scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。

3.变量处理 find变量处理中首先把以字母开头的字母数字串存到spelling[ ]数组中,然后进行识别。

识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量,否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。

4.数字识别number( )数字识别将识别出的数字填入二元式结果缓存数组。

5.显示函数显示函数的功能在屏幕上输出词法分析的结果,同时给出二元式个数及源程序行数统计。

二.语法分析器设计语法分析器的核心是三张 SLR 分析表以及针对这三张SLR 分析表进行语义加工的语义动作。

编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过SLR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。

在处理 if 和 while 语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。

1. 控制语句的 SLR 分析表1 设计过程如下:将扩展文法G’0) S’ S1)S if e then S else S 2)S while e do S 3)S begin L end 4)S a 5)L S 6)L S;L用∈_CLOSURE方法构造LR(0)项目规范簇为:I0: S’·SS ·if e then S else S S ·while e do S S ·begin L endS · a ; I1: S’ S·I2: S if·e then S else S I3: S while ·e do S I4: S begin·L end L ·S L ·S;L S ·if e then S else SS ·while e do S S ·begin L end S · aI5: S a·I6: S if e·then S else S I7: S while e·do S I8: S begin L·end I9: L S·L S·;LI10: S if e then · S else SS · if e then S else S S · while e do S S · begin L endI11: S while e do ·SS · if e then S else S S ·while e do S S · begin L end S · aI12: S begin L end · I13: L S; ·LL ·S L ·S;LS ·if e then S else S S ·while e do S S ·begin L end S ·aI14: S if e then S·else S I15: S while e doS· I16: L S;L·I17: S if e then S·else SS ·if e then S else S S ·while e do SS ·begin L end S ·aI18: S if e then S else S·构造文法G’中非终结符的FOLLOW集如下:FOLLOW(L) = { end }FOLLOW(S) = {else , ; ,end,#}在LR项目规范簇中,只有I9有“移进――归约”冲突, L S· L S·L 因为FOLLOW(L) ∩ FIRST(L) = ∮所以可以用SLR方法解决以上冲突,最后我们得到的SLR分析表如下: If 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 S2 S2 S2 S2 S2 S2static int /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/then S10 else R4 R3 S17 R2 R1 while begin S3 S3 S3 S3 S3 S3 S4 S4 S4 S4 S4 S4 ACTION do S11 end R3 S12 R5 R3 R2 R6 R1 a S5 S5 S5 S5 S5 S5 ; R4 S13 R3 R2 R1 e S6 S7 # ACC R4 R3 R2 R1 S 1 9 14 15 9 18 GOTO L 8 16action[19][13]={{2,-1,-1,3,4,-1,-1,5,-1,-1,10,1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8},{-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1},{-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},{-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 个移进状态;-1表示出错;ACC 表示分析成功;而 100~106 对应归约产生式:2. 算术表达式的 LR 分析表 2 设计如下:0) S’ E 1) E E+E 2) E E*E 3) E (E)4) E i I 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S3 S3 S3 S3 S3 S3 + S4 R4 S4 R1 R2 R3 R6 R5 - S11 R4 S11 R1 R2 R3 R6 R5 * S5 R4 S5 S5 R2 R3 R6 S5 ACTION / S10 R4 S10 S10 R2 R3 R6 S10 ( S2 S2 S2 S2 S2 S2 ) R4 S9 R1 R2 R3 R6 R5 # ACC R4 R1 R2 R3 R6 R5 GOTO E 1 6 7 8 12 13static 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},/*6*/ {-1,4,11,5,10,-1,9,-1,-1}, /*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’ B 2)B i3) B i rop i 4) B ( B ) 5) B NOT B 6) A B AND 7) B AB 8) O B OR 9) B OB i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 S1 S3 S1 S1 S1 S1 R5 R7 Rop S2 ( S4 S4 S4 S4 S4 R5 R7 ACTION ) R1 R2 R4 S12 R3 R6 R8 NOT S5 S5 S5 S5 S5 R5 R7 AND R1 R2 S9 S9 R3 S9 S9 S9 OR R1 R2 S10 S10 R3 S10 S10 S10 # R1 R2 R4 R3 ACC R6 R8 B 13 11 6 14 15 GOTO A 7 7 7 7 7 O 8 8 8 8 8 static 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},/*5*/ {1,-1,4,-1,5,-1,-1,-1,6,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 分析表的当前状态为归约状态时,则在调用与该状态对应的产生式进行归约的同时,调用相应的语义子程序进行有关的翻译工作。

相关文档
最新文档