一个简单的词法分析器
词法分析(Lexical Analysis) 是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素。这个词法单元序列被输出到语法分析器进行语法分析。
有关原理的介绍参考http://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html
这里就不多说了。
下面直接代码,相关注释在代码中均已经给出,对字符串的处理完全按照自己的思路编写的。
其中读取的是E盘下的test.txt文本文档:
运行结果如下:
public class Word {
/**
*1~20号为关键字,用下标表示,i+1就是其机器码;21~40号为操作符,用下标表示,i+21就是其机器码;41~60号为分界符,
* 用下标表示,i+41就是其机器码;用户自定义的标识符,其机器码为51;常数的机器码为52;
*不可以识别的标识符,其机器码为0
**/
//关键字
private String keyword[]={"int","long","char","short","float","double",
"if","else","for","while","return","break","continue","switch","case",
"default","void","struct","static","do"};
//运算符
private String operator[]={"+","-","*","/","%","=",">","<","!",
"==","!=",">=","<=","++","--","&","&&","||","[","]"};
//分界符
private String delimiter[]={",",";","(",")","{","}","\‘","\"",":","#"};
//是否为数字
public boolean isDigit(String str){
char ch;
if(str==""){
return false;
}
for(int i=0;i<str.length();i++){
ch=str.charAt(i);
if(ch<‘0‘||ch>‘9‘){
return false;
}
}
return true;
}
//是否为字母或字符串
public boolean isLetter(String str){
char ch;
if(str==""){
return false;
}
for(int i=0;i<str.length();i++){
ch=str.charAt(i);
if(ch<‘A‘||ch>‘z‘||(ch>‘Z‘&&ch<‘a‘)){
return false;
}
}
return true;
}
//判断是否为运算符
public boolean isOperator(String str){
char ch;
char ch2;
//非运算符
if(str==""||str.length()==0||str.length()>2){
return false;
}
if(str.length()==1){
//一个元算符
for(int i=0;i<operator.length;i++){
if(str.equals(operator[i])){
return true;
}
}
return false;
}else if(str.length()==2){
//两个运算符
ch=str.charAt(0);
ch2=str.charAt(1);
if(ch2==‘=‘&&(ch==‘!‘||ch==‘>‘||ch==‘<‘||ch==‘=‘)){
return true;
}else if(ch==‘+‘&&ch2==‘+‘){
return true;
}else if(ch==‘-‘&&ch2==‘-‘){
return true;
}else if(ch==‘|‘&&ch2==‘|‘){
return true;
}else if(ch==‘&‘&&ch2==‘&‘){
return true;
}else{
return false;
}
}
return true;
}
//判断是否为标识符(此处标识符包含了关键字,下面获取机器码需要去掉关键字)
public boolean isIdentifier(String str){
if(str==""){
return false;
}else if(str.length()==1){
if(isLetter(str)||str=="_"){
return true;
}else{
return false;
}
}else{
char ch=str.charAt(0);
String str2=str.substring(1, str.length()-1);
String str3;
if((ch>‘a‘&&ch<‘z‘)||(ch>‘A‘&&ch<‘Z‘)||ch==‘_‘){
for(int i=0;i<str2.length();i++){
str3=str2.substring(i, i+1);
if(!(isDigit(str3)||isLetter(str3))){
return f