实验内容

针对SysY语言中简单算术表达式文法G[E]:
E→TE’
E’→ATE’|ε
T→FT’
T’→MFT’ |ε
F→(E) | i
A → + | -
M → * | /
求解相应的FIRST、FOLLOW集,构造预测分析表,并编写LL(1)语法分析程序,并给出测试句子的分析过程。

  1. 输入:是词法分析输出的二元组序列,即任意简单算术表达式经过专题1程序输出后得到的结果。【上述文法中i即对应词法分析的标识符, ±*/分别对应词法分析得到的运算符】
  2. 处理:基于分析表进行 LL(1)语法分析,判断其是否符合文法。
  3. 输出:串是否合法。
    注:有关FIRST/FOLLOW集的有关定义请看编译原理 LL(1)文法判别方法

设计方法

给出语法分析表

1.使用两个map储存该表,第一个表为Map<Character,Map>,储存左侧非终结符号和右侧输入符号对应的map,第二个map为Map<Character,String>,储存输入符号和应该转换为的字符串。
2.利用栈Deque来储存需要转换的符号,从E开始。每次开始遍历时先弹出栈顶符号,通过map的搜索找到对应的字符串,将字符串压入栈,如果不存在则跳过。并设置错误标记,如果有跳过则最后输出“不符合文法”。如果栈顶的符号和当前字符串符号相同,则输出匹配,遇到空值ε时,字符串往后一位,不把ε压入栈。
3.若栈或者字符串序列有一者率先到达底端,则直接报错。

函数定义

public static void Init()//初始化分析表
public static String txt2String(File file)//读入txt
public static void analyze(String s)//分析程序

程序


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;public class LL1_2 {//LL(1)语法分析器的设计与实现static Deque<Character> deque = new LinkedList<>();static Map<Character,Map<Character,String>> mapcol =  new HashMap<>();//找列static String str="";public static void Init(){//载入表格,X代表E',Y代表T',这里可以用语法糖简化书写Map<Character,String> maprow1 =  new HashMap<>();maprow1.put('i',"TX");maprow1.put('(',"TX");mapcol.put('E',maprow1);Map<Character,String> maprow2 =  new HashMap<>();maprow2.put('i',"FY");maprow2.put('(',"FY");mapcol.put('T',maprow2);Map<Character,String> maprow3 =  new HashMap<>();maprow3.put(')',"ε");maprow3.put('+',"ATX");maprow3.put('-',"ATX");maprow3.put('$',"ε");mapcol.put('X',maprow3);Map<Character,String> maprow4 =  new HashMap<>();maprow4.put('i',"i");maprow4.put('(',"(E)");mapcol.put('F',maprow4);Map<Character,String> maprow5 =  new HashMap<>();maprow5.put('+',"+");maprow5.put('-',"-");mapcol.put('A',maprow5);Map<Character,String> maprow6 =  new HashMap<>();maprow6.put('*',"*");maprow6.put('/',"/");mapcol.put('M',maprow6);Map<Character,String> maprow7 =  new HashMap<>();maprow7.put(')',"ε");maprow7.put('+',"ε");maprow7.put('-',"ε");maprow7.put('$',"ε");maprow7.put('*',"MFY");maprow7.put('/',"MFY");mapcol.put('Y',maprow7);// System.out.println(mapcol);deque.push('$');deque.push('E');//初始符号入栈}public static String txt2String(File file){try{BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文16String s = null;while((s = br.readLine())!=null){//使用readLine方法,一次读一行str = str  +s;}br.close();}catch(Exception e){e.printStackTrace();}return str;}public static void analyze(String s){char[] chars = s.toCharArray();int length = s.length();int index=0;int flag = 0,flagk=0;while(!deque.isEmpty()&&index<length){Character pop = deque.pop();if(pop=='$'&&index!=length-1) {System.out.println("已到栈底,错误!");break;}else if(chars[index]=='$'&&!mapcol.containsKey(pop)&&pop!='$'){//判断是否非终结符System.out.println("字符串到底,错误!");break;}if(pop==chars[index]){index++;System.out.println("匹配"+pop);continue;}Map map = mapcol.get(pop);//找到对应的行if(map.containsKey(chars[index])) {//找到该符号在表中是否符合条件Object o = map.get(chars[index]);char[] chars1 = o.toString().toCharArray();if(chars1[0]!='ε') {for (int i = chars1.length - 1; i >= 0; i--) {deque.push(chars1[i]);}}System.out.println(deque);}else{System.out.println("错误,略过当前记号");flag=1;index++;}}System.out.println("分析结束");if(flag==1||flagk==1) System.out.println("不符合文法!");}public static void main(String[] args) {File file = new File("diguiin.txt");File file2 = new File("diguiout.txt");str = txt2String(file);System.out.println(str);Init();analyze(str);}
}

程序测试

