首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Ocamllex用于词法字符串( Tiger编译器)

将Ocamllex用于词法字符串( Tiger编译器)
EN

Stack Overflow用户
提问于 2011-04-26 16:56:05
回答 1查看 1.9K关注 0票数 7

我正试着遵循阿佩尔的“在ML中实现现代编译器”,并使用Ocamllex编写lexer。

该规范要求lexer在转换转义序列后返回字符串。以下代码是ocamllex输入文件的摘录:

代码语言:javascript
复制
 rule tiger = parse
 ...
 | '"'
     { let buffer = Buffer.create 1 in
       STRING (stringl buffer lexbuf)
     }
 and  stringl buffer = parse
 | '"' { Buffer.contents buffer }
 | "\\t" { Buffer.add_char buffer '\t'; stringl buffer lexbuf }
 | "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
 | "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
 | '\\' '"' { Buffer.add_char buffer '"'; stringl buffer lexbuf }
 | '\\' '\\' { Buffer.add_char buffer '\\'; stringl buffer lexbuf }
 | eof { raise End_of_file }
 | _ as char { Buffer.add_char buffer char; stringl buffer lexbuf }

有更好的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-26 17:09:04

您可能有兴趣了解奥卡莫雷克萨斯是如何做到这一点的(搜索and string)。本质上,它与您的方法是相同的,没有很好的本地缓冲区(在这一点上我发现您的代码更好,但这有点低效率),更复杂一些,因为支持更多的转义,并且使用转义表(char_for_backslash)分解类似的规则。

另外,您已经重复了两次"\\n"规则,我认为1是对字符串长度的一个非常悲观的估计,我宁愿在这里使用20 (以避免不必要的调整大小)。

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

https://stackoverflow.com/questions/5793702

复制
相关文章

相似问题

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