精华内容
下载资源
问答
  • 语法分析器

    2015-05-13 15:20:46
    语法分析器
  • 语法分析器语法分析器语法分析器语法分析器语法分析器语法分析器语法分析器语法分析器语法分析器
  • 语法分析器 编译原理 语法分析器 编译原理语法分析器 编译原理 语法分析器 编译原理语法分析器 编译原理
  • 语法分析器java实现

    2019-01-18 19:45:20
    语法分析器java实现,包含词法分析器。程序代码作为词法分析器的输入,词法分析器的输出作为语法分析器的输入,由语法分析器输出语法分析的结果。
  • 词法分析器和自上而下语法分析器,其中语法分析器采用的是简单优先的方法。里面有实验原理,实验代码(界面采用MFC做的)
  • 词法分析器 语法分析器的报告词法分析器 语法分析器的报告
  • Java语法分析器

    2011-06-22 20:26:11
    Java语法分析器Java语法分析器Java语法分析器Java语法分析器Java语法分析器Java语法分析器Java语法分析器
  • 这是一个单文档的tiny语言语法分析器,良好的MFC单文档界面。
  • 语法分析器-LL(1)语法分析

    千次阅读 多人点赞 2019-07-09 09:39:45
    语法分析器 二丶实验目的及要求 通过设计、编制、调试-个典型的语法分析程序(任选有代表性的语法分析方法,如LL(1)、递归下降分析法、LR、 算符优先分析法)等,作为编制语法分析程序的依据,对词法分析器所提供的...

    一丶实验名称

    语法分析器

    二丶实验目的及要求

    通过设计、编制、调试-个典型的语法分析程序(任选有代表性的语法分析方法,如LL(1)、递归下降分析法、LR、 算符优先分析法)等,作为编制语法分析程序的依据,对词法分析器所提供的单词序列进行语法检测和结构分析,实现并进- -步掌握常用的语法分析方法。

    三、实验内容

    选择对各种常见高级程序设计语言都较为通用的语法结构作为分析对象(例如表达式、if、 while、for 等等),给出其文法规则描述(注意,文法规则的描述要符合所选分析方法的要求,比如用LL(1)分析法,文法必须是LL(1)文法),设计并实现一一个完整的语法分析程序。

    输入:源程序以文件的形式输入。

    输出:对于输入的源程序,如果输入源程序是给定文法定义的合法程序,则输出“success",如果不是,即输入源程序有错误,则输出“Error”,并且尽可能指出出错位置和原因。

    四、实验算法描述

    文法规则:

     E→TZ

     Z→+TZ|ε

     T→FY

     Y→*FY|ε

     F→(E)|i

    程序描述(LL(1)文法)

    本程序是基于以构建好的某一语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。

    基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用作分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,则出错,则语法分析结束,输入的字符串为文法的一个句子,否则出错,若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。

    1.First集和Follow集

    FIRST(E)={(,i} FOLLOW(E)={),#}

    FIRST(Z)={+,ε} FOLLOW(Z)={),#}

    FIRST(T)={(,i} FOLLOW(T)={+,),#}

    FIRST(Y)={*,ε} FOLLOW(Y)={+,),#}

    FIRST(F)={(,i} FOLLOW(F)={*,+,),#}

    2.构建好的预测分析表

     

    i

    +

    *

    (

    )

    #

    E

    →TZ

     

     

    →TZ

    synch

    synch

    Z

     

    →+TZ

     

     

    →ε

    →ε

    T

    →FY

    synch

     

    →FY

    synch

    synch

    Y

     

    →ε

    →*FY

     

    →ε

    →ε

    F

    →i

    synch

    synch

    →(E)

    synch

    synch

                                          LL(1)预测分析表

    3.运行结果

    输入正确的源程序截图:

    输出结果截图

     

    输入错误的源程序截图:

    输出结果截图

     

    五、设计技巧和心得体会

    这次实验编写了一个语法分析方法的程序。但是在LL (1)分析器的编写中我只达到了最低要求,就是自己手动输入的文法规则然后通过程序将预测分析表构造出来,然后自已编写总控程序根据分析表进行分析。

    通过本次试验,我能够设计一个简单的语法分析程序,实现对文法规则进行语法检查和结构分析,进一步掌握常用的语法分析方法。

    六、源程序清单(电子版)

    import java.util.Stack;
    
    public class GramerAnasys {
    	
    	//加入同步符号的LL(1)分析表
    	private  String [][] analysisTable = new String[][]{
    			{"TZ","","","TZ","synch","synch"},
    			{"","+TZ","","","ε","ε"},
    			{"FY","synch","","FY","synch","synch"},
    			{"","ε","*FY","","ε","ε"},
    			{"i","synch","synch","(E)","synch","synch"}
    	};
    	
    	//存储终结符
    	private String [] VT = new String[]{"i","+","*","(",")","#"};
    	
    	//存储终结符
    	private String [] VN = new String[]{"E","Z","T","Y","F"};
    	//输入串
    	
    	private StringBuilder strToken = new StringBuilder("i*i)+i");
    	
    	//分析栈
    	private Stack<String> stack = new Stack<String>();
    	
    	//a保存从输入串中读取的一个输入符号,当前符号
    	private String a = null;
    	
    	//X中保存stack栈顶符号
    	private String X = null;
    	
    	//flag标志预测分析是否成功
    	private boolean flag = true;
    	
    	//记录输入串中当前字符的位置
    	private int cur = 0;
    	
    	//记录步数
    	private int count = 0;
    	
    	//输出语法规则
    	protected void print(){
    		System.out.printf("E→TZ \n"+"Z→+TZ|ε \n"+"T→FY \n"+"Y→*FY|ε \n"+"F→(E)|i \n");
    		
    	}
    	//初始化
    	protected void init(){
    		strToken.append("#");
    		stack.push("#");
    		System.out.printf("%-9s %-38s %6s %-20s\n","步骤 ","符号栈 ","        输入串 ","    所用产生式 ");
    		stack.push("E");
    		curCharacter();
    		System.out.printf("%-6d %-20s %6s \n",count,stack.toString(),strToken.substring(cur, strToken.length()));
    	}
    	
    	//读取当前栈顶符号
    	protected String stackPeek(){
    		X = stack.peek();
    		return X;
    	}
    	
    	//返回输入串中当前位置的字母
    	private String curCharacter(){
    			a = String.valueOf(strToken.charAt(cur));
    		return a;
    	}
    	
    	//判断X是否是终结符
    	protected boolean XisVT(){
    		for(int i = 0 ; i < (VT.length - 1); i++){
    			if(VT[i].equals(X)){
    				return true;
    			}
    		}
    		return false;
    	}
    	
    	//查找X在非终结符中分析表中的横坐标
    	protected String VNTI(){
    		int Ni = 0 , Tj = 0;
    		for(int i = 0 ; i < VN.length ; i++){
    			if(VN[i].equals(X)){
    				Ni = i;
    			}
    		}
    		for(int j = 0 ; j < VT.length ; j++){
    			if(VT[j].equals(a)){
    				Tj = j;
    			}
    		}
    		return analysisTable[Ni][Tj];
    	}
    	
    	//判断M[A,a]={X->X1X2...Xk}
    	//把X1X2...Xk推进栈
    	//X1X2...Xk=ε,不推什么进栈
    	protected boolean productionType(){
    		if(VNTI() != ""){
    			return true;
    		}
    		return false;
    	}
    	
    	//推进stack栈
    	protected void pushStack(){
    		stack.pop();
    		String M = VNTI();
    		String ch;
    		for(int i = (M.length() -1) ; i >= 0 ; i--){
    			ch = String.valueOf(M.charAt(i));
    			stack.push(ch);
    		}
    		System.out.printf("%-6d %-20s %6s %-1s->%-12s\n",(++count),stack.toString(),strToken.substring(cur, strToken.length()),X,M);
    	}
    	
    	//总控程序
    	protected void totalControlProgram(){
    		while(flag == true){
    			stackPeek();
    			if(XisVT() == true){
    				if(X.equals(a)){
    					cur++;
    					a = curCharacter();
    					stack.pop();
    					System.out.printf("%-6d %-20s %6s \n",(++count),stack.toString(),strToken.substring(cur, strToken.length()));
    				}else{
    					ERROR();
    				}
    			}else if(X.equals("#")){
    				if(X.equals(a)){
    					flag = false;
    				}else{
    					ERROR();
    				}
    			}else if(productionType() == true){
    				if(VNTI().equals("synch")){
    					ERROR();
    				}else if(VNTI().equals("ε")){
    					stack.pop();
    					System.out.printf("%-6d %-20s %6s %-1s->%-12s\n",(++count),stack.toString(),strToken.substring(cur, strToken.length()),X,VNTI());
    				}else{
    					pushStack();
    				}
    			}else{
    				ERROR();
    			}
    		}
    	}
    	
    	//出现错误
    	protected void ERROR(){
    		System.out.println("Error.输入串出现错误,无法进行分析");
    		System.exit(0);
    	}
    	
    	//打印存储分析表
    	protected void printf(){
    		if(flag == false){
    			System.out.println("********success");
    		}else {
    			System.out.println("********Error");
    		}
    		
    	}
    	
    	public static void main(String[] args) {
    		
    		GramerAnasys gramerAnasys= new GramerAnasys();
    		gramerAnasys.print();
    		gramerAnasys.init();
    		gramerAnasys.totalControlProgram();
    		gramerAnasys.printf();
    	}
    	
    }

     

    展开全文
  • 编译原理(词法分析器+语法分析器) 编译原理(词法分析器+语法分析器
  • 语法分析器 语法分析器,将编译中经词法分析产生的代码建立语法树,进行语法分析
  • Bison语法分析器-2

    2020-05-05 10:14:20
    建议只做参考使用,请勿抄袭 利用附录提供的C语言文法的相关参考资料,...利用语法分析器生成工具 Bison 编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。
  • 编译原理词法分析器和语法分析器,简单易懂,超强大,尤其适合自己动手模仿写编译器的同学。
  • LL(1)预测语法分析器

    2018-06-01 14:05:59
    LL(1)预测语法分析器 LL(1)预测语法分析器 LL(1)预测语法分析器 LL(1)预测语法分析器
  • 编译原理 语法分析器

    2010-06-17 15:56:24
    编译原理课程设计 编译原理 语法分析器编译原理 语法分析器编译原理 语法分析器编译原理 语法分析器编译原理 语法分析器编译原理 语法分析器编译原理 语法分析器
  • 语法分析器源代码 C语言

    热门讨论 2011-08-18 22:15:18
    语法分析器源代码 C语言语法分析器源代码 C语言语法分析器源代码 C语言语法分析器源代码 C语言语法分析器源代码 C语言语法分析器源代码 C语言
  • 语法分析器和词法分析器的java实现代码,以证明可以,望各位下载。
  • c语法分析器

    2013-04-05 16:10:45
    c语法分析器,生成程序的语法树 分析单个文件,不支持预处理, 不解析预处理符号#
  • 语法分析器实验报告

    2015-08-25 09:07:15
    语法分析器的报告及其代码、是在词法分析器实验之后的一次实验、过程详细。
  • 编译原理实验 词法分析器 语法分析器 完美代码 完美实验
  • 词法分析器 算符优先 语法分析器 语法制导翻译 编译原理的实验 c语言的
  • 递归下降语法分析器

    2019-05-08 16:22:34
    c语言编写的递归下降语法分析器的算法,测试成功可以直接跑代码
  • 包括词法分析器、lr(k)语法分析器、递归下降语法分析器、中间代码生成器以及对应的实验报告。中间代码生成器是在词法分析器和语法分析器的基础上做的。写的很乱仅供参考。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 313,692
精华内容 125,476
关键字:

语法分析器