2013-12-13 2 views
1

Я пишу парсер, используя структуру ANTLR. Я хочу писать в файле, поэтому я использую этот код, но я не знаю, где я должен закрыть файл?Запись в файле ANTLRWorks

@header 
{ 
    import java.io.*; 
} 

main:{ 

    BufferedWriter out = null; 
    try{ 
    FileWriter fstream = new FileWriter("output.txt"); 
    out = new BufferedWriter(fstream); 

    } 

    catch (Exception e){ 
    System.err.println("Error: " + e.getMessage()); 
    } 

    }; 


    p1 : p2 {out.write("this is p1");} 
     ; 

    p2 ...... 

ответ

0

Если main является точкой входа вашей грамматики, вы бы закрыть поток в конце этого правила:

grammar T; 

@header { 
    import java.io.*; 
} 

@members { 
    OutputStream out = null; 

    void before() { 
    // initialize 'out' here 
    } 

    void after() { 
    // close 'out' here 
    } 
} 

main 
: {before();} 
    p1 EOF 
    {after();} 
; 

p1 
: p2 {out.write("this is p1");} 
; 

p2 
: ... 
; 

Можно даже предоставить пустые реализации ваших методов внутри @members блока:

@members { 
    OutputStream out; 

    void before() {} 

    void after() {} 
} 

и переопределить/реализовать их в классах слушатель/посетитель, чтобы минимизировать целевую специальный код внутри грамматики сам.

+0

Я пробовал, но после генерации кода Java у меня есть ошибка после метода, он не знает 'out'. вы не знаете, почему это произошло? –

+0

@ пользователь2944170, нет, я не знаю. –