Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / OCaml, Lexer / 2 сообщений из 2, страница 1 из 1
05.10.2012, 22:01
    #37986097
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OCaml, Lexer
Ну вот я добрался до Lexer'а. И опять напоролся на странности и непонятности.
На сейчас у меня есть код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
		method load file_name =
			let chan_in = Pervasives.open_in file_name in
			let lexbuf = Lexing.from_channel chan_in in
			try
				while not (lexbuf.Lexing.lex_eof_reached ) do
					code <- (Scanner.token lexbuf) :: code
				done;
				Pervasives.close_in chan_in;
				true;
			with Failure explanation -> begin
				let pos = Lexing.lexeme_start_p lexbuf in
				print_string ("\nReading " ^ file_name ^ " failed \n" ^ explanation ^ " at ");
				print_int pos.Lexing.pos_lnum;
				print_char ':';
				print_int (pos.Lexing.pos_cnum - pos.Lexing.pos_bol +1);
				print_newline();
				Pervasives.close_in chan_in;
				false;
			end;


Этот код корректно читает все токены в список. Но есть два вопроса:

1) Когда Lexer натыкается на плохое слово, он корректно ругается на первую букву этого слова. Но вот как выдать на экран это самое слово? Lexing.lexem lexbuf пуст, попытался взять текст напрямую из lexbuf.Lexing.lex_buffer, но я не знаю где конец плохого слова - не знаю что давать третьим параметром в String.sub.
В общем: КАК это сделать? Или есть более удобные методы обработки ошибок лексера?

2) Меня смущает вот этот copy-paste:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
			try
				(* *)
				Pervasives.close_in chan_in;
				true;
			with Failure explanation -> begin
				(* *)
				Pervasives.close_in chan_in;
				false;
			end;


Судя по документации, в OCaml нету "finally" блоков, так что вынести туда закрытие файла не получается.
В нормальном языке я бы завел булеву переменную и задавал бы ей true на входе в try, и false после поимки исключения. А потому же возвращал бы эту переменную. Но OCaml ненавидит изменяемые переменные... Как объявить mutable переменную внутри метода? На все попытки я получаю Syntax error.
...
Рейтинг: 0 / 0
06.10.2012, 09:01
    #37986286
k0rvin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OCaml, Lexer
White Owl2) Меня смущает вот этот copy-paste:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
			try
				(* *)
				Pervasives.close_in chan_in;
				true;
			with Failure explanation -> begin
				(* *)
				Pervasives.close_in chan_in;
				false;
			end;


Судя по документации, в OCaml нету "finally" блоков, так что вынести туда закрытие файла не получается.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
let foo () =
  try
    let x = 1 / 0 in
    print_int x
  with Division_by_zero ->begin
    print_string "Error"
  end;
  print_string "Finally"
;;

foo ()

White OwlВ нормальном языке я бы завел булеву переменную и задавал бы ей true на входе в try, и false после поимки исключения. А потому же возвращал бы эту переменную. Но OCaml ненавидит изменяемые переменные... Как объявить mutable переменную внутри метода? На все попытки я получаю Syntax error.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class foo =
  object
    method what () =
      let x = ref 1 in
      print_int !x;
      x := 2;
      print_int !x
  end;;

let f = new foo in
f#what ();;
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / OCaml, Lexer / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]