/*
实验内容:词法分析器
将一句语句拆分为数字,标识符,关键字,符号
*/
package lab1;
import java.util.Scanner;
class Analysis {
private static String s;
private int Len = 0;
private String Key[] = {"if", "end", "then", "begin"};//关键字集合
private String Sign[] = {" ", "+", "-", "*", "/", ":", "<", ">", "=", "(", ")", "{", "}", "[", "]"};//符号集合
Analysis(String t) {
s = t;
}
private int IsNum() {//判断是否是数字并返回数字的长度
int k = 0;
if (s.charAt(Len) >= '0' && s.charAt(Len) <= '9') {
k++;
for (int i = 1; i < 20; i++) {
if (s.charAt(Len + i) >= '0' && s.charAt(Len + i) <= '9') {
k++;
} else if (s.charAt(Len + i) == '.') {//有可能是小数,所以把.也算进去
k++;
} else {
break;
}
}
}
return k;
}
private int IsChar() {//判断是否是标识符或者是关键字并返回长度
int k = 0;
if (s.charAt(Len) >= 'a' && s.charAt(Len) <= 'z') {//首个符号是字母
k++;
for (int i = 1; i < 25; i++) {
if (s.charAt(Len + i) >= 'a' && s.charAt(Len + i) <= 'z') {
k++;
} else if (s.charAt(Len + i) >= '0' && s.charAt(Len + i) <= '9') {//字母后面可能是数字,例如ex0
k++;
} else {
break;
}
}
}
return k;
}
private int IsSign() {//判断是否是符号
int k = 0;
if (IsChar() == 0 && IsNum() == 0) {
k++;
}
return k;
}
private void OperatorSign(int k) {//判断运算符
for (int i = 0; i < Sign.length; i++) {
if (Sign[i].equals(s.substring(Len, (Len + Sign[i].length())))) {
System.out.println("Other Symbol:" + Sign[i]);
Len = Len + Sign[i].length();
break;
}
}
}
private void Num(int n) {//判断数字
int k = 0;
int j = 0;
if (n != 0) {
for (int i = 0; i < n; i++) {
if (s.charAt(Len + i) == '.') {
k++;
j = n - i - 1;
}
}//判断是否是小数
if (k == 0) {
int num = Integer.parseInt(s.substring(Len, Len + n));
System.out.println("interger:" + num);
Len = Len + n;
} else if (k == 1) {
if (j <= 8) {
float num = Float.parseFloat(s.substring(Len, Len + n));
System.out.println("float:" + num);
Len = Len + n;
} else {
double num = Double.parseDouble(s.substring(Len, Len + n));
System.out.println("double:" + num);
Len = Len + n;
}
}
}
}
private void Word(int c) {
int k = 0;
if (c != 0) {
for (int i = 0; i < Key.length; i++) {
if (c == Key[i].length()) {
if (Key[i].equals(s.substring(Len, Len + Key[i].length()))) {
System.out.println("Word:" + Key[i] + ",length is:" + Key[i].length());
Len = Len + Key[i].length();
k++;
break;
}
}
}//关键字搜索结束,k==1说明是关键字,k==0说明是标识符
if (k == 0) {
System.out.println("Word:" + s.substring(Len, Len + c) + ",length is:" + c);
Len = Len + c;
}
}
}
void Start() {
while (!";".equals(s.substring(Len))) {//以;结尾
int n = IsNum();
Num(n);
int c = IsChar();
Word(c);
int m = IsSign();
OperatorSign(m);
}
System.out.println("Other Symbol:;");
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//创建输入对象
String s = null;
System.out.print("Input Sentence:");//获取用户输入的字符串
s = sc.nextLine();
/*String s = "if x0<23.5 then {b=3};";*/
Analysis a = new Analysis(s);
a.Start();
}
}
11-13
04-19