OCamlに関しては、私は完全な初心者です。私は最近(約2週間前に)その言語を使い始めたばかりですが、残念ながら、構成された言語の構文アナライザー(パーサー+レクサー、その機能は文を受け入れるかどうかのどちらかです)を作成する必要がありますMenhirを使用します。今、私はインターネット上でOCamlとMenhirに関するいくつかの資料を見つけました:
メンヒルマニュアル。
SourceforgeのTossのホームページにあるMenhirの短いチュートリアル。
derdonによるgithubのMenhirの例。
OCamlに関する本(ocamllex +ocamlyaccに関するいくつかのことを含む)
SooHyoungOhによるランダムなocamllexチュートリアル。
そして、Menhirのソースコードに付属している例。
(2つ以上のハイパーリンクを配置できないため、ここで言及しているWebサイトの一部に直接リンクすることはできません。申し訳ありません!)
ご覧のとおり、このプログラムの作成に役立つ資料を必死に探しています。残念ながら、私はまだ多くの概念を理解することができず、そのため、私は多くの、多くの困難を抱えています。
手始めに、プログラムを正しくコンパイルする方法がわかりません。私は次のコマンドを使用しています:
ocamlbuild -use-menhir -menhir "menhir --external-tokens Tokens" main.native
私のプログラムは4つの異なるファイルに分かれています:main.ml; lexer.mll; parser.mly; tokens.mly。main.mlは、引数として指定されたファイルシステム内のファイルから入力を取得する部分です。
let filename = Sys.argv.(1)
let () =
let inBuffer = open_in filename in
let lineBuffer = Lexing.from_channel inBuffer in
try
let acceptance = Parser.main Lexer.main lineBuffer in
match acceptance with
| true -> print_string "Accepted!\n"
| false -> print_string "Not accepted!\n"
with
| Lexer.Error msg -> Printf.fprintf stderr "%s%!\n" msg
| Parser.Error -> Printf.fprintf stderr "At offset %d: syntax error.\n%!" (Lexing.lexeme_start lineBuffer)
2番目のファイルはlexer.mllです。
{
open Tokens
exception Error of string
}
rule main = parse
| [' ' '\t']+
{ main lexbuf }
| ['0'-'9']+ as integer
{ INT (int_of_string integer) }
| "True"
{ BOOL true }
| "False"
{ BOOL false }
| '+'
{ PLUS }
| '-'
{ MINUS }
| '*'
{ TIMES }
| '/'
{ DIVIDE }
| "def"
{ DEF }
| "int"
{ INTTYPE }
| ['A'-'Z' 'a'-'z' '_']['0'-'9' 'A'-'Z' 'a'-'z' '_']* as s
{ ID (s) }
| '('
{ LPAREN }
| ')'
{ RPAREN }
| '>'
{ LARGER }
| '<'
{ SMALLER }
| ">="
{ EQLARGER }
| "<="
{ EQSMALLER }
| "="
{ EQUAL }
| "!="
{ NOTEQUAL }
| '~'
{ NOT }
| "&&"
{ AND }
| "||"
{ OR }
| '('
{ LPAREN }
| ')'
{ RPAREN }
| "writeint"
{ WRITEINT }
| '\n'
{ EOL }
| eof
{ EOF }
| _
{ raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) }
3番目のファイルはparser.mlyです。
%start <bool> main
%%
main:
| WRITEINT INT { true }
4つ目はtokens.mlyです
%token <string> ID
%token <int> INT
%token <bool> BOOL
%token EOF EOL DEF INTTYPE LPAREN RPAREN WRITEINT
%token PLUS MINUS TIMES DIVIDE
%token LARGER SMALLER EQLARGER EQSMALLER EQUAL NOTEQUAL
%token NOT AND OR
%left OR
%left AND
%nonassoc NOT
%nonassoc LARGER SMALLER EQLARGER EQSMALLER EQUAL NOTEQUAL
%left PLUS MINUS
%left TIMES DIVIDE
%nonassoc LPAREN
%nonassoc ATTRIB
%{
type token =
| ID of (string)
| INT
| BOOL
| DEF
| INTTYPE
| LPAREN
| RPAREN
| WRITEINT
| PLUS
| MINUS
| TIMES
| DIVIDE
| LARGER
| SMALLER
| EQLARGER
| EQSMALLER
| EQUAL
| NOTEQUAL
| NOT
| AND
| OR
| EOF
| EOL
%}
%%
ここに未使用のシンボルがたくさんあることはわかっていますが、パーサーでそれらを使用するつもりです。ファイルにいくつ変更を加えても、コンパイラーは私の顔を爆破し続けます。私は考えられるすべてのことを試しましたが、何もうまくいかないようです。バインドされていないコンストラクターと未定義の開始シンボルの多数のエラーでocamlbuildを爆発させているのは何ですか?プログラムを正しくコンパイルするには、どのコマンドを使用する必要がありますか?メンヒルについて学ぶための意味のある資料はどこにありますか?