编译原理-实验二-LL(1)语法分析程序的设计
一、实验目的
了解LL(1)分析器的基本构成及用自顶向下的LL(1)方法对表达式进行语法分析的方法,掌握LL(1)语法分析程序的构造方法。
二、实验内容
根据LL(1)语法分析算法的基本思想,设计一个对给定文法进行LL(1)语法分析的程序,并用C、C++或Java语言编程实现。要求程序能够对从键盘输入的任意字符串进行分析处理,判断出该输入串是否是给定文法的有效句子,并针对该串给出具体的LL(1)语法分析过程。
三、实验要求
对给定文法G[S]:
S->AT
A->BU
T->+AT|$
U->*BU|$
B->(S)|m
其中,$表示空串。
1、手工判断上述文法G[S]是否LL(1)文法,若不是,将其转变为LL(1)文法;
2、对转变后的LL(1)文法手工建立LL(1)分析表;
3、根据清华大学出版编译原理教材上算法思想,构造LL(1)分析程序;
4、用LL(1)分析程序对任意键盘输入串m+m*m#进行语法分析,并根据栈的变化状态输出给定串的具体分析过程。
四、运行结果示例
从任意给定的键盘输入串:
m+m*m#;
输出:
用LL(1)分析法分析符号串m+m*m#的过程
Step |
Stack |
String |
Rule |
Step |
Stack |
String |
Rule |
1 |
#S |
m+m*m# |
S->AT |
10 |
#TUm |
m*m# |
M匹配 |
2 |
#TA |
m+m*m# |
A->BU |
11 |
#TU |
*m# |
U->*BU |
3 |
#TUB |
m+m*m# |
B->m |
12 |
#TUB* |
*m# |
*匹配 |
4 |
#TUm |
m+m*m# |
M匹配 |
13 |
#TUB |
m# |
B->m |
5 |
#TU |
+m*m# |
U->$ |
14 |
#TUm |
m# |
M匹配 |
6 |
#T |
+m*m# |
T->+AT |
15 |
#TU |
# |
U->$ |
7 |
#TA+ |
+m*m# |
+匹配 |
16 |
#T |
# |
T->$ |
8 |
#TA |
m*m# |
A->BU |
17 |
# |
# |
接受 |
9 |
#TUB |
m*m# |
B->m |
五、实验提示
本实验重点有两个:一是如何用适当的数据结构实现LL(1)分析表存储和使用;二是如何实现各规则右部串的逆序入栈处理。
建议:使用结构体数组。
六、分析与讨论
1、若输入串不是指定文法的句子,会出现什么情况?
2、总结LL(1)语法分析程序的设计和实现的一般方法。
个人实验代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;//表格数组
char LL1[50][50][100] = {{"->AT","->AT" ,"null","null" ,"null","null" },{"->BU","->BU" ,"null","null" ,"null", "null"},{"null","null" ,"->$" ,"->+AT","null","->$" },{"null","null" ,"->$" ,"->$" ,"->*BU","->$" },{"->m" ,"->(S)","null","null" ,"null","null" } };
char H[200]="SATUB";
char L[200]="m()+*#";
stack<char>cmp;int findH(char a)
{for(int i = 0; i < 5; i++)//找到对应行{if(a==H[i]){return i;}}return -1;
}
int findL(char b)
{for(int i = 0; i < 6; i++)//找到对应列{if(b==L[i]){return i;}}return -1;
}
int error(int i,int cnt, int len, char p[],char str[])
{printf("%d\t%s\t",cnt,p);for(int q = i; q<len;q++){cout<<str[q];}printf("\t报错\n");return len;
}
void analyze(char str[],int len)
{int cnt = 1;//输出Step专用int i = 0;char p[200] = "#S";//输出stack专用int pindex = 2;printf("Step\tStack\tString\tRule\n");while(i<len){int x,y;char ch = cmp.top();if(ch>='A'&&ch<='Z'){cmp.pop();x = findH(ch);y = findL(str[i]);if(x!=-1&&y!=-1){int len2 = strlen(LL1[x][y]);if(strcmp(LL1[x][y],"null")==0){i = error(i,cnt,len,p,str);continue;}printf("%d\t%s\t",cnt,p);if(p[pindex-1] != '#'){p[pindex] = '\0';pindex--;}if(LL1[x][y][2]!='$'){for(int q = len2-1; q>1; q--){p[pindex++] = LL1[x][y][q];cmp.push(LL1[x][y][q]);}}else{p[pindex] = '\0';pindex--;}for(int q = i; q<len;q++){cout<<str[q];}printf("\t%c%s\n",ch,LL1[x][y]);}else{i = error(i,cnt,len,p,str);continue;///未找到,报错}}else{if(ch==str[i]){cmp.pop();printf("%d\t%s\t",cnt,p);if(ch=='#'&&str[i]=='#'){printf("#\t接受\n");return ;}for(int q = i; q<len;q++){cout<<str[q];}printf("\t%c匹配\n",ch);pindex--;p[pindex] = '\0';i++;}else{i = error(i,cnt,len,p,str);continue;///报错}}cnt++;}}
int main()
{//cout<<H[0]<<H[4]<<endl;//cout<<L[0]<<L[5]<<endl;/*for(int i = 0; i < 5; i++){for(int j = 0 ; j < 6; j++)printf("%5s",LL1[i][j]);cout<<endl;}*/char str[200];cin>>str;int len = strlen(str);cmp.push('#');cmp.push('S');analyze(str,len+1);return 0;
}
/*
输入串:m+m*m#
输出
Step Stack String Rule
1 #S m+m*m# S->AT
2 #TA m+m*m# A->BU
3 #TUB m+m*m# B->m
4 #TUm m+m*m# m匹配
5 #TU +m*m# U->$
6 #T +m*m# T->+AT
7 #TA+ +m*m# +匹配
8 #TA m*m# A->BU
9 #TUB m*m# B->m
10 #TUm m*m# m匹配
11 #TU *m# U->*BU
12 #TUB* *m# *匹配
13 #TUB m# B->m
14 #TUm m# m匹配
15 #TU # U->$
16 #T # T->$
17 # # 接受输入:m#
输出
Step Stack String Rule
1 #S m# S->AT
2 #TA m# A->BU
3 #TUB m# B->m
4 #TUm m# m匹配
5 #TU # U->$
6 #T # T->$
7 # # 接受输入:S#
输出
Step Stack String Rule
1 #S S# 报错输入:m*m#
输出
Step Stack String Rule
1 #S m*m# S->AT
2 #TA m*m# A->BU
3 #TUB m*m# B->m
4 #TUm m*m# m匹配
5 #TU *m# U->*BU
6 #TUB* *m# *匹配
7 #TUB m# B->m
8 #TUm m# m匹配
9 #TU # U->$
10 #T # T->$
11 # # 接受
*/
编译原理-实验二-LL(1)语法分析程序的设计相关推荐
- 编译原理-实验四-LR(0)语法分析程序的设计
一.实验目的 了解LR(0)语法分析算法的基本思想,掌握LR(0)语法分析程序的构造方法. 二.实验内容 根据LR(0)语法分析算法的基本思想,设计一个对给定文法进行LR(0)语法分析的程序,并用C. ...
- 编译原理—实验二LL(1)语法分析(一)
一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...
- 编译原理实验二:赋值语句的语法分析程序设计
编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...
- 编译原理实验二:Bison
编译原理实验二:Bison 实验要求 1.了解Bision基础知识,如何将文法产生式转换为Bison语句 2.阅读/src/common/SyntaxTree.c,对应头文件 /include/Syn ...
- 编译原理实验二(全部存储到数组再逐行验证语法版.....这种思路被老师否了,应该是验证一行扔掉一行才对)
编译原理实验二(可能还有BUG,不确定继续找) 要大改一次23333,老师的意思是不能用数组存储,而是一边识别单词,然后识别完一行就判断一次语法 写实验二的时候找到的实验一的一个逻辑错误 改动了实验一 ...
- 编译原理实验二 macos系统 itoa方法报错解决方法
编译原理实验二 生成符号表的前期准备中使用itoa函数报错问题 执行 gcc -o parser lex.yy.c parser.tab.c ast.c 显示: itoa 函数是一个广泛应用的,从非标 ...
- 编译原理实验二:标识符的识别
实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出所有的合法标识符. [输入]字符串. [输出]单词符号流,一行一个单词. [题目]设计一个程序,从任意字符串中识别出所有可视为C语言 ...
- 编译原理实验二 自上而下语法分析
自上而下 语法分析实验 一.实验目的 (1)给出 PL/0 文法规范,要求编写 PL/0语言的语法分析程序. (2)通过设计.编制.调试一个典型的自上而下语法分析程序,实现对词法分析程序所提供的单词序 ...
- 编译原理实验2(1)——自上而下语法分析
一.实验目的 1.为初等函数运算语言构造LL(1)语法分析器. 2.掌握LL(1)语法分析器的方法,加深对自上而下语法分析原理的理解. 3.掌握设计.编制并调试LL(1)语法分析程序的思想和方法. 二 ...
最新文章
- 解题报告(五)组合计数(ACM / OI)超高质量题解
- Apache + PHP为什么不能在www目录下写文件以及如何解决PHP写文件问题
- 【转】Cannot find -ltinfo when compiling android 4.0.3
- muduo学习笔记 线程类
- 文本分类模型_文本分类中的经典深度学习模型
- 买房后每月还贷是什么感觉?
- python 以图搜图_Python深度学习,手把手教你实现「以图搜图」
- STC开天斧虚拟示波器使用
- linux聊天室项目课程设计,网络编程课程设计报告--基于linux网络聊天室设计.docx...
- 解决Microsoft Teredo Tunneling Adapter 這個裝置無法啟動。 (代碼 10)
- 可怕的KCFErrordomainCFNetWork 303
- STM32MP157A-DK1 烧写系统
- 计算机论文的致谢部分写什么,论文的致谢部分怎么写
- win8.1 如何查看com端口号
- CF1527E Partition Game——DP优化
- Python实现屏幕截图的两种方式
- 万字长文剖析架构设计全攻略(上)
- ROS中7自由度机械臂自定义发布订阅节点
- 菜谱项目(个人中心、类别模块、菜谱发布)
- 【H5网游服务端】决战魔域H5一键即玩服务端+授权GM后台+外网教程
热门文章
- 消息队列-无亲缘关系进程通信
- 用python可以做什么有趣的事作文_Python还能做这么有趣的事情!
- Spring Boot 2.x 基础教程: 快速入门
- 安装vs2017需要授权证书签名
- 小学计算机教师教科研方面,小学教师科研工作总结
- 从Kaggle赛题: Quora Question Pairs 看文本相似性/相关性
- C#在WinForm开发中Label换行方法
- linux下修复windows7启动项,Ubuntu 14.04.02 LTS 启动项误写入 /dev/sda1 (win 7 loader) 修复...
- DIY ROV系列(三)水下机器人结构和动力设计
- h5页面通过链接跳转另一个公众号