2013-10-19 3 views
0

많은 독립 파일을 분석하는 분석기를 작성하고 있습니다. 모든 파일은 동일한 구조를 가지고 있습니다 : Initiation()을 가지고 있으며 몇 가지 절차가 이어집니다. 예를 들어 :구문 분석시 예외 처리

Sub Initiation() 
... 
End Sub 

Sub procedure1() 
... 
End Sub 

Sub procedure2() 
... 
End Sub 

... 

Initiation()는 각 절차의 분석은 독립적 인, 모든 것을 시작합니다. 그들을 분석하기 전에, 나는 그들을 파싱해야 할 필요가 있습니다.

main.ml에서 나는 let procedures = Parser.main Lexer.token buf을 사용하여 구문 분석을 호출합니다. 절차를 구문 분석하는 동안 구문 분석은 오류가 발생하는 경우

그러나, 현재의 단계에서, 그것은 Parser.Error을 반환 등 Initiation(), procedure1(), 및 정지 : 모든 것이 잘된다면, procedures는 추상 구문의 절차 나무를 포함 전체 파일을 구문 분석하는 중. 결과적으로 문제가 발생한 절차는 파싱 할 수 없습니다.

내가 뭘하고 싶은데, 어쩌면 let procedures = Parser.main Lexer.token buf이 오류가 발생하여 절차의 일부분을 파싱 할 수 없다하더라도 (그 경우 그 값은 추상 대신에 UnparseableProcedure 일 수있다. 구문 트리).

목표는

누구나 할 방법을 알고 있나요 ... 정말 각 파일에 대한 절차 많은 구문 분석하고 가능한 한 그들에게 많은 분석된다? LR 분석기에서 오류 복구

답변

1

는 어렵다 (그리고 나는 항상 파서 콤비를 사용하는 것이 좋습니다)하지만 어쩌면 당신이 뭔가를 쓸 수 있습니다 (?) :

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

나는 그것이 것을 확실하지 않다 일하지만 너는 노력할 수있어.

관련 문제