Re: Помогите с Ocaml кто чем сможет,как написать...
От: palm mute  
Дата: 25.04.07 20:01
Оценка: 10 (1)
Здравствуйте, MacDed, Вы писали:

MD>Здраствуйте все при все!

MD>Вопрос у меня такой:
MD>Нужно написать интерпритатор мат выражений на Ocaml ,есть знаки : '+','-','*','/' т.е.
MD>чтоб такие вещи обрабатывал
MD> (((1+1)+(4-5))*3+14/3)/3-43+(53+61)

Я так понимаю, задача учебная (кстати, любопытно, это где у нас теперь Окамл изучают?).
Поэтому всю тяжелую артилерию (ocamllex/ocamlyacc, menhir, streams & parsers library) отбрасываем, полезнее будет сделать все вручную.

У тебя есть следующие подзадачи:

1. Лексер: из исходной строки получает список токенов (на этом ты и застрял, я так понимаю).
2. Парсер: из списка токенов строим AST. Тебе надо определить тип данных, представляющий синтаксическую структуру выражения:
type Exp = Const of float | Plus of (Exp * Exp) | ...

Это один возможный вариант, выражение также может быть представлено в виде стека (гуглим по словам "Дейкстра", "Обратная польская нотация", там же узнаешь, как написать парсер математических выражений).
В конце концов, парсер может не строить промежуточных структур, а вычислять все на ходу (этот вариант мне меньше всего нравится, хотя иногда он будет самым эффективным).
3. Собственно, интерпретатор. Это будет функция типа Exp -> float. Эскиз:
eval exp = match exp with
| Const c -> c
| Plus (x, y) -> eval x +. eval y
(* etc *)

MD>1)Как мне это сделать если для роботы с исходной строкой я юзаю s.[count] — а это символ?

MD>2)Есть ли функции для того чтоб сивол преобразовать в строку?
let string_of_char c = String.make 1 c
(* или даже так *)
let string_of_char = String.make 1

Разбить выражение на список подстрок можно еще так (нужно подключить модуль str.cma):
let split_expr_str = Str.split (Str.regexp "[()+-/* ]")
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.