2013-10-19 38 views
0

我正在寫一個分析許多獨立文件的分析器。所有的文件具有相同的結構:它有一個Initiation(),然後是幾個過程。例如:解析中的異常處理

Sub Initiation() 
... 
End Sub 

Sub procedure1() 
... 
End Sub 

Sub procedure2() 
... 
End Sub 

... 

Initiation()引發的一切,然後每道工序的分析是獨立的。在分析它們之前,我需要理由來解析它們。我使用let procedures = Parser.main Lexer.token buf來調用解析。如果一切順利,procedures包含的程序的抽象語法樹:Initiation()procedure1()

然而,在目前階段,如果解析在分析過程引發錯誤,它返回一個Parser.Error,並停止從解析整個文件。結果,麻煩程序之後的程序不能被解析。

我想要做的是在某個地方有一個錯誤處理,這樣let procedures = Parser.main Lexer.token buf總是成功,即使在一部分過程中不能解析(在這種情況下,它的值可以是UnparseableProcedure,而不是一個摘要語法樹)。

目的是真正解析多達每個文件的程序,然後分析它們儘可能多的...

有誰知道怎麼辦呢?

回答

1

在LR分析儀從錯誤中恢復是困難的(我總是建議使用解析器組合子),但也許你可以寫類似的東西(?):

proc: 
    begin_sub sub_name sub_body end_sub  { Some ($1,$2) } 
| begin_sub anything_except_endsub end_sub { None (* error case *) } 
; 

我不知道它會工作,但你可以嘗試。