⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yufafenxi.java

📁 语法分析器 java版 编译课程综合训练
💻 JAVA
字号:
package yufafenxi;

import cifafenxi.word;

public class yufafenxi {
	private String[][] key = new String[1000][2];
	private int num = 0;
	private int curr = 0;
	private int wrong = 1;
	private int row = 1;
	private boolean bool = true;
	// private String season;
	private String xx;

	public void fenxi(String aFile,String bFile) {
		word a = new word();
		a.analysis(aFile);
		num = a.getK();
		for (int i = 0; i < num; i++) {
			key[i][0] = a.result[i][0];
			key[i][1] = a.result[i][1];
		}
		run();
	}

	/* 语法分析流程 */
	public void run() {
		try {
			if (Integer.parseInt(key[curr][0]) == 10) {
				boolean yn = doWhile();
				if (!yn) {
					System.out.println("语法错误,错误位置为第" + row + "句第" + wrong
							+ "个单词");
					findNext();
				} else
					System.out.println("While-do 循环语句,嵌套赋值语句");
				wrong = 1;
			} else if (Integer.parseInt(key[curr][0]) == 6) {
				boolean yn = branch();
				if (!yn) {
					System.out.println("语法错误,错误位置为第" + row + "句第" + wrong
							+ "个单词");
					findNext();
				} else
					System.out.println(xx);
				wrong = 1;
			} else if (Integer.parseInt(key[curr][0]) == 11) {
				boolean yn = setValue();
				if (!yn) {
					System.out.println("语法错误,错误位置为第" + row + "句第" + wrong
							+ "个单词");
					findNext();
				} else
					System.out.println("赋值语句");
				wrong = 1;
			} else {
				findNext();
			}
			bool = true;
			if (curr < num) {
				run();
			}
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			System.out.println("必须以分号结尾");
		}
	}

	/* 以上是语法分析器的分析过程 */
	private boolean doWhile() {
		boolean yn;
		curr++;
		wrong++;
		isBool();
		if (Integer.parseInt(key[curr][0]) == 9) {
			curr++;
			wrong++;
			if (setValue()) {
				yn = true;
			} else
				yn = false;
		} else
			yn = false;
		return yn;
	}

	/* 循环语句的判断 */
	private boolean branch() {
		boolean yn;
		curr++;
		wrong++;
		if (isBool()) {
			if (Integer.parseInt(key[curr][0]) == 7) {
				curr++;
				wrong++;
				if (setValue()) {
					if (Integer.parseInt(key[curr][0]) == 21) {
						yn = true;
						xx = "If-then分支语句,嵌套赋值语句";
					} else if (Integer.parseInt(key[curr][0]) == 8) {
						curr++;
						wrong++;
						if (setValue()) {
							if (Integer.parseInt(key[curr][0]) == 21) {
								yn = true;
								xx = "If-then-else分支语句,嵌套赋值语句";
							} else
								yn = false;
						} else
							yn = false;
					} else
						yn = false;
				} else
					yn = false;
			} else {
				yn = false;
			}
		} else
			yn = false;
		return yn;
	}

	/* 分支语句的判断 */
	private boolean setValue() {
		boolean yn;
		if (Integer.parseInt(key[curr][0]) == 11) {
			curr++;
			wrong++;
		}
		if (Integer.parseInt(key[curr][0]) == 23) {
			curr++;
			wrong++;
			if (expression()
					&& (Integer.parseInt(key[curr][0]) == 21 || Integer
							.parseInt(key[curr][0]) == 8)) {
				yn = true;
			} else {
				yn = false;
			}
		} else {
			yn = false;
		}
		return yn;
	}

	/* 复制语句的判断 */
	private void findNext() {
		if (curr < num)
			while (Integer.parseInt(key[curr][0]) != 21)
				curr++;
		wrong = 1;
		row++;
		curr++;
	}

	/* 查找下一个句子 */
	private boolean isBool() {
		boolean yn;
		if (Integer.parseInt(key[curr][0]) == 11
				| Integer.parseInt(key[curr][0]) == 12) {
			curr++;
			wrong++;
			yn = true;
		} // System.out.println("..........."+key[curr][1]);}
		else
			yn = false;
		return yn;
	}

	/* 判断是否为变量或者常量 */
	private boolean expression() {

		if (Integer.parseInt(key[curr][0]) == 15) {
			curr++;
			wrong++;

			expression();

			if (Integer.parseInt(key[curr][0]) == 16) {
				curr++;
				wrong++;

				if (Integer.parseInt(key[curr][0]) != 21
						&& Integer.parseInt(key[curr][0]) != 16
						&& Integer.parseInt(key[curr][0]) != 11
						&& Integer.parseInt(key[curr][0]) != 12) {
					goOn();
				}
			}

			else {
				bool = false;
			}
		} else if (Integer.parseInt(key[curr][0]) == 11
				|| Integer.parseInt(key[curr][0]) == 12) {
			curr++;
			wrong++;
			goOn();
		} else
			bool = false;
		return bool;
	}

	/*表达式的判断*/
	private void goOn() {
		if (Integer.parseInt(key[curr][0]) == 13
				| Integer.parseInt(key[curr][0]) == 14
				| Integer.parseInt(key[curr][0]) == 24
				| Integer.parseInt(key[curr][0]) == 25) {
			curr++;
			wrong++;
			expression();
		}
	}
	/*表达式判断中的一个子程序*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -