📄 worder.java
字号:
public class Worder
{
//代码和扫描位置
String code;
int current;
//关键字表
String[] keywords=new String[13];
public Worder()
{
init_keywords(); //初始化关键字表
}
public Worder(String code)
{
init_keywords();
this.code=code;
this.current=0;
}
void init_keywords()
{
keywords[0]="const";
keywords[1]="var";
keywords[2]="procedure";
keywords[3]="if";
keywords[4]="then";
keywords[5]="while";
keywords[6]="do";
keywords[7]="begin";
keywords[8]="end";
keywords[9]="read";
keywords[10]="write";
keywords[11]="call";
keywords[12]="ood";
}
public void setText(String code)
{
this.code=code;
}
///////////////////实际干活的词法分析代码/////////////////////
WordInfo next_word()
{
int temp=current;
WordInfo w=this.get_a_word();
this.current=temp;
return w;
}
WordInfo get_a_word()
{
Glb.word_start=current;
char ch; //当前分析到的字符
while(true)
{
if(current==code.length())
{
Glb.word_err.name="已经没有可供分析的代码";
return Glb.word_err;
}
ch=code.charAt(current);
if(is_a_bound_sign(ch))
{
current++;
continue;
}
if(is_a_letter(ch))
{
return build_a_word();
}
if(is_a_num(ch))
{
return build_a_num();
}
if(is_a_sign(ch))
return(build_a_sign());
}
}
WordInfo build_a_word()
{
WordInfo w_info=new WordInfo();
String word_token="";
int length=0;
for(;;)
{
if(current==code.length())
break;
char c=code.charAt(current); //取得当前字符
if(!is_a_letter(c)&&!is_a_num(c)) //遇到界符或其他符号,单词识别结束
break;
word_token+=c; //合法字符,添加到word_token的末尾
current++; //指针右移
length++;
}
//如果读到的是一个关键字
if(is_a_keyword(word_token))
{
w_info.name=word_token;
w_info.addr=-1;
w_info.lever=-1;
w_info.type=WordType.KEYWORD;
w_info.val=-1;
Glb.word_end=current;
return w_info;
}
else
{
//读到的是标志符
if(length<=10)
{
w_info.type=WordType.ID;
w_info.name=word_token;
Glb.word_end=current;
return w_info;
}
}
//标志符超长
{
Glb.word_err.name="发现超长的标志符";
Glb.word_end=current;
return Glb.word_err;
}
}
WordInfo build_a_num()
{
WordInfo w_info=new WordInfo();
String word_token="";
boolean correct=true;
for(;;)
{
if(current==code.length())
break;
char c=code.charAt(current); //取得当前字符
//必须是数字,不是数字则数字识别结束
if(!is_a_num(c))
{
if(is_a_letter(c))
correct=false;
else
break;
}
//不错,是一个数字
word_token+=c;
current++;
}
w_info.name=word_token;
w_info.type=WordType.NUM;
if(correct)
w_info.val=Integer.parseInt(word_token);
else
{
Glb.word_err.name="非法标志符:"+word_token;
return Glb.word_err;
}
Glb.word_end=current;
return w_info;
}
WordInfo build_a_sign()
{
WordInfo w_info=new WordInfo();
String word_token="";
char second=' ';
char first=code.charAt(current);
if(current!=code.length()-1)
second=code.charAt(current+1);
switch(first)
{
case '+':
word_token="+";
current++;
break;
case '-':
word_token="-";
current++;
break;
case '*':
word_token="*";
current++;
break;
case '/':
word_token="/";
current++;
break;
case '>':
if(second=='=')
{
word_token=">=";
current+=2;
}
else
{
word_token=">";
current++;
}
break;
case '<':
if(second=='=')
{
word_token="<=";
current+=2;
}
else
{
word_token="<";
current++;
}
break;
case ':':
if(second=='=')
{
word_token=":=";
current+=2;
}
else
{
Glb.word_err.name="发现不能识别的运算符";
return Glb.word_err;
}
break;
case '(':
word_token="(";
current++;
break;
case ')':
word_token=")";
current++;
break;
case '=':
word_token="=";
current++;
break;
case ',':
word_token=",";
current++;
break;
case '#':
word_token="#";
current++;
break;
case ';':
word_token=";";
current++;
break;
default:
//错误!!!!不能识别的符号
{
Glb.word_err.name="发现不能识别的运算符";
Glb.word_end=current;
return Glb.word_err;
}
;
}
w_info.name=word_token;
w_info.type=WordType.SIGN;
Glb.word_end=current;
return w_info;
}
boolean is_a_bound_sign(char c)
{
if(c=='\r')
Glb.err_line++;
if(c==32||c==13||c==10||c==9)
return true;
else
return false;
}
boolean is_a_num(char c)
{
if(c>='0'&&c<='9')
return true;
else
return false;
}
boolean is_a_letter(char c)
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z'||c=='_')
return true;
else
return false;
}
boolean is_a_sign(char c)
{
return true;
}
public boolean is_a_keyword(String word)
{
//!!!!!!take care of the length!!!!!!!!!!!
int size=keywords.length;
for(int i=0;i<size;i++)
{
//if(keywords[i].equals(word));
if(word.equals(keywords[i]))
return true;
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -