解析中的异常处理

时间:2013-10-19 15:27:57

标签: parsing ocaml ocamlyacc

我正在编写一个分析许多独立文件的分析器。所有文件都具有相同的结构:它有Initiation(),后面跟着几个程序。例如:

Sub Initiation()
...
End Sub

Sub procedure1()
...
End Sub

Sub procedure2()
...
End Sub

...

Initiation()启动所有内容,然后每个过程的分析是独立的。在分析它们之前,我需要解析它们。

main.ml中,我使用let procedures = Parser.main Lexer.token buf来调用解析。如果一切顺利,procedures包含过程的抽象语法树:Initiation()procedure1()等。

但是,在当前阶段,如果解析在解析过程时引发错误,则返回Parser.Error,并停止解析整个文件。因此,无法解析麻烦程序之后的程序。

我想做的是在某处进行错误处理,以便let procedures = Parser.main Lexer.token buf总是成功,即使在一部分过程中无法解析(在这种情况下,它的值可以是{{1}而不是抽象语法树)。

目的是解析每个文件的过程,然后尽可能多地分析它们......

有谁知道怎么做?

1 个答案:

答案 0 :(得分:1)

从LR分析器中的错误中恢复很困难(我总是建议使用解析器组合器),但也许你可以编写类似的东西(?):

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

我不确定它会起作用,但你可以试试。

相关问题