2017-10-23 3 views
1

私はJavaで字句解析器を構築しています。この私が今持っているものです:私はこのコードの一部を使用して「9」と「*」、「+」のようなオペレータに「0」から数字を読み取ることができ、このコードでJavaでファイルから算術式の自然数を読み取る

import java.io.*; 

enum TokenType{ NUM,SOMA, MULT,APar,FPar, EOF} 

class Token{ 
    char lexema; 
    TokenType token; 

    Token (char l, TokenType t) 
    { lexema=l;token = t;}  

} 

class AnaliseLexica { 

BufferedReader arquivo; 

AnaliseLexica(String a) throws Exception 
{ 

    this.arquivo = new BufferedReader(new FileReader(a)); 

} 

Token getNextToken() throws Exception 
{ 
    Token token; 
    int eof = -1; 
    char currchar; 
    int currchar1; 

     do{ 
      currchar1 = arquivo.read(); 
      currchar = (char) currchar1; 
     } while (currchar == '\n' || currchar == ' ' || currchar =='\t' || currchar == '\r'); 

     if(currchar1 != eof && currchar1 !=10) 
     { 


      if (currchar >= '0' && currchar <= '9') 
       return (new Token (currchar, TokenType.NUM)); 
      else 
       switch (currchar){ 
        case '(': 
         return (new Token (currchar,TokenType.APar)); 
        case ')': 
         return (new Token (currchar,TokenType.FPar)); 
        case '+': 
         return (new Token (currchar,TokenType.SOMA)); 
        case '*': 
         return (new Token (currchar,TokenType.MULT)); 

        default: throw (new Exception("Caractere inválido: " + ((int) currchar))); 
       } 
     } 

     arquivo.close(); 

    return (new Token(currchar,TokenType.EOF)); 

} 

do{ 
     currchar1 = arquivo.read(); 
     currchar = (char) currchar1; 
    } while (currchar == '\n' || currchar == ' ' || currchar =='\t' || currchar == '\r'); 

ファイルから自然数を読み込み、算術演算子を読み続けるにはどうすればよいですか?

+0

はを追跡します前のcharは現在のcharで何をするかを知ることができ、処理しているトークンのタイプを追跡することができます。 – davidbuzatto

答えて

0

スペースはトークンの有効な区切り文字なので、コードを簡単にすることができます。 Scannerクラスはデフォルトで、読み取り値をスペースで区切ります。あなたはちょうど1つずつ読む必要があります。スキャナにそれ以上読み取るデータがない場合は、スキャナを閉じてEOFトークンを返します。

import java.io.FileReader; 
import java.io.IOException; 
import java.util.Scanner; 

public class AnalisadorLexico { 

    public enum TokenType { 
     NUM, 
     SOMA, 
     MULT, 
     APar, 
     FPar, 
     EOF 
    } 

    public class Token { 

     String lexema; 
     TokenType token; 

     Token(String l, TokenType t) { 
      lexema = l; 
      token = t; 
     } 

     Token(char l, TokenType t) { 
      lexema = String.valueOf(l); 
      token = t; 
     } 

     @Override 
     public String toString() { 
      return lexema + " (" + token + ")"; 
     } 

    } 

    private Scanner fileReader; 
    private boolean scannerClosed; 

    public AnalisadorLexico(String filePath) throws IOException { 
     fileReader = new Scanner(new FileReader(filePath)); 
    } 

    public Token getNextToken() throws IOException { 

     if (!scannerClosed && fileReader.hasNext()) { 

      String currentData = fileReader.next(); 

      try { 
       Integer.parseInt(currentData); 
       return new Token(currentData, TokenType.NUM); 
      } catch (NumberFormatException exc) { 
      } 

      switch (currentData) { 
       case "(": 
        return new Token(currentData,TokenType.APar); 
       case ")": 
        return new Token(currentData,TokenType.FPar); 
       case "+": 
        return new Token(currentData,TokenType.SOMA); 
       case "*": 
        return new Token(currentData,TokenType.MULT); 
      } 

     } else { 
      scannerClosed = true; 
      fileReader.close(); 
      return new Token("", TokenType.EOF); 
     } 

     return null; 

    } 

