编译原理第二次上机-词法分析器
1.环境:
MAC 11.0 JDK1.8 Idea2019.2
2.代码实现(Java)
import java.io.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static Set<String> ReserveWord = new HashSet<>();
public static Set<Character> JiefuTable = new HashSet<>();
public static Set<String> IDentifierTable = new HashSet<>();
public static Set<String> DigitBTable = new HashSet<>();
static {
String[] strs = {
"auto", "break", "case", "char", "const", "continue",
"default", "do", "double", "else", "enum", "extern",
"float", "for", "goto", "if", "int", "long",
"register", "return", "short", "signed", "sizeof", "static",
"struct", "switch", "typedef", "union", "unsigned", "void",
"volatile", "while"
};
Character[] Jiefu = {
';', '(', ')', '^', ',', '#', '%', '[', ']', '{', '}', '.'
};
ReserveWord.addAll(Arrays.asList(strs));
JiefuTable.addAll(Arrays.asList(Jiefu));
}
public static boolean Isletter(char x) { return (x >= 'a' && x <= 'z')||(x >= 'A' && x <= 'Z'); }
public static boolean IsDigit(char x) { return x >= '0' && x <= '9'; }
public static boolean IsJiefu(char x)
{
return JiefuTable.contains(x);
}
public static boolean IsSuanshuyunsuanfu(char x)
{
return x == '+' || x == '-' || x == '*';
}
public static boolean IsGuanxiyunsuanfu(char x) { return x == '=' || x == '<' || x == '>'; }
public static void read_write_File () throws IOException {
FileReader reader = new FileReader("in.txt");
BufferedReader bReader = new BufferedReader(reader);
FileWriter writer = new FileWriter("out.txt");
BufferedWriter bWriter = new BufferedWriter(writer);
String content= "";
boolean flag = false;
while((content = bReader.readLine()) != null) {
int count = 0;
while (count < content.length()) {
if (content.charAt(count) == ' ') {
count++;
}
else if (Isletter(content.charAt(count)) || content.charAt(count) == '_') {
String str = "";
str += content.charAt(count++);
while (count < content.length() && (Isletter(content.charAt(count)) || IsDigit(content.charAt(count)) || content.charAt(count)=='_')) {
str += content.charAt(count++);
}
if(ReserveWord.contains(str))
{
System.out.println("<\t"+str+"\t,\t"+"0(保留字)"+"\t>");
bWriter.write("(" + "0" + "," + str + ")" + "\r\n");
continue;
}
IDentifierTable.add(str);
System.out.println("<\t"+str+"\t,\t"+"1(标识符)"+"\t>");
bWriter.write("(" + "1" + "," + str + ")" + "\r\n");
}
else if(IsSuanshuyunsuanfu(content.charAt(count))) {
String str = "";
str += content.charAt(count++);
System.out.println("<\t"+str+"\t,\t"+"2(算数运算符)"+"\t>");
bWriter.write("(" + "2" + "," + str + ")" + "\r\n");
}
else if(IsDigit(content.charAt(count))) {
String str = "";
str += content.charAt(count++);
while(count < content.length() && IsDigit(content.charAt(count))) {
str += content.charAt(count++);
}
DigitBTable.add(str);
System.out.println("<\t"+str+"\t,\t"+"3(数字)"+"\t>");
bWriter.write("(" + "3" + "," + str + ")" + "\r\n");
}
else if(IsJiefu(content.charAt(count))) {
String str = "";
str += content.charAt(count);
System.out.println("<\t"+str+"\t,\t"+"4(界符)"+"\t>");
bWriter.write("(" + "4" + "," + str + ")" + "\r\n");
count++;
}
else if(IsGuanxiyunsuanfu(content.charAt(count))) {
String str = "";
if (content.charAt(count) == '<') {
str += content.charAt(count);
count++;
if(content.charAt(count)=='>' || content.charAt(count)=='=')
{
str += content.charAt(count);
count++;
}
}
else {
str += content.charAt(count);
count++;
if(content.charAt(count)=='=')
{
str += content.charAt(count++);
}
}
System.out.println("<\t"+str+"\t,\t"+"5(关系运算符)"+"\t>");
bWriter.write("(" + "5" + "," + str + ")" + "\r\n");
}
}
}
reader.close();
bReader.close();
bWriter.close();
writer.close();
}
public static void main(String[] args) throws IOException {
read_write_File();
}
}
3.运行示意图
4.源码在Gitee和Github上自取
Github
Gitee