实验三 语义分析 实习报告_实验三语义分析报告
实验三 语义分析 实习报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“实验三语义分析报告”。
实验三 语义分析
一、实习目的通过上机实习,加深对语法制时翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。
二、实习要求
采用递归下降语法制导翻译法对算术表达式、赋值语句、条件语句、循环语句进行语义分析生成四元式序列。
三、实习过程
实习代码;/** * JavaCC file */
options {
JDK_VERSION = “1.5”;
static=false;} PARSER_BEGIN(whileParse)package whileparse;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.ArrayList;public cla whileParse {
public int count=0;/*四元式标号*/
public static ArrayList sysList = new ArrayList();
public int ncount=0;/*临时变量下标*/
public static void main(String args[])throws ParseException {
FileInputStream fileStream;try {
fileStream = new FileInputStream(“data/test.c”);
whileParse parser = new whileParse(fileStream);
System.out.println(“Reading from standard input...”);
System.out.println(“Enter c programe only main()with only while();” :“);
try {
switch(parser.start()){
case 0:
System.out.println(”OK.“);
break;
case 1:
System.out.println(”Goodbye.“);
break;
default:
break;
}
for(int i = 0;i
System.out.println(sysList.get(i));
}
} catch(Exception e){
System.out.println(”NOK.“);
System.out.println(e.getMeage());
parser.ReInit(System.in);
} catch(Error e){
System.out.println(”Oops.“);
System.out.println(e.getMeage());
} } catch(FileNotFoundException e1){
e1.printStackTrace();}
} } PARSER_END(whileParse)
SKIP : {
” “ | ”r“ | ”t“ | ”n“ | }
TOKEN : /* OPERATORS */ { | | | }
TOKEN : {)+ > |
}
TOKEN: {
|
|
|
|
|
| | }
TOKEN: { ”> | | =“> | }
TOKEN: {
|
|
|
|
| }
int start(): {} {
Procedure(){ return 0;} |
{ return 1;} }
/*处理主程序*/ void Procedure():{} {
(Content())* }
void Content():{} { WhileStatement()|IfStatement()}
void WhileStatement(): {
Token node;
int j1;
int next;
Sys newsys;} {
{
next=count+1;
}
Condition()
{
count++;
j1=count;
newsys = new Sys(count+”“,”J“,”_“, ”_“, j1+”#“);
sysList.add(newsys);
}
((WhileStatement()|IfStatement())*)*
{
count++;
newsys = new Sys(count+”“,”J“,”_“, ”_“, next+”“);
sysList.add(newsys);
EditSys.huitian(sysList, j1+”#“, count+1+”“);
} }
void IfStatement(): {
Token node;
int j1;
int next;
Sys newsys;} {
{
next=count+1;
}
Condition()
{
count++;
j1=count;
newsys = new Sys(count+”“,”J“,”_“, ”_“, j1+”#“);
sysList.add(newsys);
}
((IfStatement()|WhileStatement())*)*
{
count++;
newsys = new Sys(count+”“,”J“,”_“, ”_“, next+”“);
sysList.add(newsys);
EditSys.huitian(sysList, j1+”#“, count+1+”“);
} }
String Expreion(): {
String first;
String middle;
String temp=”“;
Sys newsys;} {
first=Term()
{
temp=first;
}
(middle=Term(){
count++;
temp=”T“+ncount;
ncount++;
newsys = new Sys(count+”“,”+“,first,middle,temp);
sysList.add(newsys);
first = temp;
//first=Integer.parseInt(first)+Integer.parseInt(middle)+”“;
}
| middle=Term(){
count++;
temp=”T“+ncount;
ncount++;
newsys = new Sys(count+”“,”-“,first,middle,temp);
sysList.add(newsys);
first = temp;
//first=Integer.parseInt(first)-Integer.parseInt(middle)+”“;
})*
{
return temp;
//return first;
} }
String Term(): {
String first;
String middle;
String temp=”“;
Sys newsys;} {
first=unary()
{
temp=first;
}
((middle= unary()
{
count++;
temp=”T“+ncount;
ncount++;
newsys = new Sys(count+”“,”*“,first,middle,temp);
sysList.add(newsys);
first = temp;
//first=Integer.parseInt(first)*Integer.parseInt(middle)+”“;
}
| middle=unary()
{
count++;
temp=”T“+ncount;
ncount++;
newsys = new Sys(count+”“,”/“,first,middle,temp);
sysList.add(newsys);
first = temp;
//first=Integer.parseInt(first)/Integer.parseInt(middle)+”“;
}))*
{
return temp;
//return first;
} }
String unary(): { String str;} { // str= element(){return-Double.parseDouble(str)+”“;} str= element(){return str;} }
String element(): { String str;Token node;} {
node={return node.image;} | str=Expreion(){return str;} }
int Condition(): {
Token node;
int next;
String first;
String middle;
Sys newsys;} {
first=Expreion()(node=”
{
count++;
next=count+1;
newsys = new Sys(count+“”,“j
sysList.add(newsys);
}
| node=”>“ middle=Expreion()
{
count++;
next=count+1;
newsys = new Sys(count+”“,”j>“,first,middle,next+1+”“);
sysList.add(newsys);
}
| node=”>=“ middle=Expreion()
{
count++;
next=count+1;
newsys = new Sys(count+”“,”j>=“,first,middle,next+1+”“);
sysList.add(newsys);
}
| node=”
{
count++;
next=count+1;
newsys = new Sys(count+“”,“j
sysList.add(newsys);
})
{
return next;
} }
四、实习总结
通过本次语义分析的总结,我加深对语法制时翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法,实习过程中采用递归下降语法制导翻译法对算术表达式、赋值语句、条件语句、循环语句进行语义分析生成四元式序列。这次实习过程中虽然遇到了一些困难,但是通过和老师还有同学的讨论与交流问题都一一解决了,总之这次实习获益匪浅。