ANTLR: pemulihan dan pelaporan kesalahan

saya mempunyai masalah dalam pemulihan dan kesalahan pengeposan ulang dengan ANTLR v3. saya mengikuti tautan ini http://www.antlr.org/blog/antlr3/error.handling.tml tetapi saya tidak punya solusi itu. saya ingin membuat beberapa pelaporan dan pemulihan misalnya di program sumber seperti ini: kode masukan siswa:

FOR(int a=0;a<10;a++){
 b=b*a;
}

dan program akan melaporkan seperti ini: Program : "apa yang Anda maksud dengan kata kunci FOR?" jawaban siswa: "ya" setelah itu, pemulihan sistem dan modifikasi kode sumber secara otomatis. Bagaimana melakukan hal seperti itu dengan ANTLR v3?tidak mungkin dilakukan dengan ANTLR? Butuh bantuan. terima kasih teman-teman!


person Berto Tuwondila    schedule 22.02.2012    source sumber
comment
Apakah memulai ulang parsing dari awal dapat diterima? Ini mungkin menyederhanakan implementasinya.   -  person sarnold    schedule 22.02.2012


Jawaban (1)


Saya pikir Anda perlu mengganti org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken di dalam kelas parser yang Anda buat.

Fungsi ini dipanggil ketika ANTLR mendeteksi token yang tidak valid. Jadi dalam fungsi Anda sendiri, Anda dapat menanyakan kepada pengguna apakah diperlukan pemulihan.

Jika diperlukan, Anda dapat menghubungi BaseRecognizer.recoverFromMismatchedToken untuk melakukan pemulihan. Jika tidak, Anda dapat memberikan pengecualian MismatchedTokenException.

person Lex Li    schedule 22.02.2012
comment
bisakah Anda memberi saya tautan untuk contoh itu? saya hanya bingung. tapi terima kasih sebelumnya lex li - person Berto Tuwondila; 22.02.2012
comment
Saya tidak bisa memberi Anda contoh Java, karena saya menggunakan ANTLR di C#. github.com/lextm/sharpsnmplib/blob/ Ini adalah sebagian kelas yang ditentukan dalam C#, yang pada akhirnya akan digabungkan dengan file SmiParser.cs yang dihasilkan ANTLR dari file tata bahasa Smi.g. Kelas SmiParser berasal dari BaseRecognizer ANTLR. Di sini saya mengganti fungsi RecoverFromMismatchedToken untuk sekadar mengeluarkan pengecualian setiap saat. Di Java Anda harus menggunakan cara serupa untuk mengganti fungsi dan kemudian mengimplementasikan logika Anda sendiri. - person Lex Li; 22.02.2012
comment
terima kasih lex li untuk solusinya. untuk kasus Anda, tidak mungkin menggunakan konsep ANTLR seperti ini stackoverflow.com/questions/9262195/ - person Berto Tuwondila; 22.02.2012
comment
@Berto: Saya pikir recoverFromMismatchedToken akan terjadi sebelum AST dibuat. Anda harus dapat menggunakan AST bahkan dengan pendekatan ini. - person sarnold; 23.02.2012