语法分析程序实验报告及代码

合集下载

语法分析(自上而下分析)实验报告

语法分析(自上而下分析)实验报告

实习二语法分析-自上而下分析

一、实验目的

使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。

二、实验内容

1.设计表达式的语法分析器算法(使用预测分析)

2.编写一段代码并上机调试查看其运行结果

三、实验要求

使用LL(1)分析算法设计表达式的语法分析器

LL(1)文法是一个自上而下的语法分析方法,它是从文法的开始符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看一个字符,确定当前应该选择的产生式。

实现LL(1)分析的另一种有效方法是使用一张分析表和一个栈进行联合控制。

预测分析程序的总控程序在任何时候都是按STACK栈顶符号X 和当前a的输入符号行事的。对于任何(X,a),总控程序每次都执行三种可能的动作之一。

1.若X=a=“#”,则宣布分析成功,停止分析过程

2.若X=a≠“#”,则把X从STACK栈顶逐出,让a指向下一个

输入符号。

3.若X是一个非终结符,则查看分析表。

四、运行结果

(本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析)

五、源程序实现

/*LL(1)分析法源程序,只能在VC++中运行 */

#include

#include

#include

#include

char A[20];

char B[20];

char v1[20]={'i','+','*','(',')','#'};/*终结符 */

char v2[20]={'E','G','T','S','F'};/*非终结符 */

int j=0,b=0,top=0,l;/*L为输入串长度 */

语法分析实验报告

语法分析实验报告

实验2. 语法分析实验报告

一、实验目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

二、实验要求

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

0、要点回顾

标识符ID=letter(letter| digit)*

整型常数NUM=digit digit *

单词符号及其种别码:

1、待分析的简单语言的语法

用扩充的BNF表示如下:

(1)<程序>::=begin<语句串>end

(2)<语句串>::=<语句>{;<语句>}

(3)<语句>::=<赋值语句>

(4)<赋值语句>::=ID:=<表达式>

(5)<表达式>::=<项>{+<项>|-<项>}

(6)<项>::=<因子>{*<因子>|/<因子>}

(7)<因子>::=ID| NUM|(<表达式>)

2、实验要求说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

三、源程序代码

#include<stdio.h>

#include<string>

#include<iostream>

using namespace std;

char prog[80];//缓冲区

int p=0;//缓冲区prog的指针

LR语法分析器的实现代码(python)

LR语法分析器的实现代码(python)

LR语法分析器的实现代码(python)

•构造LR(0)项目集:

–构造I的闭包CLOSURE(I)的算法如下:

i.I的任何项目都属于CLOSURE(I);

ii.若A→α•Bβ属于CLOSURE(I),对任何产生式B→γ,B→•γ也属于CLOSURE(I);

iii.重复执行上述两步骤直至CLOSURE(I)不再增大为止。

iv.实现代码如下

def get_CLOSURE(tmp): # 生成闭包 CLOSURE = [] for it in tmp:

if(it not in CLOSURE): CLOSURE.append(it) x, y = it.split

(".") if(y == ""): continue v = y[0] if(v in VN): r

es = get_VN_gram(v) # 返回非终结符产生的A->.aBb形式 for

re in res: if(re not in CLOSURE): CLOSURE.append(r

e) return CLOSURE

–Go(I,a)函数构造算法

i.I为当前状态,X为文法符号,J为I中所有形如A->α·Xβ的

项目的后续项目所组成的集合,而CLOSURE(J)就是项目集I

关于X的后续状态

ii.实现代码如下

def go(item, v): #生成并返回下一个item tmp = [] for it in ite

m: x, y = it.split(".") if(y!=""): if(y[0] == v): new_

