【问题标题】:Exception handling in parsing解析中的异常处理
【发布时间】:2013-10-19 15:27:56
【问题描述】:

我正在编写一个分析许多独立文件的分析器。所有文件都有相同的结构:它有一个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 始终成功,即使无法解析程序的一部分(在这种情况下,它的值可以是UnparseableProcedure,而不是抽象语法树)。

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

有人知道怎么做吗?

【问题讨论】:

    标签: parsing ocaml ocamlyacc


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2023-03-18
      • 2020-04-12
      相关资源
      最近更新 更多