首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从显式令牌列表中输入ocamlyacc解析器?

从显式令牌列表中输入ocamlyacc解析器?
EN

Stack Overflow用户
提问于 2012-06-05 22:49:37
回答 3查看 1.1K关注 0票数 6

是否可以为OCamlYacc生成的解析器提供一个显式的令牌列表进行分析?

我想使用OCamlLex显式地生成一个令牌列表,然后使用Yacc生成的解析器对其进行分析。但是,标准用例生成一个解析器,该解析器隐式地调用下一个令牌的词法分析器。在这里,令牌是在yacc分析期间而不是在分析之前计算的。从概念上讲,解析器应该只处理令牌,但是Yacc生成的解析器提供了一个依赖于词法分析器的接口,在我的例子中,我不需要它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-06 01:28:23

如果你已经有了一个标记列表,你可以直接使用丑陋的方式,完全忽略词法分析缓冲区。毕竟,解析器所期望的parse-from-lexbuf函数是一个非纯函数:

代码语言:javascript
运行
复制
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类型的函数,您正在尝试将该函数放入解析器的Lexing.lexbuf -> token签名中。如果是这种情况,您可以很容易地使用队列来编写这两种类型之间的转换器:

代码语言:javascript
运行
复制
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
票数 5
EN

Stack Overflow用户

发布于 2012-06-06 03:35:51

正如Jeffrey已经提到的,Menhir特别向解析器提供了一个模块,作为其运行时库的一部分,该模块具有任何类型的令牌流(它只请求一个unit -> token函数):MenhirLib.Convert

(您甚至可以在不使用门希尔的情况下使用此代码,而使用ocamlyacc。实际上,转换并不是非常复杂,因此您甚至可以自己重新实现它。)

票数 7
EN

Stack Overflow用户

发布于 2012-06-05 23:12:44

OCamlYacc接口看起来确实非常复杂;它似乎需要一个Lexing.lexbuf。也许您可以考虑使用Lexing.from_string来提供固定的字符串,而不是固定的标记序列。你也可以看看Menhir。我还没有用过它,但每当有人提到OCaml解析器生成器时,它就会在这里获得极好的评价。它可能有一个更灵活的词法分析接口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10899544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档