标签:mic ber buffered lin bsp rar red ash exe
词法分析程序(Lexical Analyzer)
要求:
- 从左至右扫描构成源程序的字符流
- 识别出有词法意义的单词(Lexemes)
- 返回单词记录(单词类别,单词本身)
- 滤掉空格
- 跳过注释
- 发现词法错误
程序结构:
输入:文本输入格式,String结构保存
处理:
–遍历:嵌套循环
–词法规则:·
输出:单词流
–二元组
单词类别:
1.标识符(12)
2.无符号数(13)
3.保留字(一词一码)
4.运算符(一词一码)
5.界符(一词一码)

实验文本Test.txt:
public class Test {
public static void main(String[] args) {
int i = 11;
int j = 22;
int k = 1 ^ 3;
System.out.println("i+j=" + (i + j));
if (i >= 10) {
System.out.println("词法分析器");
}
// 词法分析器
}
}
词法分析程序源代码:
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class work {
public static void main(String[] args) throws Exception {
//读取文本
FileReader fr = new FileReader("src//Test.java");
BufferedReader bf = new BufferedReader(fr);
String s1 = "";
String s2 = "";
while ((s1 = bf.readLine()) != null) {
if (!s1.startsWith("//") && !s1.endsWith("//")) {
s2 += s1;
}//消除注释
}
bf.close();
//运算符集合
ArrayList<String> list = new ArrayList();
list.add("+");
list.add("-");
list.add("*");
list.add("/");
list.add("%");
list.add(">");
list.add("<");
list.add("=");
list.add("^");
//种别码集合
Map<Integer,String > map=new HashMap<>();
map.put(1,"public");
map.put(2,"class");
map.put(3,"static");
map.put(4,"void");
map.put(5,"main");
map.put(6,"String");
map.put(7,"args");
map.put(8,"int");
map.put(9,"System");
map.put(10,"out");
map.put(11,"println");
map.put(14,"+");
map.put(15,"-");
map.put(16,"*");
map.put(17,"/");
map.put(18,"%");
map.put(19,">");
map.put(20,"<");
map.put(21,"=");
map.put(22,"==");
map.put(23,">=");
map.put(24,"<=");
map.put(25,"^");
map.put(26,"(");
map.put(27,")");
map.put(28,"{");
map.put(29,"}");
map.put(30,";");
System.out.println(s2);
//读取每个字符
char s3[] = s2.toCharArray();
for (int i = 0; i < s3.length; i++) {
//判断关键字与标识符
int news3 = (int) s3[i];
String word = "";
boolean flag1 = false;
while (((news3 >= 65) && (news3 <= 90)) || ((news3 >= 97) && (news3 <= 122))) {
word += s3[i];
i++;
news3 = (int) s3[i];
flag1 = true;
}
//判断数字
news3 = (int) s3[i];
String number = "";
boolean flag2 = false;
while (news3 >= 48 && news3 <= 57) {
number += s3[i];
i++;
news3 = (int) s3[i];
flag2 = true;
}
//判断运算符
String operator = "";
boolean flag3 = false;
if (list.contains("" + s3[i])) {
operator += s3[i];
i++;
flag3 = true;
if (list.contains("" + s3[i])) {
operator += s3[i];
i++;
}
}
//判断字符串常量
news3 = (int) s3[i];
boolean flag4 = false;
String zfc = "";
if (news3 == 34) {
flag4 = true;
zfc += s3[i];
i++;
news3 = (int) s3[i];
while (news3 != 34) {
zfc += s3[i];
i++;
news3 = (int) s3[i];
}
zfc += "\"";
}
//二元组输出
if (flag1 == true) {
for (int j = 1; j <=11 ; j++) {
if (word.equalsIgnoreCase(map.get(j))){
System.out.println("("+j+","+word+")");
break;
}else if (j==11){
System.out.println("(12,"+word+")");
}
}
}
if (flag2 == true) {
System.out.println("(13," + number + ")");
}
if (flag3 == true) {
for (int j = 14; j <=25 ; j++) {
if (operator.equalsIgnoreCase(map.get(j))){
System.out.println("("+j+","+operator+")");
}
}
}
if (flag4 == true) {
System.out.println("(13," + zfc + ")");
}
//跳过空格
if (news3 == 32) {
continue;
}
//输出界符
if (flag4 == false) {
for (int j = 26; j <=30 ; j++) {
if ((""+s3[i]).equalsIgnoreCase(map.get(j))){
System.out.println("("+j+","+map.get(j)+")");
}
}
}
}
}
}
输出结果:
(1,public)
(2,class)
(12,Test)
(28,{)
(1,public)
(3,static)
(4,void)
(5,main)
(26,()
(6,String)
(7,args)
(27,))
(28,{)
(8,int)
(12,i)
(21,=)
(13,11)
(30,;)
(8,int)
(12,j)
(21,=)
(13,22)
(30,;)
(8,int)
(12,k)
(21,=)
(13,1)
(25,^)
(13,3)
(30,;)
(9,System)
(10,out)
(11,println)
(26,()
(13,"i+j=")
(14,+)
(26,()
(12,i)
(14,+)
(12,j)
(27,))
(27,))
(30,;)
(12,if)
(26,()
(12,i)
(23,>=)
(13,10)
(27,))
(28,{)
(9,System)
(10,out)
(11,println)
(26,()
(13,"词法分析器")
(27,))
(30,;)
(29,})
(29,})
(29,})
结论:本程序能很好的进行词法分析,由于发现词法错误过程太复杂,本程序并没有完成此功能。
标签:mic ber buffered lin bsp rar red ash exe
原文地址:https://www.cnblogs.com/ccla/p/11650126.html