资源简介
通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。
采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。
代码片段和文件信息
package com;
public class Analyzer {
private String input =““;//输入缓冲
private String token =““;//单词缓冲
private int p_input = 0;//输入缓冲指针
//private int p_token = 0;//单词缓冲指针
private char ch = ‘ ‘;
private String[] keyWords = {“begin““if““then““while““do““end““int““String““boolean““class“};
public Analyzer(){
p_input = 0;
}
//外部接口
public void setInput(String input) {
this.input = input;
p_input = 0;//每一行数据进来,这个下标要置0
}
//从输入缓冲区读取一个字符到ch中
public char getCh(){
ch = input.charAt(p_input);
p_input++;
return ch;
}
//去掉空白字符
public char getNoBlankChar(){
while(ch ==‘ ‘ || ch == 10){
ch = input.charAt(p_input);
p_input++;
}
return ch;
}
//判断该字符是否是字母
private boolean isLetter(char ch){
if(ch >=‘a‘ && ch <= ‘z‘ || ch >=‘A‘ && ch <= ‘Z‘){
return true;
}else
return false;
}
//判断该字符是否是数字
private boolean isNumber(char ch){
if(ch >=‘0‘ && ch <= ‘9‘ ){
return true;
}else
return false;
}
//拼接单词
void concat(){
String ch_String = String.valueOf(ch);//先转换成String类型才能拼接
//System.out.println(“ch_String : “ + ch_String );
//token.concat(ch_String);
token = token + ch_String;
//System.out.println(“token : “ + token );
}
//回退一个字符
void retrace(){
p_input --;
}
//检索关键字,返回关键字的种别码(即数组的下标)
int reverse(){
for(int i = 0 ; i < keyWords.length; i++){
if(keyWords[i].equals(token)){
return i+1;//返回关键字的下标
}
}
return 10;//不是关键字则返回10
}
//判断该字符是否是空格字符
private boolean isBlankChar(char ch){
if(ch == ‘ ‘){
return true;
}else{
return false;
}
}
//判断该字符串是否都是数字
private boolean isNumberString(String token){
for(int i = 0 ; i < token.length() ; i++){
if(!isNumber(token.charAt(i))){//只要有一个字符不是数字,即返回false
return false;
}
}
return true;
}
//词法扫描
public WORD scanner(){
//System.out.println(“执行Scanner()“);
WORD myWord = new WORD();
myWord.setTypeNum(10);
myWord.setWord(““);
//p_token = 0;
token =““;
getCh();//得到第一个字符
getNoBlankChar();//去掉空白字符串的情况确保得到的是有效字符
//如果第一个字符是字母的情况
if(isLetter(ch)){
//while(isLetter(ch) || isNumber(ch)){//如果当前字符是数字或者字母
while(isLetter(ch) || isNumber(ch)){//如果当前字符是数字或者字母
concat();//将当前字符和之前的字符拼接起来
getCh();//继续读取下一个字符
}
retrace();//回退一个字符(因为多读了一个字符)
myWord.setTypeNum(reverse());
myWord.setWord(token);
return myWord;
}
else if(isNumber(ch)){//第一个字符是数字
//while(isNumber(ch)){
while(isLetter(ch) || isNumber(ch)){//如果当前字符是数字或者字母
concat();
getCh();
}
retrace();//回退一个字符(因为多读了一个字符)
if(isNumberString(token)){//如果该单词都是数字字符
myWord.setTypeNum(11);//数字的种别码是11
}else{
myWord.setTypeNum(600);//错误单词的种别码是600
}
myWord.setWord(token);
return myWord;
}
else switch(ch){
case ‘=‘: getCh();
if(ch == ‘=‘){
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 299 2017-12-16 09:37 语义分析实验\SemanticAnalyze\.classpath
文件 391 2017-12-16 09:32 语义分析实验\SemanticAnalyze\.project
文件 598 2017-12-16 09:37 语义分析实验\SemanticAnalyze\.settings\org.eclipse.jdt.core.prefs
文件 4115 2017-12-16 15:53 语义分析实验\SemanticAnalyze\bin\com\Analyzer.class
文件 1410 2017-12-16 09:37 语义分析实验\SemanticAnalyze\bin\com\FileInput.class
文件 3396 2017-12-16 16:40 语义分析实验\SemanticAnalyze\bin\com\LRparse.class
文件 1398 2017-12-16 09:37 语义分析实验\SemanticAnalyze\bin\com\Main.class
文件 703 2017-12-16 09:37 语义分析实验\SemanticAnalyze\bin\com\WORD.class
文件 58 2017-12-16 16:29 语义分析实验\SemanticAnalyze\data\testData.txt
文件 7188 2017-12-16 15:53 语义分析实验\SemanticAnalyze\src\com\Analyzer.java
文件 856 2017-12-16 09:35 语义分析实验\SemanticAnalyze\src\com\FileInput.java
文件 3353 2017-12-16 16:40 语义分析实验\SemanticAnalyze\src\com\LRparse.java
文件 1125 2017-12-16 09:36 语义分析实验\SemanticAnalyze\src\com\Main.java
文件 345 2017-12-16 09:36 语义分析实验\SemanticAnalyze\src\com\WORD.java
文件 82818 2017-12-16 16:30 语义分析实验\语义分析实验.docx
目录 0 2017-12-16 16:41 语义分析实验\SemanticAnalyze\bin\com
目录 0 2017-12-16 16:41 语义分析实验\SemanticAnalyze\src\com
目录 0 2017-12-16 16:41 语义分析实验\SemanticAnalyze\.settings
目录 0 2017-12-16 16:41 语义分析实验\SemanticAnalyze\bin
目录 0 2017-12-16 16:41 语义分析实验\SemanticAnalyze\data
目录 0 2017-12-16 16:41 语义分析实验\SemanticAnalyze\src
目录 0 2017-12-16 16:41 语义分析实验\SemanticAnalyze
目录 0 2017-12-16 16:42 语义分析实验
----------- --------- ---------- ----- ----
108053 23
评论
共有 条评论