模拟一个DFA的执行 Java版

想了解更多内容,移步至编译原理专栏

==========================2021.12.22 更新===================================

整理了一下代码,同步到了gitee

https://gitee.com/godelgnis/lrparserhttps://gitee.com/godelgnis/lrparser

 --------------------------------------------------分割线---------------------------------------------------------------------

这学期在学编译原理,教材電子工业出版社《编译原理》(第四版),实验的第一个小任务就是这个,刚开始有点懵逼

其实就是从书上找一个DFA的例子实现一下就可以了

于是就找了书上41页的例子3.10实现一个Java版本的DFA

上代码!!

package dfn;

public class DFA {
	
	private String  content;
	private String[] status = {"q0","q1","q2"};
	
	private String startStatus;
	private String endStatus;
	
	
	public DFA(int start, int end) {
		startStatus = status[start];
		endStatus = status[end];
		System.out.println("开始状态:" + startStatus+ ", 结束状态:" + endStatus);
	}
	
	
	public void setContent(String content) {
		this.content = content;
	}

//	@SuppressWarnings("unused")
	public void result() {
		String status = getEndStrus(startStatus);
		if (status == null) {
			System.out.println("illegal input!");
		}if(status.equals(endStatus)){
			System.out.println("yes");
		}else {
			System.out.println("no");
		}
		
	}
	
	public String getEndStrus(String startStatus) {
		String status = startStatus;
		char[] tokens = getToken();
		System.out.print("状态机: " + status);
		for (int i = 0; i < tokens.length && status != null; i++) {
			char ch = tokens[i];
			String nextStatus = getNextStrus(status, ch);
			status = nextStatus;
			System.out.print("-->" + status);
		}
		System.out.println();
		return status;
	}
	
	public String getNextStrus(String start, char ch) {
		String nextStrus;
		switch (start) {
		case "q0":
			if(ch == 'a') {
				nextStrus = "q1";
			}
			else if(ch == 'b'){
				nextStrus = "q2";
			}else {
				nextStrus = null;
			}
			break;
		case "q1":
			if(ch == 'a' || ch == 'b') {
				nextStrus = "q1";
			}else {
				nextStrus = null;
			}
			break;
		case "q2":
			if(ch == 'a') {
				nextStrus = "q2";
			}
			else if(ch == 'b'){
				nextStrus = "q1";
			}else {
				nextStrus = null;
			}
			break;
		default:
			nextStrus =null;
			break;
		}
		return nextStrus;
	}
	
	public char[] getToken() {
		int count = 0;
		char[] tokens = new char[this.content.length()];
		for(int i = 0; i < this.content.length(); ++i) {
			char ch = this.content.charAt(i);
			if(ch != ' ' || ch != '\n') {
				tokens[count++] = ch;
			}
		}
		if(count != this.content.length()) {
			char[] arrayChar = new char[count];
			System.arraycopy(tokens, 0, arrayChar, 0, count);
			tokens = arrayChar;
		}
		return tokens;
	}
	
}
package dfn;

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		
		System.out.println("输入DFA开始状态和结束状态,一行一个:");   //输入0或1或2
		Scanner input = new Scanner(System.in);
		int start = input.nextInt();
		int end = input.nextInt();
		input.nextLine();
		while(true) {
			System.out.println("输入要分析的字符串:");
			String content = input.nextLine();
			DFA dfa = new DFA(start, end);
			dfa.setContent(content);
			dfa.result();
		}
	}
}

测试数据及结果

当输入字符不符合要求时,会显示非法输入

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 实验内容 1、定义一个右线性正规文法,示例如(仅供参考) G[S]:S→aU|bV| U→bV|aQ V→aU|bQ Q→aQ|bQ|e 实验前要考虑清楚用哪种数据结构存储上述文法。 2、构造其有穷确定自动机,如 3、利用有穷确定自动机M=(K,Σ,f, S,Z)行为模拟程序算法,来对于任意给定的串,若属于该语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”。 K:=S; c:=getchar; while ceof do {K:=f(K,c); c:=getchar; }; if K is in Z then return (‘yes’) else return (‘no’) 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)输入正规文法。RG到FA (2)将NFA化为DFA (3)输入一个字符串判断是否符合文法。 ①最开始记A为开始状态a为第一个字符。 ②然后A经过字符a到达下一个状态记为B,A状态指向B状态,a指向字符串的下一个字符。 ③循环②步直到B状态为终态时停止则该字符串符合该文法或a指向最后一个字符时都没到终态停止则该字符窜不符合该文法。 2.3 实验流程 ①预习实验,实验前阅读实验指导书和阅读书本。 ②通过书本了解判断文法的原理。首先在纸上模拟文法的判断过程。 ③上机实现模拟过程。 ④调试程序,知道能得到预期的结果。 2.4 实验的基本技术设计方案 (用到哪些技术,包括编译原理中,程序设计中,离散数学中等的哪些技术) ①java的基础语法。 ②数据结构里的结构体及简单算法。 ③编译原理的理论知识。 ④运用了java里的一些集合类。 2.5 数据结构 class edge { char PriorityState; char ch; char NextState; edge(char p,char c, char n){ PriorityState = p; ch = c; NextState = n; } @Override public String toString() { return "edge [PriorityState=" + PriorityState + ", ch=" + ch + ", NextState=" + NextState + "]"; } } 2.6 实验输入输出 2.7 实验设计语言 Java语言。 3. 实验主要源代码及分析说明
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值