2017-11-21 5 views
1

다음은 Andrew Appel의 Tiger 언어 (ocaml)에 대한 현재 lexerparser입니다.menhir을 사용하여 표현식 목록을 구문 분석하는 방법은 무엇입니까?

나는 현재 상호 재귀 기능을 지원하기 위해 노력하고있어,하지만 다음 파서 코드가 작동하지 않습니다

decs : 
    | l = list(dec) { l } 

dec : 
    | t = nonempty_list(loc(tydec)) { S.TypeDec t } 
    | v = loc(vardec) { S.VarDec v } 
    | f = nonempty_list(loc(fundec)) { S.FunDec f } 

%inline fundec : 
    | Function fun_name = symbol LPar params = tyfields RPar 
     Eq body = loc(exp) { 
     S.{ fun_name; args = params; return_type = None; body } 
    } 
    | Function fun_name = symbol LPar params = tyfields RPar 
     Colon result_type = symbol Eq body = loc(exp) { 
     S.{ fun_name; args = params; return_type = Some result_type; body } 
    } 

을 작은 예를 들어

let 
    function f1(x : int) : int = 
     f2(x) 

    function f2(x : int) : int = 
     f1(x) 

in 
    f1 (0) 
end 

내가 두 FunDec 토큰을 얻을 두 개의 요소로 구성된 목록이있는 단일 FunDec 토큰 대신 싱글 톤 목록.

menhir을 사용하여 fundec의 목록을 구문 분석하려면 어떻게해야합니까?

PS : 내가 두 번째 패스에서이 목록을 병합 할 수 있습니다 알고 있지만, 가능

+0

질문에 관련 코드를 모두 넣을 수 있습니까? – PatJ

+0

@PatJ fundec 구문 분석 규칙을 추가했지만 원하는 것이 무엇인지 확실하지 않습니다. 두 개의 관련 파일 + 예제 코드를 연결했습니다. 전체 파서 파일을 넣는 것은 질문을 clobber 것입니다, 그렇지 않습니까? – Vinz

+0

링크가 죽은 경우를 대비하여 모든 게시물이 자체 포함되어야한다는 것은 사이트 정책에 명시된 것입니다. github이 곧 사라지지는 않을지라도 저장소가있을 수 있습니다. – PatJ

답변

1

기능의 그룹에 대한 마커가 없기 때문에, 당신이있는 경우에 나는 파서가 나를 위해 그것을하고 싶습니다 여러 생성자와 함께, 귀하의 목록에 자신을 선언

decs : 
    | hd=nonempty_list(fundec) tl=decs_no_function { (S.Fundecs hd)::tl } 
    | l=decs_no_function { l } 

decs_no_functions : 
    | hd=dec tl=decs { hd::tl } (* dec same as yours, without functions *) 
    | { [] } 

여기 decs_no_functions는 "함수로 시작하지 않는 선언의 목록"에 해당합니다. 단일 함수 선언은 단일 요소 목록 내에 있습니다.

+0

함수를 위해 잘 작동하고 있습니다. 이제 같은 방식으로 _and_ 유형의 관리 기능을 갖기 위해 노력하고 있습니다. 내가 성공할 때 나는 검증 할 것이다.) 팁을 가져 주셔서 감사합니다. – Vinz