我正在编写一个分析许多独立文件的分析器。所有文件都具有相同的结构:它有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}而不是抽象语法树)。
目的是解析每个文件的过程,然后尽可能多地分析它们......
有谁知道怎么做?
答案 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 *) }
;
我不确定它会起作用,但你可以试试。