【问题标题】:Represent a character in lexer表示词法分析器中的字符
【发布时间】:2012-08-01 07:16:15
【问题描述】:

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

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

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

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

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

有人知道这三种方式有什么区别吗?

【问题讨论】:

    标签: compiler-construction ocaml lexer


    【解决方案1】:

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

    【讨论】:

    • sedlex是ulex项目的继承者。
    【解决方案2】:

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

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

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

    我希望这会有所帮助。

    编辑

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

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

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

    【讨论】:

    • 谢谢...我只是想确保let a = ['\x09']let a = '\x09'let a = "\x09" 实际上是相同的,对吗?
    • 另外,我见过DBCS_whitespace = %\x3000,但是\x3000(以及\x2028\x2029)在OCaml中不存在,我该如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多