4

私は ocamllex を使って OCaml でおもちゃのプログラミング言語を書いていて、言語を Python スタイルのインデント変更に敏感にしようとしていましたが、行頭を ocamllex の正規表現ルールと一致させるのに問題があります。私は^行頭を一致させるために使用することに慣れていますが、OCaml ではそれが文字列連結演算子です。残念ながら、Google検索はあまりヒットしませんでした:(これがどのように機能するか知っている人はいますか?

4

1 に答える 1

4

^長さ 0 の一致するシンボル (部分文字列ではなく位置に一致する Perl スタイルの正規表現など)が明示的にサポートされているかどうかはわかりません。ただし、次のように、レクサーが改行を明示的なトークンに変換できるようにする必要があります。

parser.mly

%token EOL
%token <int> EOLWS
% other stuff here
%%
main:
    EOL stmt                { MyStmtDataType(0, $2) }
  | EOLWS stmt              { MyStmtDataType($1 - 1, $2) }
 ;

lexer.mll

{
 open Parser
 exception Eof
}
rule token = parse
    [' ' '\t']           { token lexbuf }     (* skip other blanks *)
  | ['\n'][' ']+ as lxm  { EOLWS(String.length(lxm)) }
  | ['\n']               { EOL }
  (* ... *)

これはテストされていませんが、一般的な考え方は次のとおりです。

  • 改行をステートメントの「スターター」として扱う
  • 改行の直後の空白を測定し、その長さをint

\n警告: 入力が含まれていない場合は、単一で開始するように入力を前処理する必要があります。

于 2011-03-15T17:00:40.960 に答える