fslex - จะสลับระหว่างชุดโทเค็นสองชุดได้อย่างไร

ฉันกำลังพยายามเขียนตัวแยกวิเคราะห์ DSL ขนาดเล็กโดยใช้ fslex และ fsyacc ข้อมูลเข้าประกอบด้วยกลุ่มภาษาสองภาษาที่สลับกันซึ่งต้องใช้กฎ lexing ที่แตกต่างกัน ฉันจะเขียนไฟล์ fslex เพื่อรองรับสิ่งนั้นได้อย่างไร

(ฉันเดาว่ากรณีที่คล้ายกันคือวิธีกำหนดไฟล์ fslex สำหรับภาษา c แต่ด้วยการรองรับแอสเซมบลีแบบอินไลน์ซึ่งต้องใช้กฎ lexing ที่แตกต่างกัน?)

สิ่งที่ฉันมีอยู่ในปัจจุบันมีดังนี้:

rule tokenize = parse
    | "core"        { core lexbuf }
    ...

and core = parse
    | ...

ประเด็นก็คือ เมื่อโทเค็นได้รับการส่งคืนโดยตัวแยกวิเคราะห์ core ส่วนถัดไปของอินพุตจะถูกส่งไปที่ tokenize แทน อย่างไรก็ตาม ฉันต้องการที่จะคงอยู่ (เหมือนเดิม) ในสถานะ core ฉันจะทำอย่างไร?

ขอบคุณ!


person Aviad P.    schedule 28.03.2014    source แหล่งที่มา


คำตอบ (1)


จริงๆ แล้วฉันสามารถหาวิธีแก้ปัญหาด้วยตัวเองได้ ฉันกำหนดฟังก์ชันโทเค็นไนเซอร์ของตัวเองซึ่งจะตัดสินใจตามสถานะ BufferLocalStore ที่จะเรียกใช้โทเค็นไนเซอร์

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 }
...

น่าทึ่งมากที่การถามคำถามสามารถนำคุณไปสู่วิธีแก้ปัญหาได้ และฉันหวังว่านี่จะช่วยคนอื่นที่ไม่ใช่ฉัน :)

person Aviad P.    schedule 28.03.2014