package 实验1;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*;
public class Lexical_analysis {
Map<String, Integer> map;//符号及其对应种别编码
Lexical_analysis(){
map=new HashMap<String, Integer>();
}
public void init() {//初始化Key和Value
map.put("if",0);
map.put("then",1);
map.put("else",2);
map.put("while", 3);
map.put("begin", 4);
map.put("do",5);
map.put("end", 6);
map.put("赋值语句",7);
map.put(";",8);
map.put("布尔表达式",9);
map.put("#",10);
map.put("语句",12);
map.put("^",18);
map.put("∨",19);
map.put("+",34);
map.put("*",36);
map.put(":=",38);
map.put("and",39);
map.put("or",40);
map.put("not",41);
map.put("关系运算符",42);
//六种关系运算符处理
map.put("<",42);
map.put(">",42);
map.put(">=",42);
map.put("<=",42);
map.put("=",42);
map.put("<>",42);
map.put("(",48);
map.put(")",49);
}
public String replaceBlank(String str) {//去除空格,缩进等空白符号,初始测验使用方法
String dest = "";
if (str!=null) {
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(str);
dest = m.replaceAll("");
}
return dest;
}
//Character.isLetter(char); 判断字符是否为字母
//Character.isDigit(char); 判断字符是否为数字
public String recogize(String sentence) {
StringBuffer buffer = new StringBuffer();
StringBuffer res=new StringBuffer();
System.out.print(sentence+'\t');
String arrays[]=sentence.split(" ");//以空格进行分割
for(int j=0;j<arrays.length;j++) {
for(int i=0;i<arrays[j].length();i++) {
char c=arrays[j].charAt(i);
if(Character.isLetter(c)) {//如果开头是字母,那么该字符串可能是关键字或者变量
while((Character.isLetterOrDigit(c)||c=='_')) {//获取一整块字符,再进行是关键字还是变量的判断
buffer.append(c);
i++;
if(i<arrays[j].length())
c=arrays[j].charAt(i);
else break;
}
i--;//回退一格
if(map.containsKey(buffer.toString())) {//判断是否为关键词
res.append("<"+map.get(buffer.toString())+","+buffer.toString()+">");
System.out.print("<"+map.get(buffer.toString())+","+buffer.toString()+">\t");
}
else {
res.append("<56,变量>");
System.out.print("<56,变量>");
}
buffer.delete(0, buffer.length());
}
else if(Character.isDigit(c)) {//如果开头是数字的话,只可能是数值
while(Character.isDigit(c)) {//获取完整数值
buffer.append(c);
i++;
if(i<arrays[j].length())
c=arrays[j].charAt(i);
else break;
}
i--;
String binary=Integer.toBinaryString(Integer.parseInt(buffer.toString()));//将数字转化为二进制字符
res.append("<57,"+binary+">");
System.out.print("<57,"+binary+">\t");
buffer.delete(0, buffer.length());
}
else if(c==' '){
continue;
}
else {//如果开头是符号的话,只可能是标识符或者运算符等情况
while(!Character.isLetterOrDigit(c)) {
buffer.append(c);
i++;
if(i<arrays[j].length())
c=arrays[j].charAt(i);
else break;
}
i--;
if(map.containsKey(buffer.toString())) {
if(map.get(buffer.toString())==42) {//判断是否为关系运算符
res.append("<"+map.get(buffer.toString())+","+"关系运算符"+">");
System.out.print("<"+map.get(buffer.toString())+","+"关系运算符"+">\t");
}
else {
res.append("<"+map.get(buffer.toString())+","+buffer.toString()+">");
System.out.print("<"+map.get(buffer.toString())+","+buffer.toString()+">\t");
}
}
buffer.delete(0, buffer.length());
}
}
}
System.out.print(res.toString());
return res.toString();
}
}
评论0