代码之家  ›  专栏  ›  技术社区  ›  Flux

将ocamlyacc与sedlex一起使用

  •  0
  • Flux  · 技术社区  · 7 年前

    我正在尝试找出如何将ocamlyacc与sedlex一起使用。

    lexer.ml

    let rec lex (lexbuf: Sedlexing.lexbuf) =
        match%sedlex lexbuf with
        | white_space -> lex lexbuf
        (* ... other lexing rules ... *)
        | _ -> failwith "Unrecognized."
    

    我还有一个名为 parser.mly ,其中包含 parse

    要分析字符串,我使用以下方法:

    let lexbuf = Sedlexing.Utf8.from_string s in
    let parsed = (Parser.parse Lexer.lex) lexbuf in
    (* ... do things ... *)
    

    但在编译过程中,会出现此错误(由 Lexer.lex (见上文):

    错误:此表达式具有Sedlexing类型。lexbuf->解析器。代币 但表达式应为Lexing类型。lexbuf->解析器。代币

    据我所知,出现此错误是因为ocamlyacc希望lexer由ocamlex生成,而不是由sedlex生成。所以问题是:如何将ocamlyacc与sedlex一起使用?

    1 回复  |  直到 7 年前
        1
  •  2
  •   octachron    7 年前

    如果您没有非常具体的理由使用ocamlyacc而不是Menhir,那么使用Menhir并将解析函数转换为修改后的API可能会简单得多,因为它只需要类型为的令牌生成器函数 unit -> token * position * position :

     let provider lexbuf () =
        let tok = generated_lexer lexbuf in
        let start, stop =  Sedlexing.lexing_positions lexbuf in
        tok, start, stop
    
     let parser_result = MenhirLib.Convert.Simplified.traditional2revised
         generated_parser_entry_point
         (provider lexbuf)
    

    否则,您需要创建函数 Lexing.lexbuf -> token 从你的 Sedlexing.lexbuf -> token 它将伪lexbuf作为输入,在sedlex缓冲区上应用true lexing函数,将位置信息复制到伪 Lexing.lexbuf 然后返回令牌。

    推荐文章