当前位置:文档之家› 编译原理语法分析报告

编译原理语法分析报告

flag=false;
returnfalse;
}
}
returnflag;
}
publicstaticvoidmain(String args[]) {
LL l =newLL();
();
String input ="";
booleanflag =true;
while(flag) {
try{
InputStreamReader isr =newInputStreamReader;
booleanb = ();
"----------------------------------------------------------------------");
if(b){
"您输入的字符串"+input+"是该文发的一个句子");
}else{
"您输入的字符串"+input+"有词法错误!");
intfarWay = 14 - ();
for(intk=0; k<farWay; k++) {
" ");
}
farWay = 20 - ();
for(intk=0; k<farWay; k++) {
" &or(intk=0; k<farWay; k++) {
(二)思考题的思考与分析
思考题1:给出在生成语法分析表时所遇到的困难,以及是如何处理的
生成分析表时,需要用到栈,有很多难处,但是通过网络,逐渐还是解决了问题。
思考题2:思考还可以什么形式来给出语法分析的结果
若分析结果符合该语法,还可以用语法分析树的形式表示。
思考题3:如果在语法分析中遇到了语法错误,是应该中断语法分析呢,还是应该进行适当处理后继续语法分析,你是怎么处理的
若栈顶符号为非终结符时,查看预测分析表,看栈顶符号和当前输入符号是否构成产生式,若产生式的右部为ε,则将栈顶符号出栈,取出栈顶符号进入下一个字符的分析。若不为ε,将产生式的右部逆序的入栈,取出栈顶符号进入下一步分析。
程序流程图:
本程序中使用以下文法作对用户输入的字符串进行分析:
E→TE’
E’→+TE’|ε
}
}
}
}
}
三、实验结果
1、显示预测分析表,提示用户输入字符串
2、输入的字符串为正确的句子
3、输入的字符串中包含了不属于终结符集的字符
4、输入的字符串不是该文法能推导出来的句子
四、实验中遇到的问题总结
主要阐述两方面的问题
(一)实验过程中遇到的问题如何解决的
实验中遇到的问题,通过查书、和上网搜索资料解决问题。
();
"分析过程");
"----------------------------------------------------------------------");
" 步骤 | 分析栈 | 剩余输入串 | 所用产生式 ");
"----------------------------------------------------------------------");
BufferedReader br =newBufferedReader(isr);
"请输入字符串(输入exit退出):");
input = ();
}catch(Exception e) {
();
}
if("exit")){
flag =false;
}else{
(input);
(1, 1, 0, 0);
基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。
《编译原理》课程
实验报告
哈尔滨工程大学软件学院
2015年5月
实验2:语法分析
一、实验目的
1.巩固对语法分析的基本功能和原理的认识。
2.通过对语法分析表的自动生成加深语法分析表的认识。
3.理解并处理语法分析中的异常和错误。
二、实验内容
本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。
T→FT’
T’→*FT’|ε
F→i|(E)
该文法的预测分析表为:
代码:
package;
import.*;
publicclassLL {
StringVn[] = {"E","E'","T","T'","F"}; ength();
}
for(intk=0; k<l; k++) {
" ");
}
" ");
}
}
"----------------------------------------------------------------------");
}
publicvoidsetInputString(String input) {
inputString= input;
}
publicbooleanjudge() {
for(inti=0; i<=; i++) {
if(fenxi[i] ==null) {
break;
}else{
fenxizhan = fenxizhan +fenxi[i];
}
}
// 输出当前分析栈情况,输入字符串,所用产生式或匹配
" "+count);
String countToString = (count);
for(inti=1; i<=k; i++) {// 将产生式右部的各个符号入栈
String s2 = () - 1, ());
s1 = (0, () - 1);
if("'")) {
s2 = () - 1, ())+ s2;
i++;
s1 = (0, () - 1);
}
fenxi[count1] = s2;
语法分析不同于词法分析,一旦语法分析错了一个产生式,那么很可能导致后面的产生式全部出错。所以我选择一旦出现语法错误即中断分析并报错。
五、实验体会
包括收获、心得体会、存在的问题及解决问题的方法、建议等
通过进行本次语法分析实验,我在实践中加深了对于语法分析基本内容和原理的了解和认识,以及对语法分析表有了更深一层的了解。在本次实验过程中,难度对于同学们来说的确很大,希望该实验老师以后能够给给更多的指导,让同学们明白应该做什么,应该怎么做。
for(into=0; o<farWay; o++) {
" ");
}
farWay = 20 - ();
for(into=0; o<farWay; o++) {
" ");
}
farWay = 25 - ();
for(into=0; o<farWay; o++) {
" ");
}
+P[count3][count2]);
if(fenxi[i] ==null) {
break;
}else{
fenxizhan = fenxizhan +fenxi[i];
}
}
// 输出当前分析栈情况,输入字符串,所用产生式或匹配
" "+count);
String countToString = (count);
intfarWay = 14 - ();
String inputChar = (0, 1); quals(Vt[i])) { quals(inputChar)) {
if(fenxi[count1].equals("#")&&()==1) { ength());
}else{ quals(Vn[i])) {
count3= i;
break;
}
}
if(P[count3][count2] !="error") {// 栈顶的非终结符与输入的终结符存在产生式时
String p =P[count3][count2];
String s1 = (2, ());// 获取对应的产生式
if("ε")) {// 产生式推出“ε”时
String fenxizhan ="";
if(i < k)
count1++;
// "count1=" + count1);
}
// " "+count+" "+fenxizhan+"
// "+inputString +" "+P[count3][count2]);
相关主题