天天看點

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);