ANTLR: การกู้คืนและการรายงานข้อผิดพลาด

ฉันมีปัญหาในการกู้คืนและข้อผิดพลาดในการโพสต์ใหม่ด้วย ANTLR v3 ฉันไปตามลิงค์นี้ http://www.antlr.org/blog/antlr3/error.handling.tml แต่ฉันไม่มีวิธีแก้ปัญหานั้น ฉันต้องการจัดทำรายงานและการกู้คืนเช่นในโปรแกรมต้นทางเช่นนี้: รหัสอินพุตของนักเรียน:

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

และโปรแกรมจะรายงานดังนี้: Program : "คุณหมายถึงคีย์เวิร์ด FOR is for?" นักเรียนตอบ:"ใช่" หลังจากนั้นระบบจะกู้คืนและแก้ไขซอร์สโค้ดโดยอัตโนมัติ จะทำอย่างไรกับ ANTLR v3 เป็นไปไม่ได้กับ ANTLR ต้องการความช่วยเหลือ. ขอบคุณเพื่อน!


person Berto Tuwondila    schedule 22.02.2012    source แหล่งที่มา
comment
การรีสตาร์ทการแยกวิเคราะห์ตั้งแต่ต้นเป็นที่ยอมรับหรือไม่ มันอาจทำให้การดำเนินการง่ายขึ้น   -  person sarnold    schedule 22.02.2012


คำตอบ (1)


ฉันคิดว่าคุณต้องแทนที่ org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken ภายในคลาส parser ที่คุณสร้างขึ้น

ฟังก์ชันนี้เรียกว่าเมื่อ ANTLR ตรวจพบโทเค็นที่ไม่ถูกต้อง ดังนั้นในฟังก์ชันของคุณเอง คุณสามารถถามผู้ใช้ว่าจำเป็นต้องกู้คืนหรือไม่

หากจำเป็น คุณสามารถโทร BaseRecognizer.recoverFromMismatchedToken เพื่อทำการกู้คืนได้ ถ้าไม่เช่นนั้น คุณสามารถส่งข้อยกเว้น MismatchedTokenException ได้

person Lex Li    schedule 22.02.2012
comment
คุณช่วยบอกลิงค์สำหรับตัวอย่างนั้นให้ฉันได้ไหม ฉันแค่สับสน แต่ขอบคุณก่อนเล็กซ์ ลี่ - person Berto Tuwondila; 22.02.2012
comment
ฉันไม่สามารถยกตัวอย่าง Java ให้คุณได้ เนื่องจากฉันใช้ ANTLR ใน C# github.com/lextm/sharpsnmplib/blob/ นี่เป็นคลาสบางส่วนที่กำหนดไว้ใน C# ซึ่งในที่สุดจะถูกรวมเข้ากับไฟล์ SmiParser.cs ที่สร้างโดย ANTLR จากไฟล์ไวยากรณ์ Smi.g คลาส SmiParser มาจาก BaseRecognizer ของ ANTLR ที่นี่ฉันจะแทนที่ฟังก์ชัน RecoverFromMismatchedToken เพื่อส่งข้อยกเว้นตลอดเวลา ใน Java คุณควรใช้วิธีที่คล้ายกันเพื่อแทนที่ฟังก์ชันแล้วใช้ตรรกะของคุณเอง - person Lex Li; 22.02.2012
comment
ขอบคุณ lex li สำหรับวิธีแก้ปัญหานั้น สำหรับกรณีของคุณ นั่นเป็นไปไม่ได้ที่จะใช้แนวคิดของ ANTLR เช่นนี้ stackoverflow.com/questions/9262195/ - person Berto Tuwondila; 22.02.2012
comment
@Berto: ฉันคิดว่า recoverFromMismatchedToken จะเกิดขึ้นก่อน AST จะถูกสร้างขึ้น คุณควรจะสามารถใช้ AST ได้แม้จะใช้วิธีนี้ก็ตาม - person sarnold; 23.02.2012