在词法分析器中代表一个角色

时间:2012-08-01 07:16:16

标签: compiler-construction ocaml lexer

我正在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']

有谁知道这三种方式之间是否存在差异?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我认为你在询问OCaml中的字符文字。它们在Section 6.1 of the OCaml manual中定义。

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

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

我希望这会有所帮助。

修改

是的,['\x09']'\x09'以及"\x09"在被视为正则表达式时是相同的。其中有一件东西的集合表示与单独的东西相同的东西。同样,长度为1的序列与单一的序列相同。

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

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