2014-03-28 3 views
3

fslexfsyacc을 사용하여 작은 DSL 파서를 작성하려고합니다. 입력은 서로 다른 렉싱 규칙을 필요로하는 두 가지 다른 언어의 인터리빙 청크로 구성됩니다. 지원을 위해 내 fslex 파일을 어떻게 작성합니까? fslex - 두 토큰 세트 간을 전환하는 방법은 무엇입니까?

는 (I 비슷한 경우는 C 언어에 대한하지만 서로 다른 렉싱 규칙을 필요로 인라인 어셈블리에 대한 지원과 함께 fslex 파일을 정의하는 방법이 될 것 같아요?)

는 내가 현재 가지고하면이 같은 것입니다 :

토큰이 core 파서에 의해 반환됩니다 일단
rule tokenize = parse 
    | "core"  { core lexbuf } 
    ... 

and core = parse 
    | ... 

이 건은, 입력의 다음 부분은 대신 tokenize에 전달됩니다된다. 그러나 나는 (그대로) core 상태에 머물고 싶어. 어떻게해야합니까?

감사합니다.

답변

4

나는 실제로 스스로 해결책을 찾을 수있었습니다. 토큰 화기를 호출 할 BufferLocalStore 상태를 기반으로 결정하는 자체 tokenizer 함수를 정의했습니다.

let mytokenizer (lexbuf : LexBuffer<char>) = 
    if lexbuf.BufferLocalStore.["state"].Equals("core") then FCLexer.core lexbuf 
    else FCLexer.tokenize lexbuf 

let aString (x : string) = 
    let lexbuf = LexBuffer<_>.FromString x 
    lexbuf.BufferLocalStore.["state"] <- "fc" 
    let y = try (FCParser.PROG mytokenizer) lexbuf 
... 

그리고 나는 약간 내 fslex 입력 파일 수정 :

rule tokenize = parse 
    | "core"  { lexbuf.BufferLocalStore.["state"] <- "core"; core lexbuf } 
... 

가 질문을하면 솔루션에 당신을 이끌, 나는 희망을 수있는 방법을 단순히 놀라운이 나 외에 다른 사람을 도움 :)