实验二:词法分析程序的设计
实验要求:
1)完成DFA的数据结构表示和存储;
2)编写一段程序,接受字符串的输入,判断该字符串是否为该DFA能识别的字符串;
3)用C#或JAVA语言实现;
实验报告以及实验程序的提交:
1)在实验任务截止时间以前将实验程序和实验报告的word文档打包上传超星网络教学平台。
2)每个同学的文件压缩包命名为:学号_姓名_2.rar
3)压缩包中应包含两个文件夹,一个存放程序,另一个存放实验报告的word文件。
识别字符串的DFA为参考课本P65的图3.18的DFA,且用二维数组来存储
DFA M=(K,Σ,f,S,Z)的行为的模拟程序
K:=S;
c:=getchar;
while c<>eof do
{K:=f(K,c);
c:=getchar;
};
if K is in Z then return (‘yes’)
else return (‘no’)
实验代码
package compile_2;
import java.util.*;
public class DFA {
char startState;
char[] test;
char[] state;
char[][] transTable;
char[] endState;
public DFA() {
startState = '1';
test = new char[] {'a','b','c','d'};
state = new char[] { '1', '2', '3','4', '5', '6','7' };
transTable = new char[][]{{'3','2',' ',' '},
{'4','2',' ',' '},
{' ','6','3','5'},
{' ','7','3','5'},
{'4',' ',' ',' '},
{' ','6',' ',' '},
{' ','6',' ',' '}};
endState = new char[] { '6','7' };
}
private char traning(char nowS, char nextChar) {
int m = -1, n = -1;
for (int i = 0; i < state.length; i++) {
if (nowS == state[i]) {
m = i;
break;
}
}
for (int i = 0; i < test.length; i++) {
if (nextChar == test[i]) {
n = i;
break;
}
}
if (n == -1 || m == -1) {
return '0';
}
return transTable[m][n];
}
public static void main(String[] args) {
DFA dfa = new DFA();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符串");
String inputStr = scanner.nextLine();
String inputStrs[] = inputStr.trim().split("//s");
char currState = dfa.startState;
for (int i = 0; i < inputStrs.length; i++) {
for (int j = 0; j < inputStrs[i].length(); j++) {
currState = dfa.traning(currState, inputStrs[i].charAt(j));
if(currState=='0'){
System.out.println("no");
System.exit(0);
}
}
boolean flag=false;
for(int k=0;k<dfa.endState.length;k++){
if(currState==dfa.endState[k]){
flag=true;
break;
}
}
if(flag){
System.out.println("yes");
}else{
System.out.println("no");
}
}
}
}
输入与输出
1 输入
qwsdf
输出
no
2 输入
acccccb
输出
yes
3 输入
bbaccb
输出
yes
4 输入
acdab
输出
yes
5 输入
bcxxcs
输出
no
6 输入
acccccccdab
输出
yes