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']、文字を指定する別の方法も見ました。

これら3つの方法に違いがあるかどうかは誰にもわかりますか?

4

2 に答える 2

2

lexer で非 ASCII 文字を表現する必要がある場合は、おそらく Ulex が必要です。ドキュメントはhttp://cduce.org/ulex/Ulexing.htmlにあり、ホームページはhttp://cduce.org/download.htmlにあります。

于 2012-08-01T13:21:24.507 に答える
1

OCaml の文字リテラルについて質問していると思います。これらは、OCaml マニュアルのセクション 6.1 で定義されています。

一重引用符の場合は、'\''または'\x27'またはと書くことができます'\039'。これらはすべて等価です。%すべての文字リテラルは一重引用符で囲みます。パーセント ( )で始まる形式はありません。

ocamllex の正規表現には、単一の文字を表す文字リテラル (上記のように)、または一連の文字を表す文字列リテラル (二重引用符で囲む) を含めることができます。文字列リテラルは、文字リテラルと同じパターンに従います。一重引用符のみを含む文字列は、"'"or"\'"または"\x27"orになり"\039"ます。

これが役立つことを願っています。

編集

はい、['\x09']'\x09'"\x09"は正規表現と考えれば同じです。1 つのものを含むセットは、その 1 つのもの自体と同じものを示します。同様に、長さ 1 のシーケンスはただ 1 つのものと同じです。

Unicode の値 0x3000 は、「Ideographic Space」を表します (中国語、日本語、および韓国語で使用されていると思います)。OCaml での Unicode の処理は、まったく別のトピックです。Camomileという OCaml 用の Unicode ライブラリがあります。利用したことはありませんが、見た限りでは評価が高いです。ocamllex は Unicode では動作しないと思います。すばやくグーグル検索すると、Unicode を処理するulexという名前のレクサー ジェネレーターが表示されます。おそらく他にもありますが、これは Google のトップ ヒットです。

(おっと、Jonathan Protzenko はすでに ulex を推奨しているようです。余分なノイズで申し訳ありません。)

于 2012-08-01T07:31:48.230 に答える