程序输入/输出示例:

对下列文法,用LL(1)分析法对任意输入的符号串进行分析:

(1)E->TG

(2)G->+TG

(3)G->ε

(4)T->FS

(5)S->*FS

(6)S->ε

(7)F->(E)

(8)F->i

 读文件:i+i*i#

输出结果:i+i*i#为合法符号串

代码:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
struct Stack {char s[30];int top; //栈顶指针
}Stack;
char v1[6] = { 'i','+','*','(',')','#' };//终结符
char v2[5] = { 'E','G','T','S','F' };//非终结符
//预测分析表,用符号^来代替ε
char table[5][6][4] = { { "TG","","","","TG","" },
{ "","+TG","","","^","^" },
{ "FS","","","FS","","" },
{ "","^","*FS","","^","^" },
{ "i","","","(E)","","" } };
void push(char ch) {Stack.s[Stack.top] = ch;Stack.top++;
}
char pop() {Stack.top--;return Stack.s[Stack.top];
}
/**逆序进栈**/
void InversePush(int row, int line) {char temp[4];int i;for (i = 0; i < 4; i++) {if (table[row][line][i] != '\0')//字符串结束位是'\0'temp[i] = table[row][line][i];else {temp[i] = '\0';break;}}if (i == 0)return;cout << v2[row] << "->";for (int k = 0; k < i; k++) cout << temp[k];cout << endl;for (i = i - 1; i >= 0; i--) {if (temp[i] != '^')   //^代表εpush(temp[i]);}
}
/**判断X是否为终结符**/
int IsTerminal(char X) {//若是则返回下标,非终结符返回-1for (int i = 0; i<6; i++) {if (X == v1[i])return i;}return -1;
}
/**查找预测表**/
bool FindTable(char X, char a) {//若为空白则出错,否则进栈int row;for (row = 0; row < 5; row++){if (X == v2[row])break;}if (row == 5)return false;int line = IsTerminal(a);if (line == -1)return false;if (table[row][line][0] == '\0')return false;elseInversePush(row, line); return true;
}int  main()
{FILE *fp; char a, X; bool flag = true;char str[20]; int len = 0;if ((fopen_s(&fp,"E:\\test2.txt", "r")) != NULL) {printf("error opening.\n");exit(1);}Stack.top = 0;push('#'); //栈底放一个’#’push('E');//放入文法开始符号a = fgetc(fp);str[len] = a;str[++len] = '\0';while (flag) {X = pop();if (X == '#') {if (a == '#') {cout << str << "是合法符号串" << endl;return 0;}}else if ((IsTerminal(X)) != -1) {//栈顶是终结符if (a == X) {//栈顶和输入串第一个字符进行抵消a = fgetc(fp);str[len] = a;str[++len] = '\0';}else {flag = false;}}else if (!FindTable(X, a))flag = false;}cout << str << "是非法符号串" << endl;return 0;
}

 运行结果:

LL(1)分析法的功能

LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。

LL(1)分析法实验设计思想及算法

编译原理:自上而下LL(1)分析法实验(c++代码实现)相关推荐

  1. 编译原理 词法分析 算符优先分析法

    编译原理 词法分析 算符优先分析法 实验目的 加深对语法分析器工作工程的理解,加强对算符优先分析法实现语法分析程序的掌握:能够采用一种编程语言实现简单的语法分析程序:能够使用自己辨析的分析程序对简单的 ...

  2. 编译原理教程_6 LR分析法

    文章原稿 https://gitee.com/fakerlove/fundamentals-of-compiling 文章目录 6. LR分析法 6.1 简介 (1)LR分析法的优缺点 (2)分析表的 ...

  3. 国内外编译原理课程实践教学现状分析

    <自己动手写编译器.链接器> 冯向萍 (新疆农业大学计算机与信息工程学院)   摘 要:本文主要从教材的选择,实践项目的设置以及实践课程占总评成绩的比例等方面分析和比较了国内外多所高校编译 ...

  4. 编译原理: Subset Construction 子集构造法(幂集构造)(NFA转DFA)

    编译原理: Subset Construction 子集构造法(幂集构造)(NFA转DFA) 文章目录 编译原理: Subset Construction 子集构造法(幂集构造)(NFA转DFA) 简 ...

  5. 层次分析法步骤及代码编写

    层次分析法步骤及代码编写 笔记大部分由观看[强烈推荐]清风:数学建模算法.编程和写作培训的视频课程整理出: 视频链接:https://www.bilibili.com/video/BV1DW411s7 ...

  6. 层次分析法(AHP)--代码书写部分

    层次分析法(AHP)–代码书写部分 在正常的层次分析法的过程中,如果判断矩阵是一致矩阵,就直接进行权重计算就可以了.但是如果判断矩阵是非一致性矩阵,我们是先进行一致性检验,再进行判断矩阵的权重计算.但 ...

  7. 编译原理——自上而下的语法分析方法(LL分析法)

    自上而下的语法分析方法(LL分析法) 概述: 语法分析的地位:编译程序的核心部分 任务:词法分析出来的单词序列是否是给定文法的句子 理论:上下文无关文法和下推自动机 方式:自上而下的语法分析(推导)和 ...

  8. 编译原理:算符优先分析实验

    什么是算符优先分析法 算符优先分析法是一种简单.直观的自下而上分析法 算符优先分析法就是仿照算术表达式的四则运算过程而设计的一种语法分析方法. 这种分析方法首先要规定运算符之间(确切地说终结符之间)的 ...

  9. 【编译原理】【C语言】实验一:手动构造词法分析器

    C语言 实验环境:Visual Studio 2019 author:zoxiii 词法分析器 1.实验内容 2.前期准备 2.1 待分析的C语言子集的词法 2.2 C语言子集的单词符号表示表 2.3 ...

最新文章

  1. 精心分享7个让你意想不到的网站,大开眼界!
  2. 使用jsp:useBean指令
  3. regression
  4. python学习笔记之random模块
  5. 1.2 架构结构和视图
  6. OC Extension Color(颜色宏定义)
  7. Performs recursive(递归) glob(全局) with given suffix and rootdir,使用os.walk(rootdir)和filename.endswith(s
  8. pymol安装教程linux,Pymol安装与问题解决
  9. android电话录音没有声音,Android通话录音未录制来电语音(示例代码)
  10. 一场“测谎”人机对战背后的故事:度小满的技术进击之路
  11. v-for错误:应为数组元素析构模式
  12. 生成自签名证书步骤(一)
  13. 设计模式学习笔记(一)
  14. 小何~初次认识PIL
  15. 统计自然语言处理梳理二:句法分析
  16. C语言八行杨辉三角空格数,C语言 杨辉三角
  17. Ubuntu16.04下的主题美化
  18. Token和Session有什么区别,面试官满意的答案
  19. 【TensorflowTTS 中文语音生成 Win10】
  20. iOS中 为 iOS 建立 Travis CI 韩俊强的博客

热门文章

  1. ChatGPT的奇妙人格
  2. java程序性能优化(一)
  3. 【第104期】7本适合设计师提升交互设计能力的书
  4. C语言程序设计实验第三版:文件程序设计
  5. umeng(友盟)实现第三方登录和分享详解之登录详解,程序员的中年危机
  6. 黑客入侵电脑常用的5种手段,如果你电脑里有秘密,做好3件事
  7. matlab排列序列的产生,序列与序数的一一映射函数
  8. 求生之路2服务器指令比较全
  9. 基于大数据(Hadoop+Java+MySQL)的数码商城购物推荐系统设计与实现 文档+任务书+开题报告+文献综述+答辩PPT+项目源码及数据库文件
  10. ${VAR}部分说明及用法