2016-03-24 5 views
0

私たちは独自のドメイン固有の言語のためにOCamlにコンパイラを書いています。これまでのところ、私たちはスキャナ、パーサ、astを操作しています。OCaml:スキャナとパーサーをテストするには?

この時点でスキャナ/パーサーをテストする最良の方法は何ですか?パーサ/スキャナに一連のトークンを渡して、それがスキャナ/パーサによって受け入れ/拒否されるかどうかを確認することは可能です。 (例えば、echo "FLOAT ID" | menhir --interpret --interpret-show-cst parser.mly)。
しかし、私たち自身の言語で書かれた実際のプログラムをスキャナ/パーサに渡し、それが受け入れられるかどうかを確認する方法はありますか?

私はOCamlには新しく、コンパイラについてはほとんど分かりません。

+0

Lexing.from_channelまたはLexing.from_stringを使用できませんか? _val from_string:string - > lexbuf 指定された文字列から読み込むレクサーバッファを作成します。読み込みは文字列の最初の文字から始まります。文字列の終わりに達すると、入力終了条件が生成されます._ – Lhooq

+0

例を挙げてください。 – fomkatya

答えて

2

何がやりたいことは、あなたのパーサーに文字列を与えると、それが動作するかどうかを確認する場合は、この

main.ml : 
let() = 
    (* Taking the string given as a parameter or the program *) 
    let lb = Lexing.from_string Sys.argv.(1) in 
    (* if you want to parse a file you should write : 
     let ci = open_in filename in 
     let lb = Lexing.from_channel ci in 
    *) 
    try 
     let p = Parser.prog Lexer.token lb in 
     Printf.printf "OK\n" 
    with _ -> Printf.printf "Not OK\n" 

はIをDID(パーサで想定あなたの出発点はPROGで)行うことができます助けて ? ;-)

+0

はい、これは非常に役に立ちます。ありがとう。変数 'p'がどこにも使われていないという警告が表示されます。 – fomkatya

+0

はい、私はあなたがそれで何をしたいのか分からないからです。あなたが書いたのであれば、パーサーで% progを起動し、_p_は_Ast.ast_型になります。あなたがやりたいことを何でもします;-)使用しない場合は、_let _ = Parserと書いてください。 prog Lexer.token lb_ _(upvoteを忘れずに回答を受け入れる; - ))_ – Lhooq

+0

この変数は何を保持する予定ですか? – fomkatya

関連する問題