0

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

Sub Initiation()
...
End Sub

Sub procedure1()
...
End Sub

Sub procedure2()
...
End Sub

...

启动一切,然后每个程序的Initiation()分析是独立的。在分析它们之前,我需要对它们进行解析。

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

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

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

目的实际上是为每个文件解析尽可能多的程序,然后尽可能多地分析它们......

有谁知道该怎么做?

4

1 回答 1

1

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

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

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

于 2013-10-20T07:42:50.837 回答