2011-03-15 4 views
3

ocamllexを使ってOCamlにおもちゃのプログラミング言語を書くのが面倒で、インデントの変更、Pythonスタイルに敏感な言語にしようとしていましたが、ocamllexの正規表現ルールで行の先頭に一致する問題があります。私は^を使用して行の始めに一致させていましたが、文字列の連結演算子であるOCamlでは慣れていました。OCamllexは行の先頭にマッチしますか?

+2

正規表現のための文法はここにあります。 http://caml.inria.fr/pub/docs/manual-ocaml/manual026.html#regexp – nlucaroni

+0

私はそれを見ました。私は何かが欠けていて、それ以上のものがあることを望んでいました。ありがとう! –

+0

問題ありません。 Lexに似ていると主張し、一般的な正規表現言語についての知識に基づいていることは間違いなく当然の仮定です。なぜ彼らがそれを含んでいないのか分かりません。これはfa.camlグーグルグループに尋ねる何かである可能性があります。 – nlucaroni

答えて

4

ゼロ長の一致するシンボルを明示的にサポートするかどうかはわかりません(たとえば、^のようなPerlスタイルの正規表現がありますか? 、位置ではなく、部分文字列と一致する)しかし、あなたはあなたのレクサーは、明示的なトークンに改行を入れてみましょうすることができるはず、このような何か:。

parser.mly

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

レクサー.mll

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

これはテストされていないですが、一般的な考え方は次のとおりです。すぐに改行をたどり、int としてその長さを渡す「スターター」

  • メジャー空白staetmentとして

    • トリート改行

    注意:最初に入力する前に、\nが含まれていない場合は入力を前処理する必要があります。

  • 関連する問題