实验三-语义分析-实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}
}
四、实习总结
通过本次语义分析的总结,我加深对语法制时翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法,实习过程中采用递归下降语法制导翻译法对算术表达式、赋值语句、条件语句、循环语句进行语义分析生成四元式序列。
这次实习过程中虽然遇到了一些困难,但是通过和老师还有同学的讨论与交流问题都一一解决了,总之这次实习获益匪浅。