    public static void main(String[] args) throws IOException { 

     AnalisadorLexico al = new AnalisadorLexico("testAL.txt"); 
     Token t = null; 

     while ((t = al.getNextToken()).token != TokenType.EOF) { 
      System.out.println(t); 
     } 

     System.out.println(al.getNextToken()); 
     System.out.println(al.getNextToken()); 
     System.out.println(al.getNextToken()); 
     System.out.println(al.getNextToken()); 

    } 

} 

あなたはクラスのスキャナを使用することができない場合は、そのデータをトークン化、BufferedReaderのを使い続けることができますが:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class AnalisadorLexico2 { 

    public enum TokenType { 
     NUM, 
     SOMA, 
     MULT, 
     APar, 
     FPar, 
     EOF 
    } 

    public class Token { 

     String lexema; 
     TokenType token; 

     Token(String l, TokenType t) { 
      lexema = l; 
      token = t; 
     } 

     Token(char l, TokenType t) { 
      lexema = String.valueOf(l); 
      token = t; 
     } 

     @Override 
     public String toString() { 
      return lexema + " (" + token + ")"; 
     } 

    } 

    private BufferedReader fileReader; 
    private boolean fileReaderClosed; 

    public AnalisadorLexico2(String filePath) throws IOException { 
     fileReader = new BufferedReader(new FileReader(filePath)); 
    } 

    public Token getNextToken() throws IOException { 

     String currentData = nextBufferedReaderToken(); 

     if (currentData != null) { 

      try { 
       Integer.parseInt(currentData); 
       return new Token(currentData, TokenType.NUM); 
      } catch (NumberFormatException exc) { 
      } 

      switch (currentData) { 
       case "(": 
        return new Token(currentData,TokenType.APar); 
       case ")": 
        return new Token(currentData,TokenType.FPar); 
       case "+": 
        return new Token(currentData,TokenType.SOMA); 
       case "*": 
        return new Token(currentData,TokenType.MULT); 
      } 

     } else { 
      if (!fileReaderClosed) { 
       fileReaderClosed = true; 
       fileReader.close(); 
      } 
      return new Token("", TokenType.EOF); 
     } 

     return null; 

    } 

    public String nextBufferedReaderToken() throws IOException { 

     boolean started = false; 
     String data = null; 

     while (!fileReaderClosed) { 

      int d = fileReader.read(); 
      char c = (char) d; 

      if (d != -1) { 

       if (c == '\n' || c == ' ' || c == '\t' || c == '\r') { 
        if (!started) { 
         // discard... 
        } else { 
         break; 
        } 
       } else { 
        if (!started) { 
         data = ""; 
         started = true; 
        } 
        data += c; 
       } 

      } else { 
       break; 
      } 

     } 

     return data; 

    } 

    public static void main(String[] args) throws IOException { 

     AnalisadorLexico2 al = new AnalisadorLexico2("testAL.txt"); 
     Token t = null; 

     while ((t = al.getNextToken()).token != TokenType.EOF) { 
      System.out.println(t); 
     } 

     System.out.println(al.getNextToken()); 
     System.out.println(al.getNextToken()); 
     System.out.println(al.getNextToken()); 
     System.out.println(al.getNextToken()); 

    } 

} 

マイtestAL.txtファイルの内容は次のとおりです。

1234 + 5 * 65 + (44 * 55555) * 444 + (2354 * (34 + 44)) 
1234 + 5 * 65 + (44 * 55555) * 444 + (2354 * (34 + 44)) 
    1234 + 5 * 65 + (44 * 55555) * 444 + (2354 * (34 + 44)) 
1234 + 5 * 65 + (44 * 55555) * 444 + (2354 * (34 + 44)) 
関連する問題