2012-08-01 114 views
0

我写在OCaml的词法分析器对小语种的文字,我有它的语法的部分内容如下:代表词法分析器

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

我尝试在lexer.mlllet single_quote = [%x0027],但我得到一个非法编译时出现字符错误,

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

编译的发言let single_quote = [''']的作品,我也看到了另一种方式来指定一个字符,例如let black = ['\009']

有谁知道是否有这3种方式有什么区别?

回答

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。有可能还有其他人,这只是谷歌命中率最高的。

(哎呦,我看到乔纳森Protzenko已经建议荆。对不起,额外的噪音。)

+0

谢谢......我只是想确保'let a = ['\ x09']','让a ='\ x09''和'让a =“\ x09”'实际上是一样的,对吧? – SoftTimur 2012-08-01 12:45:14

+0

另外,我已经看到'DBCS_whitespace =%\ x3000',但是'\ x3000'(以及'\ x2028','\ x2029')在OCaml中不存在,我怎么能解决这个问题? – SoftTimur 2012-08-01 12:55:30

+0

(查看已添加的文本) – 2012-08-03 04:40:28