实验二--语法分析程序的设计-
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while (tmp.charAt(i) <= '9' && tmp.charAt(i) >= '0') {
num += tmp.charAt(i);
i++;
if (i == tmp.length())
break;
}
output.println("< " + 1 + ", " + num + ">");
{ "E", "TA", null, null, "TA", null, null },
{ "A", null, "+TA", null, null, "@", "@" },
{ "T", "FB", null, null, "FB", null, null },
{ "B", null, "@", "*FB", null, "@", "@" },
"B->@源自文库, "F->P", "F->(E)" };
static String[] followE = { ")", "#" };
static String[] followEA = { ")", "#" };
static String[] followT = { "+", ")", "#" };
T->F|T*F;
F->i|(E);
2、根据该文法构造相应的LL(1)文法及LL(1)分析表,并为该文法设计预测分析程序,利用C语言或C++语言或Java语言实现;
3、利用预测分析程序完成下列功能:
1)手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束;
2)读入文本文件中的表达式;
3)调用实验一中的词法分析程序搜索单词;
static String[] followTB = { "+", ")", "#" };
static String[] followF = { "*", "+", ")", "#" };
static String[] firstE = { "i", "(" };
static String[] firstEA = { "+", "@" };
java.io.File file = new java.io.File(infile);
Scanner input = new Scanner(file);
java.io.PrintWriter output = new PrintWriter(outfile);
int count = 0;
word[count].push("#");
while (input.hasNext()) {
String tmp = input.next();
int i = 0;
while (i < tmp.length()) {
if (tmp.charAt(i) <= '9' && tmp.charAt(i) >= '1') {//检查十进制数字
String num = "";
static String[] firstT = { "i", "(" };
static String[] firstTB = { "*", "@" };
static String[] firstF = { "i", "(" };
static String[][] list = { { "", "i", "+", "*", "(", ")", "#" },
{ "F", "i", null, null, "(E)", null, null } };
public static void scan(String infile,String outfile, Stack<String>[] word, Stack<String>[] expression)throws Exception {
")", "[", "]", "==", "!=", "!", "=", ">=", "<=", "+=", "-=", "*=",
"/=", ";" };
/*
* 给定文法G[E]: E->T|E+T; T->F|T*F; F->i|(E);
*/
static String[] gram = { "E->TA", "A->+TA", "A->@", "T->FB", "B->*FB",
五、实验步骤
1、分析文法,将给出的文法转化为LL(1)文法;
2、学习预测分析程序的结构,设计合理的预测分析程序;
3、编写测试程序,包括表达式的读入和结果的输出;
4、测试程序运行效果,测试数据可以参考下列给出的数据。
六、测试数据
输入数据:
编辑一个文本文文件expression.txt,在文件中输入如下内容:
实验二
姓名:学号:专业班级
一、实验目的
通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中预测分析方法。
二、实验内容
设计一个文法的预测分析程序,判断特定表达式的正确性。
三、实验要求
1、给出文法如下:
G[E]
E->T|E+T;
4)把单词送入预测分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息;
5)完成上述功能,有余力的同学可以进一步完成通过程序实现对非LL(1)文法到LL(1)文法的自动转换(见实验二附加资料1)。
四、实验环境
PC微机
DOS操作系统或Windows操作系统
Turbo C程序集成环境或Visual C++程序集成环境
正确结果:
(1)10;
输出:正确
(2)1+2;
输出:正确
(3)(1+2)*3+(5+6*7);
输出:正确
(4)((1+2)*3+4
输出:错误
(5)1+2+3+(*4+5)
输出:错误
(6)(a+b)*(c+d)
输出:正确
(7)((ab3+de4)**5)+1
输出:错误
七、源代码
import java.util.*;
import java.io.*;
public class test2 {
static String[] key_word = { "main", "if", "then", "while", "do", "int",
"else" };
static String[] cal_word = { "+", "-", "*", "/", "<", ">", "{", "}", "(",
num += tmp.charAt(i);
i++;
if (i == tmp.length())
break;
}
output.println("< " + 1 + ", " + num + ">");
{ "E", "TA", null, null, "TA", null, null },
{ "A", null, "+TA", null, null, "@", "@" },
{ "T", "FB", null, null, "FB", null, null },
{ "B", null, "@", "*FB", null, "@", "@" },
"B->@源自文库, "F->P", "F->(E)" };
static String[] followE = { ")", "#" };
static String[] followEA = { ")", "#" };
static String[] followT = { "+", ")", "#" };
T->F|T*F;
F->i|(E);
2、根据该文法构造相应的LL(1)文法及LL(1)分析表,并为该文法设计预测分析程序,利用C语言或C++语言或Java语言实现;
3、利用预测分析程序完成下列功能:
1)手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束;
2)读入文本文件中的表达式;
3)调用实验一中的词法分析程序搜索单词;
static String[] followTB = { "+", ")", "#" };
static String[] followF = { "*", "+", ")", "#" };
static String[] firstE = { "i", "(" };
static String[] firstEA = { "+", "@" };
java.io.File file = new java.io.File(infile);
Scanner input = new Scanner(file);
java.io.PrintWriter output = new PrintWriter(outfile);
int count = 0;
word[count].push("#");
while (input.hasNext()) {
String tmp = input.next();
int i = 0;
while (i < tmp.length()) {
if (tmp.charAt(i) <= '9' && tmp.charAt(i) >= '1') {//检查十进制数字
String num = "";
static String[] firstT = { "i", "(" };
static String[] firstTB = { "*", "@" };
static String[] firstF = { "i", "(" };
static String[][] list = { { "", "i", "+", "*", "(", ")", "#" },
{ "F", "i", null, null, "(E)", null, null } };
public static void scan(String infile,String outfile, Stack<String>[] word, Stack<String>[] expression)throws Exception {
")", "[", "]", "==", "!=", "!", "=", ">=", "<=", "+=", "-=", "*=",
"/=", ";" };
/*
* 给定文法G[E]: E->T|E+T; T->F|T*F; F->i|(E);
*/
static String[] gram = { "E->TA", "A->+TA", "A->@", "T->FB", "B->*FB",
五、实验步骤
1、分析文法,将给出的文法转化为LL(1)文法;
2、学习预测分析程序的结构,设计合理的预测分析程序;
3、编写测试程序,包括表达式的读入和结果的输出;
4、测试程序运行效果,测试数据可以参考下列给出的数据。
六、测试数据
输入数据:
编辑一个文本文文件expression.txt,在文件中输入如下内容:
实验二
姓名:学号:专业班级
一、实验目的
通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中预测分析方法。
二、实验内容
设计一个文法的预测分析程序,判断特定表达式的正确性。
三、实验要求
1、给出文法如下:
G[E]
E->T|E+T;
4)把单词送入预测分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息;
5)完成上述功能,有余力的同学可以进一步完成通过程序实现对非LL(1)文法到LL(1)文法的自动转换(见实验二附加资料1)。
四、实验环境
PC微机
DOS操作系统或Windows操作系统
Turbo C程序集成环境或Visual C++程序集成环境
正确结果:
(1)10;
输出:正确
(2)1+2;
输出:正确
(3)(1+2)*3+(5+6*7);
输出:正确
(4)((1+2)*3+4
输出:错误
(5)1+2+3+(*4+5)
输出:错误
(6)(a+b)*(c+d)
输出:正确
(7)((ab3+de4)**5)+1
输出:错误
七、源代码
import java.util.*;
import java.io.*;
public class test2 {
static String[] key_word = { "main", "if", "then", "while", "do", "int",
"else" };
static String[] cal_word = { "+", "-", "*", "/", "<", ">", "{", "}", "(",