一、实验目的

了解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)语法分析程序的设计相关推荐

  1. 编译原理-实验四-LR(0)语法分析程序的设计

    一.实验目的 了解LR(0)语法分析算法的基本思想,掌握LR(0)语法分析程序的构造方法. 二.实验内容 根据LR(0)语法分析算法的基本思想,设计一个对给定文法进行LR(0)语法分析的程序,并用C. ...

  2. 编译原理—实验二LL(1)语法分析(一)

    一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...

  3. 编译原理实验二:赋值语句的语法分析程序设计

    编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...

  4. 编译原理实验二:Bison

    编译原理实验二:Bison 实验要求 1.了解Bision基础知识,如何将文法产生式转换为Bison语句 2.阅读/src/common/SyntaxTree.c,对应头文件 /include/Syn ...

  5. 编译原理实验二(全部存储到数组再逐行验证语法版.....这种思路被老师否了,应该是验证一行扔掉一行才对)

    编译原理实验二(可能还有BUG,不确定继续找) 要大改一次23333,老师的意思是不能用数组存储,而是一边识别单词,然后识别完一行就判断一次语法 写实验二的时候找到的实验一的一个逻辑错误 改动了实验一 ...

  6. 编译原理实验二 macos系统 itoa方法报错解决方法

    编译原理实验二 生成符号表的前期准备中使用itoa函数报错问题 执行 gcc -o parser lex.yy.c parser.tab.c ast.c 显示: itoa 函数是一个广泛应用的,从非标 ...

  7. 编译原理实验二:标识符的识别

    实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出所有的合法标识符. [输入]字符串. [输出]单词符号流,一行一个单词. [题目]设计一个程序,从任意字符串中识别出所有可视为C语言 ...

  8. 编译原理实验二 自上而下语法分析

    自上而下 语法分析实验 一.实验目的 (1)给出 PL/0 文法规范,要求编写 PL/0语言的语法分析程序. (2)通过设计.编制.调试一个典型的自上而下语法分析程序,实现对词法分析程序所提供的单词序 ...

  9. 编译原理实验2(1)——自上而下语法分析

    一.实验目的 1.为初等函数运算语言构造LL(1)语法分析器. 2.掌握LL(1)语法分析器的方法,加深对自上而下语法分析原理的理解. 3.掌握设计.编制并调试LL(1)语法分析程序的思想和方法. 二 ...

最新文章

  1. 解题报告(五)组合计数(ACM / OI)超高质量题解
  2. Apache + PHP为什么不能在www目录下写文件以及如何解决PHP写文件问题
  3. 【转】Cannot find -ltinfo when compiling android 4.0.3
  4. muduo学习笔记 线程类
  5. 文本分类模型_文本分类中的经典深度学习模型
  6. 买房后每月还贷是什么感觉?
  7. python 以图搜图_Python深度学习,手把手教你实现「以图搜图」
  8. STC开天斧虚拟示波器使用
  9. linux聊天室项目课程设计,网络编程课程设计报告--基于linux网络聊天室设计.docx...
  10. 解决Microsoft Teredo Tunneling Adapter 這個裝置無法啟動。 (代碼 10)
  11. 可怕的KCFErrordomainCFNetWork 303
  12. STM32MP157A-DK1 烧写系统
  13. 计算机论文的致谢部分写什么,论文的致谢部分怎么写
  14. win8.1 如何查看com端口号
  15. CF1527E Partition Game——DP优化
  16. Python实现屏幕截图的两种方式
  17. 万字长文剖析架构设计全攻略(上)
  18. ROS中7自由度机械臂自定义发布订阅节点
  19. 菜谱项目(个人中心、类别模块、菜谱发布)
  20. 【H5网游服务端】决战魔域H5一键即玩服务端+授权GM后台+外网教程

热门文章

  1. 消息队列-无亲缘关系进程通信
  2. 用python可以做什么有趣的事作文_Python还能做这么有趣的事情!
  3. Spring Boot 2.x 基础教程: 快速入门
  4. 安装vs2017需要授权证书签名
  5. 小学计算机教师教科研方面,小学教师科研工作总结
  6. 从Kaggle赛题: Quora Question Pairs 看文本相似性/相关性
  7. C#在WinForm开发中Label换行方法
  8. linux下修复windows7启动项,Ubuntu 14.04.02 LTS 启动项误写入 /dev/sda1 (win 7 loader) 修复...
  9. DIY ROV系列(三)水下机器人结构和动力设计
  10. h5页面通过链接跳转另一个公众号