Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Из PHP в VB6, eval 
:(
    Опции темы
CyClon
Дата 18.3.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



В PHP есть функция eval, которая представляет текст в виде кода, к примеру:

Код
eval("echo \"Text\";");


Мне нужно получить то же самое в VB, для создания калькулятора. То есть у меня есть str.Text, в котором приписан всяки бред типо "2 + 3" или "2 * (2 + 2)". В общем калькулятор. Как подсчитать все, что в поле str.Text ?

И вообще, объясните теорию создания нормального калькулятора.


--------------------
user posted image
PM   Вверх
cardinal
Дата 19.3.2006, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата(CyClon @ 18.3.2006, 21:11 Найти цитируемый пост)
То есть у меня есть str.Text, в котором приписан всяки бред типо "2 + 3" или "2 * (2 + 2)". В общем калькулятор. Как подсчитать все, что в поле str.Text ?

Как самый простой вариант можно вставить это в Excel (программно само собой) ячейку как формулу и заставить его считать.
Цитата(CyClon @ 18.3.2006, 21:11 Найти цитируемый пост)
И вообще, объясните теорию создания нормального калькулятора.

Читаем про синтаксический разбор и анализ (парсеры, лексеры...)
Вот тебе пример простенького калькулятора на языке sml (http://www.dina.kvl.dk/~sestoft/mosml.html):
Код

datatype token = INT of int | ADD | SUB | MUL | LPAR | RPAR;
exception Error;
fun num n nil     = (n,nil)
    | num n (x::xs) = if Char.isDigit(x) then num (n*10 + (ord(x)-48)) xs else (n,(x::xs));
fun what x y = case y of             (* Error *)
               #"+"  => ADD::x
             | #"*"  => MUL::x
             | #"-"  => SUB::x
         | #"("  => LPAR::x
             | #")"  => RPAR::x
         | _     => raise Error;
fun lex x nil = x                    (* Error *)
  | lex x (y::ys) = let fun lex' ((x,(y::ys)),z) = if y = #" " orelse y = #"\n" then lex' ((num x ys),z)
                                              else if y = #"(" then lex' ((num 0 ys),(what z y))
                          else lex' ((num 0 ys),(what ((INT x)::z) y))
                          | lex' ((x,nil),z)     = rev(INT x::z)
                    in lex' ((num 0 (y::ys)),x)
                    end;
fun atom nil = raise Error           (* Error *)
  | atom (x::xs) = case x of
                   (INT n) => (n,xs)
          | LPAR  => (exp(xs))
          | RPAR  => (exp(xs))
                  |  _    => raise Error
and term' (n,nil)     = (n,nil)      (* Error *)
  | term' (n,(x::xs)) = let fun term'' ((n,(x::xs)),z) = if x = MUL
                                                         then term''((atom(xs)),(z*n))
                                                         else (z*n,(x::xs))
                              | term'' ((n,nil),z)     = (z*n,nil) 
                        in term''((n,(x::xs)),1)
                        end
and term nil = (0,nil)               (* Error *)
    | term (x::xs) = term' (atom(x::xs))
and exp' (n,nil)     = (n,nil)       (* Error *)
  | exp' (n,(x::xs)) = let fun expSUB((n,(x::xs)),z) = if x = SUB
                                                       then expSUB((term(xs)),(z-n))
                                                       else exp'(z-n,(x::xs))
                             | expSUB((n,nil),z)     = (z-n,nil) 
                           fun expADD((n,(x::xs)),z) = if x = ADD
                                                       then expADD((term(xs)),(z+n))
                                                       else
                                                       if x = SUB
                                                       then expSUB((~(z+n),(x::xs)),0)
                                                       else (z+n,xs)
                             | expADD((n,nil),z)     = (z+n,nil) 
                       in expADD((n,(x::xs)),0)
                       end
and exp nil = (0,nil)                (* Error *)
    | exp (x::xs) = exp'(exp'(term(x::xs)));
fun eval s = if s = "" then "! Syntax error" else         (* Error *)
             let fun eval' (n,_) = Int.toString(n)
             in eval'(exp(lex nil(explode s)))
             handle Overflow => "! Overflow"
                  | Error    => "! Need an expression"
         end;
fun echo () =
case TextIO.inputLine(TextIO.stdIn) of
  s => (print((eval s) ^ "\n"); echo())
val _ = 
    case (CommandLine.arguments()) of
      s =>  (print(eval (concat(s)) ^ "\n"); echo())

exe-шник тоже прицепляю, можешь таким образом узнать, что он умеет.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  _.exe 28,41 Kb


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.