2012-06-05 2 views
4

OCamlYacc 생성 구문 분석기에 분석을위한 명시 적 토큰 목록을 제공 할 수 있습니까?명시 적 토큰 목록에서 ocamlyacc 파서를 공급 하시겠습니까?

OCamlLex를 사용하여 나중에 명시 적으로 Yacc 생성 파서를 사용하여 분석하는 토큰 목록을 생성하고 싶습니다. 그러나 표준 유즈 케이스는 다음 토큰에 대해 렉서를 암묵적으로 호출하는 파서를 생성합니다. 여기서 토큰은 이전보다 yacc 분석 중에 계산됩니다. 개념적으로 파서는 토큰에서만 작동해야하지만 Yacc 생성 파서는 필자의 경우에는 필자가 필요로하지 않는 렉서 (lexer)에 의존하는 인터페이스를 제공한다.

답변

4

토큰 목록이 이미 있다면 추한 방법으로 가서 렉싱 버퍼를 모두 무시하면됩니다.

한편
let my_tokens = ref [ (* WHATEVER *) ] 
let token lexbuf = 
    match !my_tokens with 
    | []  -> EOF 
    | h :: t -> my_tokens := t ; h 

let ast = Parser.parse token (Lexbuf.from_string "") 

, 그것은 귀하의 의견에서 보이는 당신이 실제로 유형 Lexing.lexbuf -> token list 당신 '의 기능을 가지고 : 결국, 당신의 파서가 기대하는 구문 분석-에서-lexbuf 함수는 비 순수 함수이다 파서의 Lexing.lexbuf -> token 서명에 맞춰보십시오. 이런 경우, 당신은 쉽게 두 가지 유형 사이의 변환을 작성하는 큐를 사용할 수 있습니다

let deflate token = 
    let q = Queue.create() in 
    fun lexbuf -> 
    if not (Queue.is_empty q) then Queue.pop q else 
     match token lexbuf with 
     | [ ] -> EOF 
     | [tok] -> tok 
     | hd::t -> List.iter (fun tok -> Queue.add tok q) t ; hd 

let ast = Parser.parse (deflate my_lexer) lexbuf 
+0

yacc 생성 파서는'lexbuf' 상태에서 숨겨진 위치 정보에 대한 의미 론적 접근을 제공합니다. 그러므로 나는'수축 '이 효과가 있을지 확신하지 못하고 있지만 나에게 아이디어를 준다. –

1

OCamlYacc 인터페이스는 꽤 복잡해 보입니다. Lexing.lexbuf이 필요합니다. 어쩌면 Lexing.from_string을 사용하여 고정 된 토큰 시퀀스가 ​​아닌 고정 된 문자열을 공급할 수 있습니다. Menhir도보실 수 있습니다. 나는 그것을 사용하지 않았지만 OCaml 파서 생성기를 언급 할 때마다 훌륭한 리뷰를 얻습니다. 보다 유연한 렉싱 인터페이스를 가지고있을 수 있습니다.

+0

선돌이 OCamlYacc에 좋은 대안처럼 보인다 많은 이유. 그러나 그것은 또한 렉서와 매우 밀접하게 연결되어있는 것 같습니다. 'Lexing.from_string'은 대안이 아닙니다. 필자가 임의의 문자열 다음에 오는 토큰을 인식 할 수 있고 문자열 토큰과 그 다음에 오는 토큰으로 끝날 수 있기 때문에 어떤 렉서 액션은 하나가 아닌 두 개의 토큰을 생성하기 때문입니다. 그래서 나는 먼저 토큰리스트를 만들 계획을 세웠다. 어쩌면 한계를 극복하기 위해 이상한 하이브리드 토큰을 도입해야합니다. –

7

이미 제프리에 의해 언급 한 바와 같이, Menhir 특히 파서에 그 런타임 라이브러리의 일환으로, 모듈을 제공합니다 어떤 종류의 토큰 스트림 (unit -> token 함수를 요구합니다) : MenhirLib.Convert.

는 (당신은 당신도 스스로를 다시 구현할 수 있도록 실제로 변환이 몹시 복잡하지 않습니다. 대신 ocamlyacc와 함께, 선돌을 사용하지 않고이 코드를 사용할 수 있습니다.)

+0

매우 유용합니다. 필자는 Menhir을 전혀 사용하지 않았지만, 매뉴얼은 매우 설득력이있다. (나는'Convert' 모듈을 간과했었다.) 그리고 저자는 OCaml 커뮤니티에서 존경받는 사람이다. –