输入:i*i+i$
输出:
[T, X, $]
[F, Y, X, $]
[i, Y, X, $]
匹配i
[M, F, Y, X, $]
[*, F, Y, X, $]
匹配*
[i, Y, X, $]
匹配i
[X, $]
[A, T, X, $]
[+, T, X, $]
匹配+
[F, Y, X, $]
[i, Y, X, $]
匹配i
[X, $]
[$]
匹配$
分析结束输入:i*(i+i)$
输出:
[T, X, $]
[F, Y, X, $]
[i, Y, X, $]
匹配i
[M, F, Y, X, $]
[*, F, Y, X, $]
匹配*
[(, E, ), Y, X, $]
匹配(
[T, X, ), Y, X, $]
[F, Y, X, ), Y, X, $]
[i, Y, X, ), Y, X, $]
匹配i
[X, ), Y, X, $]
[A, T, X, ), Y, X, $]
[+, T, X, ), Y, X, $]
匹配+
[F, Y, X, ), Y, X, $]
[i, Y, X, ), Y, X, $]
匹配i
[X, ), Y, X, $]
[), Y, X, $]
匹配)
[X, $]
[$]
匹配$
分析结束输入:i*i+i)$
输出:
[T, X, $]
[F, Y, X, $]
[i, Y, X, $]
匹配i
[M, F, Y, X, $]
[*, F, Y, X, $]
匹配*
[i, Y, X, $]
匹配i
[X, $]
[A, T, X, $]
[+, T, X, $]
匹配+
[F, Y, X, $]
[i, Y, X, $]
匹配i
[X, $]
[$]
已到栈底,错误!
分析结束输入:i*i+ii$
输出:
[T, X, $]
[F, Y, X, $]
[i, Y, X, $]
匹配i
[M, F, Y, X, $]
[*, F, Y, X, $]
匹配*
[i, Y, X, $]
匹配i
[X, $]
[A, T, X, $]
[+, T, X, $]
匹配+
[F, Y, X, $]
[i, Y, X, $]
匹配i
错误,略过当前记号
[$]
匹配$
分析结束
不符合文法!

编译原理 LL(1)语法分析器的设计与实现相关推荐

  1. 【编译原理】LR语法分析器的设计与实现

    LR语法分析器的设计与实现 本文为当时编译原理实验作业,要求用设计的思想完成,小题大做,仅供参考 文章目录 LR语法分析器的设计与实现 实验要求 实现功能 输入输出 样例 一.LR语法分析器问题定义 ...

  2. 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现

    编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...

  3. 【编译原理】词法分析器语法分析器

    简单编译器设计 采用Java语言对C++语言进行编译,具体的简单编译器设计 词法分析器-扫描器的设计与实现 基本符号表 状态转换图 代码实现 import java.io.*; import java ...

  4. 编译原理之简单语法分析器(c语言)

    语法分析是编译过程的核心部分,其基本任务是根据语言的语法规则进行语法分析,如果不存在语法错误即给出正确的语法结果,并为语义分析和代码生成做准备. 语法分析器的两种方式 语法分析器的任务主要是确定是否可 ...

  5. 编译原理 实验2 语法分析器的构造

    [实验目的] 练习构造语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解:提高词法分析方法的实践能力 [实验要求] 利用某一高级程序设计语言构造语法分析程序 [具体要求]对于给定的文法 ...

  6. 编译原理LR(1)语法分析器 C++实现

    LR(1)语法分析器 C++语言编写,已通过VS2019调试 文章目录 LR(1)语法分析器 一.测试结果 二.测试文件 三.核心代码 四.完整代码 感谢阅读! 如有错误,恳请指正! 一.测试结果 二 ...

  7. 编译原理-5-LL(1)语法分析器

    LL(1)语法分析器 1. 什么是LL(1)语法分析器 自顶向下的.递归下降的.预测分析的.适用于LL(1)文法的LL(1)语法分析器 自顶向下构建语法分析树 根节点是文法的起始符号SSS 每个中间节 ...

  8. 南华大学编译原理----词法分析器的设计与实现、语法分析器的设计与实现

    下载链接:(各位同学不需要充钱哈,这种我也没有收益,去淘宝上面找个代下,大概0.5元就能下载实验报告,用来给同学们参考,下载积分不是我设置的,是网站自己默认的) ------------------- ...

  9. 贵州大学-编译原理实验2-句法分析器

    贵州大学-编译原理实验2-句法分析器 考虑下面的C语言子集的文法,其中<>括起来的为非终结符,粗体为终结符. ® <statement_list> <statement_ ...

最新文章

  1. python3.7安装numpy模块-Python3.7模块numpy
  2. 使用Lombok简化你的代码
  3. C/C++ 之 C++强制类型转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)
  4. python多进程编程 多个函数并发执行_python并发编程之多进程编程
  5. android ndk使用c 11,使用c 11 std :: async在android ndk中使用不完整类型无效
  6. 计算机软件记不住设置,想知道电脑密码记不住了怎么办
  7. jQuery data
  8. 1040. 有几个PAT(25
  9. 深入理解设计模式(22):享元模式
  10. Bootstrap 调用插件
  11. Android 判断用户2G/3G/4G移动数据网络
  12. 一年多开源没进展,我也放弃了
  13. CSS进阶(2)—— width,height如此高深,难道你真懂得
  14. ps html切图教程,PS网页制作基础教程:学习切图那点儿事
  15. 庆祝北大“如何制作MOOC”课程取得优秀成绩
  16. 算法时间复杂度符号分析——O、o、Ω、ω、Θ
  17. JS将阿拉伯数字翻译成中文的大写数字、JS将数字转换为大写金额(整理)
  18. 发票信息批量提取到 excel 软件 3.1
  19. BurpSuite实战——合天网安实验室学习笔记
  20. 好评率超高的9个公众号,值得收藏

热门文章

  1. 荣获“中国 AI 企业知识产权百强榜” 思岚科技再受肯定
  2. cidr php,PHP 如何实现ip2cidr(生成多个cidr)
  3. cidr php,PHP怎么实现ip2cidr(生成多个cidr)
  4. 师兄帮帮项目管理案例分享
  5. 3个来钱快的门路,看着不起眼但很赚钱
  6. 5分钟技术实操: 手把手教你开发以太坊钱包
  7. MethodFilterInterceptor和AbstractInterceptor的比较
  8. 抗积分饱和PID控制器
  9. Android中的各种访问权限Permission含义
  10. imx287网络配置