一、实验目的
- 加深对语法分析器工作过程的理解;
- 加强对预测分析法实现分析程序的掌握;
- 能够采用一种编程语言实现简单的语法分析程序;
- 能够使用自己编写的分析程序对简单的程序段进行语法翻译
二、实验内容
用预测分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。
三、实验方法
- 实验方法:采用Java程序语言进行设计,有控制台根据提示语句进行输入
- 实验原理:预测分析法
- 实验工具:IntelliJ IDEA
四、实验步骤
- 定义目标语言的语法规则
- 求解预测分析需要的符号集和分析表
- 依次读入测试用例,根据预测分析的方法进行语法分析,直到源程序结束
- 对遇到的语法错误做出错误处理
五、实验结果
- 实验输入:
请输入非终结符:
ETF
请输入终结符:
+*()i
请输入语法规则:
E->E+T|T
T->T*F|F
F->(E)|i
请输入测试用例:
(i)*i
- 实验输出:
六、实验结论
实验利用自定义的源代码实现了预测分析法,实验结果正确,符合预期结果。
源代码:
package exercise2;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class GrammaticalAnalysis {
//非终结符集
static List<String> noTerminal = new ArrayList<>();
//终结符集
static List<String> terminal = new ArrayList<>();
//语法规则存储
static String[][] grammarRules;
//消除左递归后语法规则存储
static String[][] grammar_rules;
static String[][] newGrammer;
//文法开始符号
static String init;
//FIRST集
static String[][] firstSet;
//FOLLOW集
static String[][] followSet;
//LL(1)分析表
static int[][] analysis;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//读入非终结符
System.out.println("请输入非终结符: ");
String noTer = input.nextLine();
for (int i = 0; i < noTer.length(); i++){
noTerminal.add(String.valueOf(noTer.charAt(i)));
}
//读入终结符
terminal.add("#");
System.out.println("请输入终结符: ");
String ter = input.nextLine();
for (int i = 0; i < ter.length(); i++){
terminal.add(String.valueOf(ter.charAt(i)));
}
//初始化
grammarRules = new String[noTer.length()][2];
grammar_rules = new String[noTer.length() * 2][2];
newGrammer = new String[noTerminal.size() * 5][3];
//输入语法规则
System.out.println("请输入语法规则:");
String grammar = input.nextLine();
init = String.valueOf(grammar.charAt(0));
do {
divide(grammar);
eliminate(grammar);
grammar = input.nextLine();
}while (!grammar.equals(""));
//请输入测试用例
System.out.println("请输入测试用例:");
String test = input.nextLine();
//输出信息
System.out.println("------------------基本信息-----------------------");
System.out.println("产生式:");
output(grammarRules);
System.out.println("终结符:");
for (int i = 0; i < terminal.size(); i++){
System.out.print(terminal.get(i) + " ");
}
System.out.println();
System.out.println("非终结符:");
for (int i = 0; i < noTerminal.size(); i++){
System.out.print(noTerminal.get(i) + " ");
}
System.out.println();
System.out.println("读取测试:");
System.out.println(test);
System.out.println("-------------------消除左递归---------------------");