2016-03-24 2 views
0

Мы пишем компилятор в OCaml для нашего собственного домена. Пока у нас есть рабочий сканер, парсер и аш.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" 

ли я Помогите ? ;-)

+0

Да, это очень полезно. Благодарю. Это дает мне предупреждение, что переменная 'p' нигде не используется. – fomkatya

+0

Да, это потому, что я не знаю, что вы хотите с этим делать. Если вы написали в своем парсере% start prog, то _p_ будет иметь тип _Ast.ast_, и вы сделаете все, что хотите с ним ;-) Если вы не хотите его использовать, просто напишите _let _ = Parser. prog Lexer.token lb_ _ (не забывайте поднимать и принимать ответ; -)) _ – Lhooq

+0

Что будет удерживать эта переменная? – fomkatya

Смежные вопросы