天天看点

0917 词法分析程序(java版)

1.运行结果:

0917 词法分析程序(java版)

2.源代码:

package 词法分析;

import java.util.Scanner;

public class fenxi {public static void main(String[] args) {   //主函数

Scanner scanner=new Scanner(System.in);

int k=0,i=0;

String[] word=new String[20];

word[0]="";

System.out.println("请输入一个程序(以'#'结束):");

String sent=scanner.nextLine();

// System.out.println(sent);

judgeType(k, i, word, sent);//判断分析组成类型

justOne(word);//只有一个英文字母的特殊情况统一为"l(l|d)*"

outPut(word);

}

private static void justOne(String[] word) {//判断是否有单个字母的特殊情况

int i = 0,k = 0;

while(word[i]!= null){

if(word[i]!=""){

if(Character.isLetter(word[i].charAt(0))&&word[i].length()==1){

word[i]="l(l|d)*";

k++;

if(k>1)

word[i]="NULL";//不要重复的

}

}

i++;

}

}

private static void outPut(String[] word) { //对应种别码,并输出列表

int i = 0;

System.out.println("单词符号\t\t\t"+"种别码");

while(word[i]!=null){

switch(word[i]){

case "begin":

System.out.println(word[i]+"\t\t\t"+"1");

break;

case "if":

System.out.println(word[i]+"\t\t\t"+"2");

case "then":

System.out.println(word[i]+"\t\t\t"+"3");

case "while":

System.out.println(word[i]+"\t\t\t"+"4");

case "do":

System.out.println(word[i]+"\t\t\t"+"5");

case "end":

System.out.println(word[i]+"\t\t\t"+"6");

case "l(l|d)*":

System.out.println(word[i]+"\t\t\t"+"7");

case "dd*":

System.out.println(word[i]+"\t\t\t"+"8");

case "+":

System.out.println(word[i]+"\t\t\t"+"9");

case "-":

System.out.println(word[i]+"\t\t\t"+"10");

case "*":

System.out.println(word[i]+"\t\t\t"+"11");

case "/":

System.out.println(word[i]+"\t\t\t"+"12");

case ":":

System.out.println(word[i]+"\t\t\t"+"13");

case ":=":

System.out.println(word[i]+"\t\t\t"+"14");

case "<":

System.out.println(word[i]+"\t\t\t"+"15");

case "<=":

System.out.println(word[i]+"\t\t\t"+"16");

case "<>":

System.out.println(word[i]+"\t\t\t"+"17");

case ">":

System.out.println(word[i]+"\t\t\t"+"18");

case ">=":

System.out.println(word[i]+"\t\t\t"+"19");

case "=":

System.out.println(word[i]+"\t\t\t"+"20");

case ";":

System.out.println(word[i]+"\t\t\t"+"21");

case "(":

System.out.println(word[i]+"\t\t\t"+"22");

case ")":

System.out.println(word[i]+"\t\t\t"+"23");

case "#":

System.out.println(word[i]+"\t\t\t"+"24");

case "for":

System.out.println(word[i]+"\t\t\t"+"25");

}

private static void judgeType(int k, int i, String[] word, String sent) {

while(sent.charAt(k)!='#'){

word[i]="";

while(Character.isLetter(sent.charAt(k))){//是否为字母

word[i]=word[i]+sent.charAt(k);

//是否为连续的运算符

while((sent.charAt(k)=='<'||sent.charAt(k)=='>'||sent.charAt(k)=='='||sent.charAt(k)==':')&&(sent.charAt(k+1)=='<'||sent.charAt(k+1)=='>'||sent.charAt(k+1)=='='||sent.charAt(k+1)==':')){

word[i]=""+sent.charAt(k)+sent.charAt(k+1);

i++;

k=k+2;

word[i]="";

//是否为单个符号或运算符

while(sent.charAt(k)=='('||sent.charAt(k)==')'||sent.charAt(k)==';'||sent.charAt(k)==':'||sent.charAt(k)=='+'||sent.charAt(k)=='-'||sent.charAt(k)=='*'||sent.charAt(k)=='/'||sent.charAt(k)=='<'||sent.charAt(k)=='>'||sent.charAt(k)=='='){

word[i]=""+sent.charAt(k);

while(sent.charAt(k)==' '){//是否为空格

// System.out.println("space");

word[i]="NULL";

while(Character.isDigit(sent.charAt(k))){//是否为数字

word[i]="dd*";

word[i]=""+'#';

// System.out.println("跳出循环"+word[i]+i);