it = x + y[0] + "." + y[1:] tmp.append(new_it) if(len(tmp)!=

国开电大 编译原理 实验4:语法分析实验报告

国开电大 编译原理 实验4:语法分析实验报告

国开电大编译原理实验4:语法分析实

验报告

1. 实验目的

本实验的目的是研究和掌握语法分析的原理和实现方法。

2. 实验内容

本次实验主要包括以下内容:

- 设计并实现自顶向下的LL(1)语法分析器;

- 通过语法分析器对给定的输入串进行分析,并输出相应的分析过程;

- 编写测试用例,验证语法分析器的正确性。

3. 实验步骤

3.1 设计LL(1)文法

首先,根据实验要求和给定的语法规则,设计LL(1)文法。

3.2 构建预测分析表

根据所设计的LL(1)文法,构建预测分析表。

3.3 实现LL(1)语法分析器

根据预测分析表,实现自顶向下的LL(1)语法分析器。

3.4 对输入串进行分析

编写程序,通过LL(1)语法分析器对给定的输入串进行分析,并输出相应的分析过程和结果。

3.5 验证语法分析器的正确性

设计多组测试用例,包括正确的语法串和错误的语法串,验证语法分析器的正确性和容错性。

4. 实验结果

经过实验,我们成功设计并实现了自顶向下的LL(1)语法分析器,并对给定的输入串进行了分析。实验结果表明该语法分析器具有较好的准确性和容错性。

5. 实验总结

通过本次实验,我们对语法分析的原理和实现方法有了更深入的了解。同时,我们也学会了如何设计并实现自顶向下的LL(1)语

法分析器,并验证了其正确性和容错性。这对于进一步研究编译原理和深入理解编程语言的语法结构具有重要意义。

6. 参考资料

- 《编译原理与技术》

- 课程实验文档及代码

语法分析 实验报告

语法分析 实验报告

语法分析实验报告

一.题目:语法分析程序的设计与实现

二.设计目的:

(1)了解语法分析器的生成工具和编译器的设计。

(2)了解自上而下语法分析器的构造过程。

(3). 理解和掌握LL(1)语法分析方法的基本原理;根据给出的LL(1)文法,掌握LL(1)分析

表的构造及分析过程的实现。

(4)掌握预测分析程序如何使用分析表和栈联合控制实现LL(1)分析。

三.实验内容:编写语法分析程序,实现对算术表达式的语法分析,要求所分析算数表达式由如下的文法产生:

E->E+T|E-T|T

T->T/F|T*F|F

F->i|n|(E)

三.实验要求:

编写LL(1)语法分析程序,要求如下:

(1)编程实现算法4.2,为给定文法自动构造预测分析表。

(2)编程实现算法4.1,构造LL(1)的算法预测程序。

五.算法流程分析

程序可分为如下几步:

(1)读入文法

(2)判断正误

(3)若无误,判断是否为LL(1)文法

(4)若是,构造分析表;

(5)由总控算法判断输入符号串是否

六.算法设计

该语法分析程序课细化为以下18个函数。1.首先定义各种需要用到的常量和变量;

2. 判断一个字符是否在指定字符串中;

3. 得到一个不是非终结符的符号;

4. 分解含有左递归的产生式;

5. 分解不含有左递归的产生式;

6. 读入一个文法;

7. 将单个符号或符号串并入另一符号串;

8. 求所有能直接推出^的符号;

9. 求某一符号能否推出‘^ ’;

10. 判断读入的文法是否正确;

11.求单个符号的FIRST;

12. 求各产生式右部的FIRST;

13.求各产生式左部的FOLLOW;

语法分析实验报告

语法分析实验报告

语法分析实验报告

一、语法分析的功能:语法分析是编译过程的核心部分,它的主要任务是按照程序

语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成作准备。

二、语法分析的目的:语法分析程序以词法分析输出的符号串作为输入,在分析过

程中检查这个符号串是否为该程序语言的句子。若是,则输出该句子的分析树;否则就表示源程序存在语法错误,需要报告错误的性质和位置。

三、语法分析的规则:参照了课本上P69 的TEST规则(1)--(17)。

(1)::={}

(2)::=|e

(3)::=int ID;

(4)::=|e

(5)::=|||||||

(6)::=if()[else]

(7)::=while()

(8)::=for(,,)

(9)::=write

(10)::=read ID

(11)::=dowhile

(12)::={}

(13)::=;|;

(14)::=ID=|||

(15)::=|(>|<|>=|<=|==

!=)

(16)::={(+|-)|}

(17) ::={(*|/)}

(18)::=()|ID|NUM

(19)::=(&&|||)|!| 该语法分析是自顶向下的语法分析。

四、实验结果:进行语法分析的程序为:输入文件in.txt

{

int a;

int b;

int c;

read a;

b=a;

(2+a);

if (a<3) {a=10;b=4;} else {a=10;b=4;} while (a<10) {a=10;b=4;}

c=(b+a)*c;

write c;

for(a=1;a<20;a=a+1)

编译原理语法分析报告+代码

编译原理语法分析报告+代码

编译原理语法分析报告+代码1000字

一、语法分析

语法分析是编译器的重要部分,它的作用是对源程序进行分析和判断,判断源程序是否符合语法规则,把源程序划分为一个个语法单元,并建立语法树,这里介绍一种常见的语法分析方法——LR(1)分析。

1.LR(1)分析

LR(1)分析是一种自底向上的语法分析方法,它是以LR语法分析机

为基础的。LR(1)分析是在扫描整个输入的基础上作出决策的,名字

中的1表示当扫描到一个符号时,它会读下一个符号来做决策并且

仅仅读一个符号。

2.LR(1)分析器构建

构建LR(1)分析器首先需要构建LR(1)自动机,然后对其进行分析,

得到一个分析表。分析表有两个函数:action和goto。分析表的行

是状态,列是终结符或非终结符,如果分析表的项中既包含action

又包含goto,那么这个表就是一个LR(1)分析表。

3.核心算法

核心算法就是通过分析表进行分析,具体步骤如下:

(1)创建一个栈,将一个状态push入栈。

(2)循环扫描输入,每扫描一个符号就执行一个操作,直到栈为空。

(3)在栈的顶部状态上查找action表。如果输入符号是一个终结符,那么应该执行的动作是shift。如果输入符号是一个结束符号,那么说明输入已经结束,执行acc(accept)操作。

(4)如果找到了一个shift,就将其作为下一个状态push入栈,

并将上次扫描到的符号作为标记push入栈。

(5)否则,在栈的顶部状态上查找goto表。在状态表中查找新状态,并将其push入栈。

常见的错误处理:

(1)在action表中找不到适当的输入:

编译原理语法分析实验报告(含有源代码)

编译原理语法分析实验报告(含有源代码)

《编译原理》实验报告

四、实验过程原始记录(数据、图表、计算等)

输入begin a:=9;x:=2*3;b:=a+x end #

输出success

输入x:=a+b*c end #

输出error

五、实验结果及分析,以及心得体会

通过学习了语法分析,再经过实验,让我对语法分析有了深刻的认识和了解。递归下降分析法,是一种确定的自顶向下分析技术,它的实现思想是,对文法中分别代表一种语法成分的每个非终结符号编写一个子程序,已完成非终结符号所对应的语法成分的分析任务。在分析过程中调用一系列过程或函数,对源程序进行语法语义分析直到整个程序处理结束。

(完整版)编译原理词法分析和语法分析报告+代码(C语言版)[1]

(完整版)编译原理词法分析和语法分析报告+代码(C语言版)[1]

词法分析

一、实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验要求

2.1 待分析的简单的词法

(1)关键字:

begin if then while do end

所有的关键字都是小写。

(2)运算符和界符

:= + - * / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID = letter (letter | digit)*

NUM = digit digit*

(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2.2 各种单词符号对应的种别码:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:

(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……

三、词法分析程序的算法思想:

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

3.1 主程序示意图:

主程序示意图如图3-1所示。其中初始包括以下两个方面:

⑴关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:

语法分析器(含完整源码)

语法分析器(含完整源码)

语法分析实验报告

一、实验目的:

1. 了解单词(内部编码)符号串中的短语句型结构形成规律。

2. 理解和掌握语法分析过程中语法分析思想(LL,LR)的智能算法化方法。

二、实验内容:

构造自己设计的小语言的语法分析器:

1. 小语言的语法描述(语法规则)的设计即文法的设计;

2. 把文法形式符号中所隐含的信息内容挖掘出来并用LL或LR 的资料形式(分析表)表示出来;

3. 语法分析的数据输入形式和输出形式的确定;

4. 语法分析程序各个模块的设计与调试。

主要设备和材料:电脑、winxp操作系统、VC语言系统

三、实验分工:

08150 查找、分析、整理资料

08150 查找、分析、整理资料

08050

0815

081

四、实验步骤:

1、语法规则

①::= {|| | }

②::=var 变量{,变量};

③::=变量:= ;

④::=标识符{运算符标识符};

⑤::=变量|常量

⑥::=+ | - | * | / | >= | <=

⑦::=[]

⑧::= if(表达式) then[begin] {赋值语句|条件语句| 循环语句}[end]

⑨::= [begin] {赋值语句|条件语句| 循环语句} [end]

⑩::=while(表达式) [begin] {赋值语句| 条件语句| 循环语句} [end]

::=prn 表达式

--注1:若if语句、else语句、循环语句中出现begin,后面的end 必须出现,即begin与end同对出现

--注2:if、while后的"(",")"表示终结符,而不是定义成分优先的说明符号

2、分析表:

LR(1)实验报告(附代码)

LR(1)实验报告(附代码)

实验三LR(1) 分析法

实验学时: 4

实验类型:验证

实验要求:必修

一、实验目的

构造LR(1) 分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR (K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。

二、实验内容

对下列文法,用LR( 1)分析法对任意输入的符号串进行分析:(产生式有误,进行修改)

( 1 ) E- E+T

( 2) E- E —T( E->T)

( 3) T- T*F

( 4) T- T/F (T->F)

( 5) F- (E)

( 6) F- i

三、实验目的

1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

2、如果遇到错误的表达式,应输出错误提示信息。

3、程序输入/输出实例:

输入一以#结束的符号串(包括+—*/ () i#):在此位置输入符号串

输出过程如下:

步骤状态栈符号栈剩余输入串动作1 0 # i+i*i#

移进

实验报告正文的内容:

描述LR(1)语法分析程序的设计思想:

定义项目的一般形式是[A —• , a ©…a],这样的一个项目称为一个LR(k)项目。项目中的a©…a称为它的向前搜索符串

(或展望串),令K=1,即为LR(1)语法分析程序。在此,重新定义

CLOSURE( I 的算法:

项目集I的闭包CLOSURED构造方法:

1.I的任何项目都属于CLOSURE(I)

2.若项目[A —•B , a]属于CLOSURE(I) B—是一个产

生式,那么,对于FIRST( a)中的每个终结符b,如果[B —•

b]原来不在CLOSURE(I中,则把它加进去。

编译原理词法分析和语法分析报告+代码[C语言版]

编译原理词法分析和语法分析报告+代码[C语言版]

词法分析

一、实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验要求

2.1 待分析的简单的词法

(1)关键字:

begin if then while do end

所有的关键字都是小写。

(2)运算符和界符

:= + - * / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID = letter (letter | digit)*

NUM = digit digit*

(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2.2 各种单词符号对应的种别码:

表2.1 各种单词符号对应的种别码

2.3 词法分析程序的功能:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:

(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……

三、词法分析程序的算法思想:

算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

3.1 主程序示意图:

主程序示意图如图3-1所示。其中初始包括以下两个方面:

⑴关键字表的初值。

实验二:语法分析实验

实验二:语法分析实验

实验二:语法分析实验

一、实验内容

1.对已给语言文法,选择一种语法分析方法(LL(1)分析法作为编程的依据。

注:文法自己设定,可选择讲过的课后题

2.确定文法后,给出语法分析的过程。

例如:LL(1)文法求select集确定是不是LL(1)文法,并写出预测分析表。

3.编写程序实现句子的分析过程

4.程序设计输入:文法的句子

5.程序运行结果:显示出句子的分析过程和分析结果

二.实验时间:3次课完成

命名:学号姓名词法分析1,2,3

第1次课:查找资料,提出设计思路(每组提交电子文档说明设计思路)

第2次课:设计并修改程序,测试程序(每组提交电子版源程序)

第3次课:完成实验报告,课堂考核(每组提交纸质报告并抽查答辩)

三、上交文档

1.实验报告(书面打印,格式参考实验一词法分析实验),命名学号姓名语法分析实验报告.doc;

2.程序文件(电子版源文件),命名语法分析源程序.cpp。

1

编译原理——语法分析程序设计实验报告

编译原理——语法分析程序设计实验报告

实验二语法分析程序设计

[实验目的]:

1.了解语法分析的主要任务。

2.熟悉编译程序的编制。

[实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。

[实验要求]:

1.选择一个文法,进行实验,可选的文法包括以下三个:

P190 4.8

P190 4.9

P190 4.10

2.设计语法分析程序的输出形式(输出应为语法树或推导),一个可以参考的

例子,可见图1。

3.编写递归下降语法分析程序(参考P148-149 Topdown parsing by

recursive-descent),实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法句子。实验报告中要说明分析使用的方法。

4.根据所作业题选项e所给出的input,生成并输出分析过程中所用的产生式

序列(show the actions of parser):

1 产生式1

2 产生式2

……

5.自已设计一个不合法的句子,作为输出进行分析,给出结果。

[实验过程]

本次实验选择的文法为P190 4.8

lexp->atom|list

atom->number|identifier

list->(lexp-seq)

lexp-seq->lexp lexp-seq

1.写出实现的算法,并画流程图。

本次实验采用递归下降算法,算法流程图如下图1-1:

图1-1 算法流程图

2.根据你选择的文法,分析左递归或左因子是否会影响本算法的结果。

会影响本算法的结果。递归下降分析法要求的文法是LL(1)文法,需要消除左递归和左因子的影响。如果存在左因子,对相同的字符跳转到不同的函数,无法实现递归。

编译原理实验二LL(1)语法分析实验报告

编译原理实验二LL(1)语法分析实验报告

专题3_LL(1)语法分析设计原理与实现

李若森 13281132 计科1301

一、理论传授

语法分析的设计方法和实现原理;LL(1) 分析表的构造;LL(1)分析过程;LL(1)分析器的构造。

二、目标任务

实验项目

实现LL(1)分析中控制程序(表驱动程序);完成以下描述算术表达式的 LL(1)文法的LL(1)分析程序。

G[E]:

E→TE’

E’→ATE’|ε

T→FT’

T’→MFT’|ε

F→(E)|i

A→+|-

M→*|/

设计说明

终结符号i为用户定义的简单变量,即标识符的定义。加减乘除即运算符。

设计要求

(1)输入串应是词法分析的输出二元式序列,即某算术表达式“专题 1”的输出结果,

输出为输入串是否为该文法定义的算术表达式的判断结果;

(2)LL(1)分析程序应能发现输入串出错;

(3)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。

任务分析

重点解决LL(1)表的构造和LL(1)分析器的实现。

三、实现过程

实现LL(1)分析器

a)将#号放在输入串S的尾部

b)S中字符顺序入栈

c)反复执行c),任何时候按栈顶Xm和输入ai依据分析表,执行下述三个动作之一。

构造LL(1)分析表

构造LL(1)分析表需要得到文法G[E]的FIRST集和FOLLOW集。

构造FIRST(α)

构造FOLLOW(A)

构造LL(1)分析表算法

根据上述算法可得G[E]的LL(1)分析表,如表3-1所示:

表3-1 LL(1)分析表

主要数据结构

pair:

用pair来存储单个二元组。该对照表由专题1定义。

map:

存储离散化后的终结符和非终结符。

实验二语法分析实验报告

实验二语法分析实验报告

实验⼆语法分析实验报告

实验⼆语法分析实验报告-⾃上⽽下

⼀、实验⽬的

1.掌握LL(1)分析法的基本原理

2.掌握LL(1)分析表的构造⽅法

3.掌握LL(1)驱动程序的构造⽅法

⼆、设计要求

根据某⼀⽂法编制调试LL(1)分析程序,以便对任意输⼊的符号串进⾏分析。本次实验的⽬的主要是加深对预测分析LL(1)分析法的理解。

测试数据:

简单算术运算⽂法G[E]:

E→TR

R → +TR|ε

T→FW

W→*FW|ε

F→(E) |i

1.⼿⼯计算⾮终结符的FIRST和FOLLOW集合

判断是否是LL(1)⽂法

2.⼿⼯计算该⽂法的预测分析表,存储在数组中

输出要求

(1)编写代码输出该⽂法的预测分析表

(2)输出符号串i+i*i的分析过程

三、实验要求

⽂法:

预测分析表:

符号串i+i*i#的分析过程

四、源代码与实验结果

说明:测试数据的输⼊输出存储在⽂件中。

五、收获(体会)与建议

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

LL(1)语法分析实验报告

一、实验题目 LL(1)语法分析

二、实验目的

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,检查语法错误,进一步掌握常用的语法分析方法。

三、实验内容

构造LL(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合则输出错误信息。

消除递归前的文法消除递归和提取公因子后的等价文法

S →S ∨ a T | a T | ∨ a T S→aTS’ |vaTS’

T →∧ a T | ∧a S’→vaTS’ |ε

T→∧ a T’

T’→∧ aT’

根据已建立的分析表,对下列输入串:a∧ a∧ a进行语法分析,判断其是否符合文法。

四、实验要求

1.根据已由的文法规则建立LL(1)分析表;

2.输出分析过程。

请输入待分析的字符串: a∧ a∧ a

符号栈输入串所用产生式

#S a∧ a∧ a#

#S’Ta a∧ a∧ a# S→aTS’

#S’T ∧ a∧ a#

# S’T’a∧∧ a∧ a# T→∧ a T’

# S’T’a a∧ a#

# S’T’∧ a#

# S’T’a∧∧ a# T’→∧ aT’

# S’ T’a a#

# S’ T’#

# S’ # T’→ε

# # S’→ε

五、程序思路

模块结构:

1、定义部分:定义常量、变量、数据结构。

2、初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体等);

3、运行程序:让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则;

4、利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简单的错误提示。

六、程序源代码

/* 程序名称: LL(1)文法分析程序 */

/* S->S>aT|aT|>aT */

/* T->

/************************************/

/********************************************/ /* 程序相关说明 */

/* A=S’ B=T’ */

/* 0=S 1=S’ 2=T 3=T’*/

/* 0=a 1=< 2=#*/

/************************************/

#include"iostream.h"

#include "stdio.h"

#include "malloc.h"

#include "conio.h"

struct Lchar{

char char_ch;

struct Lchar *next;

}Lchar,*p,*h,*temp,*top,*base;

char curchar;

char curtocmp;

int right;

int table[4][3]={{1,0,0},

{0,0,1},

{0,1,0},

{0,1,1}};

int i,j;

void push(char pchar)

temp=(struct Lchar*)malloc(sizeof(Lchar));

temp->char_ch=pchar;

temp->next=top;

top=temp;

}

void pop(void)

{

curtocmp=top->char_ch;

if(top->char_ch!='#')

top=top->next;

}

void doforpush(int t)

{

switch(t)

{

case 3:push('A');push('T');push('a');push('<');break; case 0:push('A');push('T');push('a');break;

case 6:push('T');push('a');push('<');break;

case 21:push('B');push('a');push('<');break;

case 31:push('T');break;

}

}

void changchartoint()

switch(curtocmp)

{

case 'S':i=0;break;

case 'A':i=1;break;

case 'T':i=2;break;

case 'B':i=3;break;

}

switch(curchar)

{

case 'a':j=0;break;

case '<':j=1;break;

case '#':j=2;

}

}

void dosome(void)

{

int t;

for(;;)

{

pop();

curchar=h->char_ch;

printf("\n%c\t%c",curchar,curtocmp); if(curtocmp=='#' && curchar=='#')

相关文档
最新文档