2021-06-03LL(1)语法分析程序的设计 编译原理 java

LL(1)语法分析程序的设计 编译原理 java

1)完成对文法及LL(1)预测分析表的存储和处理;
2)编写LL(1)语法分析程序,接受字符串的输入,判断该字符串是否为该文法的合法句子,并输出完整的分析过程;
3)用C#或JAVA语言实现;

源码
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	System.out.println("输入串:");
	Scanner input = new Scanner(System.in);
	String str = input.nextLine();
	int len = str.length();
	char []s = str.toCharArray();	
	Analyse analyse = new Analyse();
	analyse.anlyse(s,len);		
}

}

public class G {

private char []row = {'i','+','*','(',')','#'};
private char []line = {'E','M','T','N','F'};

public int findRow(char r){
	for(int i =0;i<row.length;i++){
		if(r == row[i] ){
			return i;
		}
	}
	return -1;
}

public int findLine(char l){
	for(int i =0;i < line.length;i++){
		if(l == line[i]){
			return i;
		}
	}
	return -1;
}

}

import java.util.Stack;

public class Analyse {

private Stack<String> stack=new Stack<String>();
private String [][]LL1 = {
		{"->TM","null","null","->TM","null","null"},
		{"null","->+TM","null","null","->$","->$"},
		{"->FN","null","null","->FN","null","null"},
		{"null","->$","->*FN","null","->$","->$"},
		{"->i","null","null","null","(E)","null"}
		};	
public void anlyse(char str[],int len){
	G g = new G();
	int x,y;
	int i = 0;
	char s;//栈顶	
	stack.push("#");		
	stack.push("E");		
	while(i<len){
		s = stack.peek().charAt(0);			
		
		if(s >= 65 && s <= 90){						
			x = g.findRow(str[i]);
			y = g.findLine(s);
			
			if(x != -1 && y != -1){					
				int len2 = LL1[y][x].length();
				if(LL1[y][x].equals("null")){						
					System.out.println("报错");
					break;
				}
				else if(!(LL1[y][x]=="->$")){
					stack.pop();						
					for(int m = len2-1; m > 1;m--){
						String ss = LL1[y][x].charAt(m)+"";
						stack.push(ss);
					}
				}
				else {
					stack.pop();
				}
				
				System.out.println(s+""+ LL1[y][x]);
			}else{
				System.out.println("报错!");
				break;
			}
			
		}else{
			if(s == str[i] ){
				stack.pop();
				if(s == '#' &&str[i]== '#'){
					System.out.println("接受");
					return;
				}					
				System.out.println(s+"匹配");
				i++;
			}else{
				System.out.println("报错!!");
				break;
			}
		}
	}
	
}

}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: LL(1)语法分析器是一种自底向上的语法分析器,它利用预测分析表进行语法分析,使用预测分析表可以确保在分析过程中不会出现回溯。在编写LL(1)语法分析器时,需要进行文法的预处理,包括消除左递归、提取左公因子等操作。可以使用Java编写LL(1)语法分析器,并使用JavaCC等工具来生成语法分析器。 ### 回答2: 编译原理LL(1)语法分析器是一种利用语法分析器对程序代码进行分析的工具。它的主要作用是将代码按照语法规则解析为语法树,进而产生可执行的目标代码。在LL(1)语法分析器的实现中,常用的编程语言包括C、C++、Java等。 在LL(1)语法分析器的实现中,需要实现两个主要功能——预测分析表和语法树的构建。预测分析表是一个二维数组,用于表示语法分析器的动作和转移状态。通过预测分析表,语法分析器可以根据当前所读取到的符号和语法栈顶上的符号进行匹配,并决定下一步的动作。预测分析表的生成需要通过对文法的初步处理,包括消除左递归、提取左公因子等,以保证它的正确性。 语法树的构建是在预测分析表和代码串的基础上实现的。语法树是整个语法分析过程中的核心数据结构,通常是一棵二叉树,用于表示代码中的语法结构。在LL(1)语法分析器中,语法树的构建过程可以通过递归下降方法,通过对文法进行递归分析,构建语法树。 Java作为一种面向对象编程语言,具有良好的面向对象特性和异常处理机制,非常适合构建LL(1)语法分析器。Java中可以通过编译器框架Javacc或ANTLR等工具来生成LL(1)语法分析器的代码,也可以通过手工编写代码实现。 总之,LL(1)语法分析器是编译原理中的重要工具,它的实现需要掌握文法的转换和处理、符号和状态的匹配等基本概念和技能。通过实现一个LL(1)语法分析器,可以更深入地理解语言的结构和规则,为后续的编译器开发和语言设计打下基础。 ### 回答3: 编译原理是计算机科学中的一门重要课程,它研究的是如何将人类语言编写程序翻译成计算机可以执行的代码。其中,语法分析是编译器的重要组成部分,而ll(1)语法分析器则是语法分析的一种常见方法。 ll(1)语法分析器使用了带有前瞻的自上而下预测分析方法,它以文法中的非终结符为引导,通过构建符号串的最左推导来实现语法分析。其中,ll(1)中的“ll”代表left-to-right的左向右扫描方式,“1”则代表只看一个符号向前预测。 在java中实现ll(1)语法分析器,可以采用语法分析生成器的方法,即编写一个能读取文法规则并生成对应ll(1)语法分析器的程序。在实现中,需要完成以下几个步骤: 1. 读取文法规则:将文法规则以某种数据结构的形式存储在程序中。 2. 构建FIRST集合:遍历文法规则,计算出每个非终结符的FIRST集合,即该非终结符所能推导出的终结符的集合。 3. 构建FOLLOW集合:遍历文法规则,计算出每个非终结符的FOLLOW集合,即该非终结符后面可以出现的终结符的集合。 4. 构建LL(1)预测分析表:根据FIRST集合和FOLLOW集合,计算出LL(1)预测分析表,该表记录了每个非终结符和终结符的组合对应的文法规则。 5. 实现分析程序:使用LL(1)预测分析表,编写程序实现语法分析器,其主要是根据输入的符号串使用LL(1)预测分析表中的规则推导出一颗语法分析树。 总之,实现ll(1)语法分析器的过程不仅需要对编译原理中的知识有深刻的理解,同时要具备较高的计算机编程能力和数学功底。通过Java编写LL(1)语法分析器可以帮助编译器生成器完成自底向上的汇编语言生成,为软件开发提供技术支持。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值