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