实验三-语义分析-实习报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三语义分析
一、实习目的
通过上机实习,加深对语法制时翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法.
二、实习要求
采用递归下降语法制导翻译法对算术表达式、赋值语句、条件语句、循环语句进行语义分析生成四元式序列。

三、实习过程
实习代码;
/**
*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 class whileParse {
public int count=0; /*四元式标号*/
public static ArrayList<Sys〉sysList = new ArrayList<Sys〉();
public int ncount=0;/*临时变量下标*/
public static void main(String args[]) throws ParseException {
FileInputStream fileStream;
t ry {
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〈sysList。

size(); i++){
System。

out。

println(sysList.get(i));

} catch (Exception e){
System。

out.println(”NOK.”);
System。

out。

println(e。

getMessage());
parser。

ReInit(System。

in);
}catch (Error e) {
System。

out.println("Oops.”);
System。

out。

println(e。

getMessage());

}catch (FileNotFoundException e1) {
e1.printStackTrace();
}

}
PARSER_END(whileParse)
SKIP :

” ”
|"\r"
| ”\t”
| "\n”
| <"/*"(~["*"])*”*”(~["/"](~["*"])*"*")*"/"> }
TOKEN :/*OPERATORS */
{
< PLUS: "+" >
| < MINUS:"—" 〉
| < MULTIPLY: "*" >
|< DIVIDE: "/” 〉

TOKEN :

〈CONSTANT:(〈DIGIT〉)+ > | < #DIGIT:["0” —”9”]〉

TOKEN:
{
〈MAIN:"main">
|<VOID:"void"〉
|<WHILE:"while"〉
|〈ASSIGN:"=”>
|〈FOR:"for”〉
|〈IF:”if">
| <ELSE:"else”〉
|<IF_ELSE:”if else”〉
}
TOKEN:

〈GREAT:”>”>
|<LOWER:"<”〉
|<GREATE:”〉="〉
| <LOWERW:"<="〉
}
TOKEN:

<LC:”("〉
| <RC:")"〉
|<LM:"[">
|<RM:"]”>
| <LB:"{"〉
| <RB:”}"〉
}
int start():{}

Procedure() <EOF〉{ return 0; }
| <EOF〉{ return 1;}
}
/*处理主程序*/
void Procedure():{}
{
〈VOID> 〈MAIN> 〈LC>〈RC〉〈LB>
(Content())*<RB〉
}
void Content():{}
{
W hileStatement()|IfStatement()

void WhileStatement():
{
Token node;
int j1;
int next;
Sys newsys;
}

〈WHILE〉〈LC〉
{
next=count+1;

Condition()<RC〉

count++;
j1=count;
newsys = new Sys(count+"","J",”_", "_”, j1+"#");
sysList.add(newsys);
}
(〈LB〉(WhileStatement()|IfStatement())*〈RB>)* {
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;


〈IF〉〈LC>
{
next=count+1;
}
Condition()<RC〉

count++;
j1=count;
newsys = new Sys(count+"”,”J","_”, ”_”, j1+"#”);
sysList.add(newsys);
}
(〈LB〉(IfStatement()|WhileStatement())*<RB>)*

count++;
newsys = new Sys(count+"”,"J","_",”_",next+””);
sysList。

add(newsys);
EditSys。

huitian(sysList,j1+”#", count+1+"”);


String Expression():
{
String first;
String middle;
String temp="";
Sys newsys;

{
first=Term()

temp=first;
}
(〈PLUS〉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)+”"; }
| 〈MINUS>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;
}

(<MULTIPLY〉middle= unary()

c ount++;
temp="T"+ncount;
ncount++;
newsys = new Sys(count+””,"*”,first,middle,temp);
sysList.add(newsys);
first = temp;
//first=Integer。

parseInt(first)*Integer。

parseInt(middle)+”";
}
| 〈DIVIDE〉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() :
{
S tring str;
}
{
// str= element(){return —Double.parseDouble(str)+"";}
str= element(){return str;}
}
String element() :
{
S tring str;
T oken node;


node=<CONSTANT>{return node.image;}
|〈LC〉str=Expression()<RC>{return str;}
}
int Condition():
{
Token node;
int next;
String first;
String middle;
Sys newsys;


first=Expression()(node=”〈” middle=Expression()

count++;
next=count+1;
newsys = new Sys(count+"",”j〈",first,middle,next+1+"");
sysList.add(newsys);
}
| node=”>” middle=Expression()
{
count++;
next=count+1;
newsys = new Sys(count+”",”j>”,first,middle,next+1+”");
sysList。

add(newsys);
}
|node=">=” middle=Expression()

count++;
next=count+1;
newsys = new Sys(count+”",”j〉=”,first,middle,next+1+”");
sysList。

add(newsys);
}
| node="<=" middle=Expression()

count++;
next=count+1;
newsys = new Sys(count+"",”j〈=",first,middle,next+1+"");
sysList。

add(newsys);
})
{
return next;

}
四、实习总结
通过本次语义分析的总结,我加深对语法制时翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法,实习过程中采用递归下降语法制导翻译法对算术表达式、赋值语句、条件语句、循环语句进行语义分析生成四元式序列。

这次实习过程中虽然遇到了一些困难,但是通过和老师还有同学的讨论与交流问题都一一解决了,总之这次实习获益匪浅。

相关文档
最新文档