0

我正在用 OCaml 为一种小语言编写词法分析器,我有一部分语法如下:

tab-character = %x0009
eom-character = %x0019
space-character = %x0020
underscore = %x005F
single-quote = %x0027 ; '

我尝试写入let single_quote = [%x0027]lexer.mll但编译时出现非法字符错误,

谁能告诉我如何指定这样的数字%x0027

编译与语句一起工作let single_quote = ['''],我还看到了另一种指定字符的方法,例如let black = ['\009']

有谁知道这三种方式之间是否有区别?

4

2 回答 2

2

如果您需要在词法分析器中表示非 ascii 字符,那么 Ulex 可能就是您所需要的。文档位于http://cduce.org/ulex/Ulexing.html,主页位于http://cduce.org/download.html

于 2012-08-01T13:21:24.507 回答
1

我认为您是在询问 OCaml 中的字符文字。它们在OCaml 手册的第 6.1 节中定义。

对于单引号,您可以编写'\''or'\x27''\039'。所有这些都是等价的。所有字符文字都写在单引号中——没有以百分号 ( %) 开头的形式。

ocamllex 中的正则表达式可以包含字符文字(如上),表示单个字符,或字符串文字(双引号),表示字符序列。字符串文字遵循与字符文字相同的模式。仅包含单引号的字符串将是"'"or"\'""\x27"or "\039"

我希望这有帮助。

编辑

是的,['\x09']并且当被视为正则表达式时,它们是相同的'\x09'"\x09"包含一个事物的集合与该事物本身表示同一事物。类似地,长度为 1 的序列仅与一个事物相同。

Unicode 中的值 0x3000 代表一个“表意空间”(我猜是在中文、日文和韩文中使用)。在 OCaml 中处理 Unicode 是另外一个话题。OCaml 有一个名为Camomile的 Unicode 库。我从未使用过它,但从我所看到的情况来看,它是很好的。我认为 ocamllex 不适用于 Unicode。只是快速搜索一下,我看到一个名为ulex的词法分析器生成器,它处理 Unicode。可能还有其他人,这只是谷歌的热门话题。

(哎呀,我看到 Jonathan Protzenko 已经推荐了 ulex。抱歉有额外的噪音。)

于 2012-08-01T07:31:48.230 回答