词法分析程序的设计与实现
词法分析程序(Lexical Analyzer)要求:
- 从左至右扫描构成源程序的字符流
- 识别出有词法意义的单词(Lexemes)
- 返回单词记录(单词类别,单词本身)
- 滤掉空格
- 跳过注释
- 发现词法错误
程序结构:
输入:字符流(什么输入方式,什么数据结构保存)
处理:
–遍历(什么遍历方式)
–词法规则
输出:单词流(什么输出形式)
–二元组
单词类别:
1.标识符(10)
2.无符号数(11)
3.保留字(一词一码)
4.运算符(一词一码)
5.界符(一词一码)
* @param list
* @return
*/
@SuppressWarnings("rawtypes")
public List<Map> GetStringAndSortNum(String[] list) {
char firstChar;//用于记录第一个首字符
String keyword="",sortNum="";//需要输出返回的关键字,种别码
String cType,word;//第一个首字符的类型
//mlist用于返回整个List判断完成后的含有的字符和种别码
List<Map> mList=new ArrayList<Map>();
for(int i=0;i<list.length;i++){
Map<String,String>map=new HashMap<String,String>();//m用于保存最后返回的已经判别成功的字和种别码
//word代表需要进行处理判断的字
word=list[i];
//判断word是不是空的串,因为有可能根据空格分割的串中有空的换行符或者空串,不进行处理
if(word==""||word==null||word.trim()=="")continue;
firstChar=word.charAt(0);
//获取这个字符的类型
cType=GetCharType(firstChar);
if(cType=="letter"){
if(firstChar=='w'||firstChar=='i'||firstChar=='b'||firstChar=='d'||firstChar=='e'||firstChar=='t'){
//获得keyword词
Map<String,String>m=new HashMap<String,String>();//m用于保存最后返回的已经判别成功的字和种别码
m=GetKeyWord(word);
//取出m的值,如果是关键字
if(m!=null){
keyword=m.get("keyword");
sortNum=m.get("sortNum");
}
//不是关键字,但是包含关键字的前一个字符串
else{
if(IsID(word)){
keyword=word;
sortNum=g.getSortNum("ID")+"";
}
else{
System.out.println("这个"+word+"不是合法的ID字符,所在的位置在:第"+(i+1)+"个单词");
}
}
}
else{//首字母为字符,但是需要进一步判断是不是合法的ID
if(IsID(word)){
keyword=word;
sortNum=g.getSortNum("ID")+"";
}
else{
System.out.println("这个"+word+"不是合法的ID字符,所在的位置在:第"+(i+1)+"个单词");
}
}
}
if(cType=="digit"){
if(IsNum(word)){
keyword=word;
sortNum=g.getSortNum("NUM")+"";
}
else{
System.out.println("这个"+word+"不是合法的NUM字符,所在的位置在:第"+(i+1)+"个单词");
}
}
if(cType=="opts"){
//获取这个word的长度,如果是一个进行单运算符的判断,如果是2进行多运算符的判断
int len=word.length();
if(len==1){
if(IsSingleOpt(word)){
keyword=word;
sortNum=g.getSortNum(word)+"";
}
else if(IsEndOpt(word)){
keyword=word;
sortNum=g.getSortNum(word)+"";
}
else{
System.out.println("这个"+word+"不是合法的NUM字符,所在的位置在:第"+(i+1)+"个单词");
}
}
else if(len==2){
if(IsDoubleOpt(word)){
keyword=word;
sortNum=g.getSortNum(word)+"";
}
else{
System.out.println("这个"+word+"不是合法的NUM字符,所在的位置在:第"+(i+1)+"个单词");
}
}
else{
System.out.println("这个"+word+"不是合法的NUM字符,所在的位置在:第"+(i+1)+"个单词");
}
}
if(keyword.equals("")||sortNum.equals("")||keyword==""||sortNum=="")
continue;
else{
map.put("keyword", keyword);
map.put("sortNum", sortNum);
mList.add(map);
keyword="";
sortNum="";
}
}
return mList;
}
参考链接:https://blog.csdn.net/wearge/article/details/78392233
浙公网安备 33010602011771号