Как создать программу, объединяющую Parser и Lexer

Я хочу создать компилятор, используя Ocamllex/Ocamlyacc, и я хочу создать основную программу, объединяющую оба моих OcamlParser и OcamlLexer. Дело в том, что я знаю, как это сделать, используя ввод в командной строке, например следующий код:

let _ =
  try
    let lexbuf = Lexing.from_channel stdin in
    while true do
      let result = Parser.main Lexer.token lexbuf in
      print_int result; print_newline(); flush stdout
    done
  with Lexer.Eof ->
    exit 0

Но как мне поступить, если я хочу использовать файл в качестве входных данных; Я пробовал что-то вроде этого:

let file ="add.txt"
    let _ =
     let ic = open_in file in 
      try
        let lexbuf = Lexing.from_channel file in
        while true do
          let result = Parser.main Lexer.token lexbuf in
          print_int result; print_newline(); flush stdout
        done
      with Lexer.Eof ->
        exit 0

Но на самом деле это не работает.


person Anas El Kesri    schedule 05.08.2015    source источник
comment
Не могли бы вы предоставить более конкретное описание ошибки, чем то, что она действительно не работает?   -  person sepp2k    schedule 05.08.2015


Ответы (1)


Следующий код работает для меня. В вашей версии есть синтаксические ошибки.

let _ =
      let file ="add.txt" in
      let i = open_in file in 
      try
        let lexbuf = Lexing.from_channel i in
        while true do
          let result = Parser.main Lexer.token lexbuf in
          print_int result; print_newline(); flush stdout
        done
      with Lexer.Eof ->
        exit 0

Ввод 1+2 в «add.txt» дает мне 3.

person alifirat    schedule 05.08.2015
comment
Большое спасибо за ваш ответ. На самом деле я пытаюсь создать компилятор, чтобы я мог сказать, соответствует ли ввод грамматике или нет... Знаете ли вы, можно ли узнать, где находится синтаксическая ошибка? - person Anas El Kesri; 06.08.2015
comment
Когда вы говорите о синтаксической ошибке, речь идет о вводе, который вы вводите? - person alifirat; 06.08.2015
comment
Посмотрите следующий ответ, это именно то, что вам нужно: /14046392/ - person alifirat; 06.08.2015