Compiler construction 在lexer中表示一个字符

Compiler construction 在lexer中表示一个字符,compiler-construction,ocaml,lexer,Compiler Construction,Ocaml,Lexer,我正在用OCaml为一种小型语言编写一个lexer,其语法部分如下: tab-character = %x0009 eom-character = %x0019 space-character = %x0020 underscore = %x005F single-quote = %x0027 ; ' 我试图在lexer.mll中编写let single_quote=[%x0027],但编译时出现非法字符错误 有人能告诉我如何指定像%x0027这样的数字吗 编译使用语句let single.\

我正在用OCaml为一种小型语言编写一个lexer,其语法部分如下:

tab-character = %x0009
eom-character = %x0019
space-character = %x0020
underscore = %x005F
single-quote = %x0027 ; '
我试图在
lexer.mll
中编写
let single_quote=[%x0027]
,但编译时出现非法字符错误

有人能告诉我如何指定像
%x0027
这样的数字吗

编译使用语句
let single.\u quote=['']
,我还看到了另一种指定字符的方法,例如
let black=['\009']


有人知道这三种方法之间有什么区别吗?

我想你是在问OCaml中的字符文字。它们在中定义

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

ocamlex中的正则表达式可以包含表示单个字符的字符文本(如上所述),也可以包含表示字符序列的字符串文本(双引号)。字符串文字遵循与字符文字相同的模式。只包含一个引号的字符串将是
“'”
“\”
“\x27”
“\039”

我希望这有帮助

编辑

是的,
['\x09']
'\x09'
“\x09”
被视为正则表达式时是相同的。一个集合中有一个事物,它本身就表示同一事物。类似地,长度为1的序列仅与一个相同

Unicode中的值0x3000表示“表意空间”(我想在中文、日文和韩文中使用)。在OCaml中处理Unicode是另一个主题。有一个用于OCaml的Unicode库,名为。我从未使用过它,但从我所看到的来看,它很受尊敬。我认为ocamlex不能与Unicode一起工作。只要用谷歌快速搜索,我就会看到一个名为lexer的生成器,它可以处理Unicode。可能还有其他的,这只是谷歌的热门


(哎哟,我看到乔纳森·普罗岑科已经推荐了ulex。对不起,太吵了。)

我想你是在问OCaml中的字符文字。它们在中定义

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

ocamlex中的正则表达式可以包含表示单个字符的字符文本(如上所述),也可以包含表示字符序列的字符串文本(双引号)。字符串文字遵循与字符文字相同的模式。只包含一个引号的字符串将是
“'”
“\”
“\x27”
“\039”

我希望这有帮助

编辑

是的,
['\x09']
'\x09'
“\x09”
被视为正则表达式时是相同的。一个集合中有一个事物,它本身就表示同一事物。类似地,长度为1的序列仅与一个相同

Unicode中的值0x3000表示“表意空间”(我想在中文、日文和韩文中使用)。在OCaml中处理Unicode是另一个主题。有一个用于OCaml的Unicode库,名为。我从未使用过它,但从我所看到的来看,它很受尊敬。我认为ocamlex不能与Unicode一起工作。只要用谷歌快速搜索,我就会看到一个名为lexer的生成器,它可以处理Unicode。可能还有其他的,这只是谷歌的热门


(哎哟,我看到乔纳森·普罗岑科已经推荐了ulex。为额外的噪音感到抱歉。)

如果您需要在lexer中表示非ascii字符,那么ulex可能就是您所需要的。文档位于,主页位于

如果您需要在lexer中表示非ascii字符,那么您可能需要Ulex。文档位于,主页位于

谢谢。。。我只是想确保
let a=['\x09']
let a='\x09'
let a=“\x09”
实际上是一样的,对吧?我也看到了
DBCS\u空格=%\x3000
,但是
\x3000
(以及
\x2028
\x2029
)在OCaml中不存在,我怎么能解决这个问题呢?谢谢。。。我只是想确保
let a=['\x09']
let a='\x09'
let a=“\x09”
实际上是相同的,对吧?我也看到了
DBCS\u空格=%\x3000
,但是
\x3000
(以及
\x2028
\x2029
)在OCaml中不存在,我如何解决这个问题?是ulex项目的继任者。是ulex项目的继任者。