展开全部
我也做过这个作业
package source;
import java.util.LinkedList;
public class LexicalAnalysis
{
//私有变量声明
private LinkedList optr = new LinkedList();
private String exp;
//词法分析
public LinkedList lexical_analysis(String exp)
{
char ch = '\0'; //当前文件指针内容
int index = 0; //文件指针
StringBuffer strToken = new StringBuffer("");
//扫描处理62616964757a686964616fe58685e5aeb931333361323566字符串
while(true)
{
ch = exp.charAt(index);
index++;
//标识符(字母开头,数字或字符组成)
if(Character.isLetter(ch))
{
while(Character.isLetter(ch) || Character.isDigit(ch))
{
strToken.append(ch);
ch = exp.charAt(index);
index++;
}
index--;
String str = strToken.toString();
if(str.equals("if"))
optr.add(new Word(str, 13));
else if(str.equals("else"))
optr.add(new Word(str, 14));
else if(str.equals("then"))
optr.add(new Word(str, 15));
else
optr.add(new Word(str, 26));
}
//数字
else if(Character.isDigit(ch))
{
while(Character.isDigit(ch))
{
strToken.append(ch);
ch = exp.charAt(index);
index++;
}
index--;
optr.add(new Word(strToken.toString(), 26));
}
//加号或自加
else if(ch == '+')
{
ch = exp.charAt(index);
index++;
if(ch == '+')
optr.add(new Word("++", 21));
else if(ch == '=')
optr.add(new Word("+=", 16));
else
{
index--;
optr.add(new Word("+", 19));
}
}
//加号或自加
else if(ch == '-')
{
ch = exp.charAt(index);
index++;
if(ch == '-')
optr.add(new Word("--", 21));
else if(ch == '=')
optr.add(new Word("-=", 16));
else
{
index--;
optr.add(new Word("-", 19));
}
}
//乘法或乘幂
else if(ch == '*')
{
ch = exp.charAt(index);
index++;
if(ch == '*')
optr.add(new Word("**", 20));
else if(ch == '=')
optr.add(new Word("*=", 16));
else
{
index--;
optr.add(new Word("*", 20));
}
}
//除法或注释
else if(ch == '/')
{
ch = exp.charAt(index);
index++;
//多行注释
if(ch == '*')
{
while(true)
{
ch = exp.charAt(index);
index++;
if(ch == '*')
{
ch = exp.charAt(index);
index++;
if(ch == '/') break;
else if(ch == '\n')
{
exp = Input.newLine();
index = 0;
ch = exp.charAt(index);
index++;
}
else index--;
}
else if(ch == '#')
{
int tIndex = index - 1;
if(exp.length() > tIndex+9)
{
String end = exp.substring(tIndex, tIndex+9);
if(end.equals("#?e_N_d?#")) break;
}
else
{
System.out.println("非法符号\'#\'后的语句忽略!");
exp = Input.newLine();
index = 0;
break;
}
}
else if(ch == '\n')
{
exp = Input.newLine();
index = 0;
}
}
}
//单行注释
else if(ch == '/')
break;
else if(ch == '=')
optr.add(new Word("/=", 16));
else
{
index--;
optr.add(new Word("/", 20));
}
}
//大于或大于等于或右移
else if(ch == '>')
{
ch = exp.charAt(index);
index++;
if(ch == '=')
optr.add(new Word(">=", 18));
else if(ch == '>')
optr.add(new Word(">>", 20));
else
{
index--;
optr.add(new Word(">", 18));
}
}
//小于或小于等于或左移
else if(ch == '
{
ch = exp.charAt(index);
index++;
if(ch == '=')
optr.add(new Word("<=", 18));
else if(ch == '
optr.add(new Word("<
else
{
index--;
optr.add(new Word("
}
}
//赋值或等于
else if(ch == '=')
{
ch = exp.charAt(index);
index++;
if(ch == '=')
optr.add(new Word("==", 18));
else
{
index--;
optr.add(new Word("=", 16));
}
}
//或运算按位或
else if(ch == '|')
{
ch = exp.charAt(index);
index++;
if(ch == '|')
optr.add(new Word("||", 17));
else
{
index--;
optr.add(new Word("|", 20));
}
}
//与运算
else if(ch == '&')
{
ch = exp.charAt(index);
index++;
if(ch == '&')
optr.add(new Word("&&", 17));
else
{
index--;
optr.add(new Word("&", 20));
}
}
//非运算或不等于
else if(ch == '!')
{
ch = exp.charAt(index);
index++;
if(ch == '=')
optr.add(new Word("!=", 18));
else
{
index--;
optr.add(new Word("!", 21));
}
}
//按位亦或
else if(ch == '^')
optr.add(new Word("^", 20));
//取模运算
else if(ch == '%')
optr.add(new Word("%", 20));
//左括号
else if(ch == '(')
optr.add(new Word("(", 22));
//右括号
else if(ch == ')')
optr.add(new Word(")", 23));
//左大括号
else if(ch == '{')
optr.add(new Word("{", 24));
//右大括号
else if(ch == '}')
optr.add(new Word("}", 25));
//结束扫描标志为:#?e_N_d?#
else if(ch == '\n')
{
break;
}
else if(ch == '#')
{
int tIndex = index - 1;
if(exp.length() > tIndex+9)
{
String end = exp.substring(tIndex, tIndex+9);
if(end.equals("#?e_N_d?#"))
{
optr.add(new Word("#", 27));
break;
}
}
else
{
System.out.println("非法符号\'#\'后的语句忽略!");
optr.add(new Word("#", 27));
break;
}
}
//清空扫描串
strToken.setLength(0);
}
return optr;
}
}