簡體   English   中英

Java Simple Lexer程序

[英]Java Simple Lexer Program

我用Java創建了一個簡單的詞法分析器程序,該程序提示用戶輸入字符串並在該字符串中顯示詞素。 但是,當我輸入一個值時,如果提示中包括左括號和/或右括號,則在左括號或右括號之后會添加一個空字符,該字符將被程序標識為標識符。

另外,如果我在用戶提示的字符串中不包括左括號和右括號,則該字符串中的最后一個字符將不被視為詞素。

這是我的代碼:

import javax.swing.JOptionPane;

public class Append
{
  public static void main (String [] args)
  {
    String str = JOptionPane.showInputDialog("Enter string : ");
    char [] arr = str.toCharArray();

    JOptionPane.showMessageDialog(null,arr.length);

    determineLexemes(arr);

   }

  public static void determineLexemes(char [] arr)
  {
    int j = 0;

    String [] arrayString = new String [1000];

    String strTwo = "";

    System.out.println("Symbol Table");

    System.out.println("Lexeme\t\tToken");

    for(int i = 0; i < arr.length; i++)
    {

       if(arr[i] == '+')
            {
                System.out.println("+ \t\t ADD_OP");
            }

       if(arr[i] == '-')
            {
                System.out.println("- \t\t SUB_OP");
            }

       if(arr[i] == '*')
            {
                System.out.println("* \t\t MULT_OP");
            }

       if(arr[i] == '/')
            {
                System.out.println("/ \t\t DIV_OP");
            }

       if(arr[i] == '(')
            {
                System.out.println("( \t\t LEFT_PAREN");
            }

       if(arr[i] == ')')
            {
                System.out.println(") \t\t RIGHT_PAREN");
            }

       if(arr[i] == '=')
            {
                System.out.println("= \t\t EQUAL_OP");
            }

       if(Character.isLetter(arr[i]) || Character.isDigit(arr[i]))
        {
            strTwo += arr[i];
        }

       if(!Character.isLetter(arr[i]) && !Character.isDigit(arr[i]))
        {
            if(!(Character.isWhitespace(arr[i])))
            {
                arrayString[j] = strTwo;
                System.out.println(arrayString[j] + "\t\t" + "IDENTIFIER");
                strTwo = "";
                j++;

            }
        }
    }


 }
}

任何幫助解決該問題的幫助表示贊賞。

問題在於您不維護詞法分析器中的狀態。 可以使用有限的自動機來識別常規語言,這是一種簡單的機制,可以跟蹤其狀態(並可以保留用於累積較長詞素的緩沖區)。

因此,最初應將狀態設置為S0,並識別每個運算符和括號,然后保持狀態S0。 對於字母,您輸入SI並保持不變,同時在SI中識別出更多字母和數字。 運算符終止SI,然后釋放運算符並返回到S0。 -識別S0中的數字,輸入SN,然后以類似於SI的方式進行處理。

enum State { S0, IDENTIFIER, NUMBER } 

State state = State.S0;
for(int i = 0; i < arr.length; i++) {
switch( state ){
case S0:
    switch(arr[i]){
    case '+':
        System.out.println("+ \t\t ADD_OP");
        break;
    //...
    default:
        if(Character.isLetter(arr[i])){
            strTwo = ""; strTwo += arr[i];
            state = State.IDENTIFIER;
        }
        if(Character.isDigit(arr[i])){
            strTwo = ""; strTwo += arr[i];
            state = State.NUMBER;
        }
        break;
    }
case IDENTIFIER:
    if(Character.isLetter(arr[i]) || Character.isDigit(arr[i])){
        strTwo += arr[i];
    } else {
        System.out.println(strTwo + "\t\t" + "IDENTIFIER");
        i--;
        state = State.S0;
    }
        break;
case NUMBER:
    if(Character.isDigit(arr[i])){
        strTwo += arr[i];
    } else {
         System.out.println(strTwo + "\t\t" + "NUMBER");
         i--;
         State = State.S0;      
    }
    break;
}

這里缺少一些內容:在輸入字符串的末尾處理數字或標識符。 這可以通過檢查變量狀態並使用strTwo的內容來確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM