2013-04-08 3 views
0

Я работаю с файловым устройством и писателем, используя текстовые файлы. В основном реализация dfa грамматического паскаля, который обрабатывает комментарии в программе. Для этого я использовал 3 текстовых файла 1 файл для чтения данных, 1 для записи токена в нем и 1 для записи маркера ошибки в нем. Компилятор pascal не считает это {{в качестве комментария, потому что синтаксис комментария является «{это комментарий}». Для этого я использовал массив [5] [4], и я использовал считыватель файлов для чтения из текстового имени файла «code.txt», содержащего этот текст «{a}». Но проблема в том, что когда я пишу это в новое текстовое имя файла «token.txt» (сначала записывая его в token.txt, но он должен быть в файле error.tx), он печатает это {{a} означает, что он печатает первый символ два раза подобный {{. Я хочу вывести то же самое, что и в файле code.txt. Заранее спасибо.ошибка в программе java

public class Lex { 


    public static char dfa1[][] = new char[5][4]; 



     /* 
     * for(int i=0; i<5; i++) { for(int j=0; j<4; j++) { 
     * System.out.println("arr["+i+"]["+j+"]"+dfa1[i][j]); } } 
     */ 
     //FileReader fr = new FileReader(filename); 
     //BufferedReader br = new BufferedReader(fr); 

     File file = new File("code.txt"); 
     BufferedReader reader = null; 
     int StartState = 1; 
     char CurrentState = '1'; 
     int acp =0; 
     String temptok = new String(); 
     try { 
      reader = new BufferedReader(new FileReader(file)); 
      int i; 

      // repeat until EOF 
      while ((i = reader.read()) != -1) { 
       char c = (char) i; 
       if (c == '{') { 
        if (CurrentState == dfa1[1][0]) { 
         CurrentState = '2'; 
         acp =0; 
         temptok = temptok.concat(String.valueOf(c)); 
        } else if (CurrentState == dfa1[2][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         acp =0; 
         CurrentState = '4'; 
        } else if (CurrentState == dfa1[3][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         CurrentState = '4'; 
         acp =0; 
        } else if (CurrentState == dfa1[4][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         acp =0; 
         break; 
        } 
       } 
       if (c == '}') { 
        if (CurrentState == dfa1[1][0]) { 
         acp =0; 
         temptok = temptok.concat(String.valueOf(c)); 
         break; 
        } else if (CurrentState == dfa1[2][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         CurrentState = '3'; 
         acp = 1; 
        } else if (CurrentState == dfa1[3][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         CurrentState = '3'; 
         acp = 1; 
        } else if (CurrentState == dfa1[4][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         acp = 0; 
         break; 
        } 
       } 
       if (c != '}') { 
        if (CurrentState == dfa1[1][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         acp =0; 
         break; 
        } else if (CurrentState == dfa1[2][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         CurrentState = '2'; 
         acp =0; 
        } else if (CurrentState == dfa1[3][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         acp =0; 
         break; 
        } else if (CurrentState == dfa1[4][0]) { 
         temptok = temptok.concat(String.valueOf(c)); 
         acp =0; 
         break; 
        } 
       } 


       //System.out.println(temptok); 

       PrintWriter writer = new PrintWriter("token.txt", "UTF-8"); 
       PrintWriter ewriter = new PrintWriter("error.txt", "UTF-8"); 
       if(acp == 1){ 
       writer.println(temptok); 
       writer.close(); 
       } 
       else if(acp == 0) 
       { 
        ewriter.println(temptok); 
       ewriter.close(); 
       } 

ответ

2

У вас есть цепь if блоков, а не цепь if, else if, else if блоков. Так что, когда { читается, эти два условия, и полукокс записывается дважды:

if (c == '{') { 
    ... 
} 
... 
if (c != '}') { 
    ... 
} 

Кроме того, вы не должны использовать String.concat(), но вы должны использовать StringBuilder вместо этого. И вы должны соблюдать соглашения об именах Java: переменные начинаются с строчной буквы. Также подумайте об улучшении вашего наименования: dfa1 и acp - не описательные имена. temptok и ewriter следует называть temporaryToken и errorWriter.

Заключительное примечание: это те проблемы, которые диагностируются сразу же при прохождении кода с помощью отладчика. Изучите использование отладчика: он сэкономит вам часы отладки.

+0

Я просто разместил то же самое, что и вы :) – fmodos

+0

@JB Nizet Большое спасибо, ваш ответ был действительно полезен для меня. –

0

Ваш третий, если:

if (c != '}') 

кажется, что должно быть:

if (c != '}' && c != '{') 

Кроме того, это не кажется, что наиболее оптимальным способом для обработки файла.

+0

Я сделал это благодаря всем, что помогло мне. –

Смежные вопросы