2008/05/30

Resynchronisation

我上次(應該也是唯一一次)最認真處理錯誤的時候大概是 TOY86 Assembler, Revision 1,但我以前執意要在 tokenisation 的時候做行號遞增,lookahead 就讓行號跳掉了,錯誤訊息就不太精確。剛剛腦袋終於轉過來 ─ 其實行號的遞增可以在 parsing 的時候做嘛!再加上 yacc 的 resynchronisation 機制,我相信現在這個 parser 產出的錯誤行號是我有史以來最準的一個 XD。例如助教給的第三個測試資料是

 1:       class ErrorClass{
 2:           void main(){ // definition of main function
 3:              // declarations of variables
 4:              int 2i;
 5:              FLOAT a;
 6:              float[] b; // b is an array of float
 7:              b = new float[60]; // array creation
 8:              x = (y + 3 * 4) - 5;
 9:              if(x >= 0 && x <= 59
10:              {
11:                 a = 0.3;
12:                 b[x] = a;
13:              }
14:              writesp()
15:              writeln();
16:           
17:        }
18:
(加上行號的 script 是以前用 Ruby 寫的,我現在完全不會寫了 XD。)我的 parser 說第 4, 5, 9, 14, 18 行是錯的,很準。然後我把第 10 行的左大括號註解掉,這次我的 parser 說第 4, 5, 9, 14, 15 行是錯的。欸,不是應該第 13 行錯嗎?然後才發現第 13 行的右大括號變成 main function 的結束,第 17 行的右大括號是整個 "class" 的結束,所以第 14, 15 行是多出來的沒錯 XD。

當然我想這次的錯誤訊息不會有 TOY86 Assembler, Revision 1 那麼詳細 ─ TOY86 (Revision 1) 這種東西是有愛才寫得出來的 XD。

--
明天希望來得及把語意湊出來…

Labels: