OCaml + Menhir Компиляция/Написание

Я полный новичок, когда дело доходит до OCaml Я только недавно начал использовать язык (около 2 недель назад), но, к сожалению, передо мной стояла задача сделать синтаксический анализатор (парсер + лексер, функция которого либо принять, либо не принять предложение) для сделанного язык с помощью Menhir Теперь я нашел в Интернете некоторые материалы, касающиеся OCaml и Menhir:

The Menhir Manual.

Эта веб-страница с курсом французского университета.

Краткое руководство по Menhir на домашней странице Toss в Sourceforge.

Пример Menhir на github от derdon.

Книга по OCaml (с некоторыми сведениями об ocamllex+ocamlyacc

Случайный учебник по ocamllex от SooHyoung Oh.

И примеры, которые поставляются с исходным кодом Menhir.

(Я не могу добавить больше чем две гиперссылки, поэтому я не могу связать вас напрямую с некоторыми из упомянутых здесь веб-сайтов. Извините!)

Итак, как видите, я отчаянно искал все больше и больше материала, в создании этой программы. К сожалению, я до сих пор не могу понять многих понятий, и поэтому у меня много, много трудностей.

Во-первых, я понятия не имею, как правильно скомпилировать мою программу. с помощью следующей команды:

ocamlbuild -use-menhir -menhir "menhir --external-tokens Tokens" main.native

Моя программа разделена на четыре разных файла: main.ml, lexer.mll, parser.mly, tokens.mly. в качестве аргумента

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)

Второй файл 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))) }

Третий файл parser.mly

%start  main
%%

main:
| WRITEINT INT { true }

Четвертый файл tokens.mly

%token  ID
%token  INT
%token  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 взрываться множеством ошибок несвязанных конструкторов и неопределенных начальных символов? Какую команду я должен использовать для правильной компиляции программы? Где я могу найти полезные материалы для изучения Менгира?

12
задан Thomash 7 May 2013 в 12:18
поделиться