Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Преобразование строки в число   Найти похожие ветки 

 
Kiber   (2004-03-22 19:56) [0]

Как преобразовать строку типа "(3*4-5/2+1)*2-8..." в число?


 
Тимохов ©   (2004-03-22 19:57) [1]

написать:
1. лексический анализатор
2. синтаксический анализатор
3. (может быть) семантический анализатор
4. рекурсивное вычесление по дереву разбора

либо загрузить готовый компонент, делающий все это.


 
Defunct ©   (2004-03-22 20:05) [2]

calc.dll,

функция:
calculate(St:ShortString):ShortString;stdcall;external "calc.dll";

скачать можно здесь:
http://dca.narod.ru/files/calc.dll


 
$tranger ©   (2004-03-22 20:41) [3]

Поищи в местной кладовке, но далеко не на первой вкладке...


 
Mox Fulder ©   (2004-03-22 23:18) [4]

Можно поискать про "польскую запись", а там - элементарное вычисление спощью стэка.


 
Kiber   (2004-03-23 10:06) [5]

В местной кладовке все эти комноненты обладают недостатками. А dll лень тащить вместе с прогой.


 
Ega23 ©   (2004-03-23 10:25) [6]

Ну если так, то пиши сам.


 
kiber   (2004-03-23 11:05) [7]

Спасибо, как-то не хочется.


 
Тимохов ©   (2004-03-23 11:08) [8]


> Спасибо, как-то не хочется.

зато полезно очень - мало кто вообще умеет делать полный цикл описанный в 1. Кусками делать умеют многие, а полностью сделать по правилам - я таких не знаю, вернее знаю одного, но он сейчас в лондоне в аспирантуре преподает.


 
Ozone ©   (2004-03-23 11:13) [9]

http://algolist.manual.ru/syntax/revpn.php


 
Goida ©   (2004-03-23 11:52) [10]

А что будет быстрее работать:
- построение дерева по этой строке
или
- с помощью функций разбор с рекурсией.


 
Goida ©   (2004-03-23 11:52) [11]

А что грамотнее?... Рациональнее?


 
Тимохов ©   (2004-03-23 11:54) [12]

дерево перспективней
развивать легче


 
Матлабист   (2004-03-23 13:47) [13]

Я бы скачал на torry YACC+LEX, после чего откомпилировал бы следующий исходник (он же есть и в примере):

 (* Lexical analyzer for the sample Yacc program in Expr.y. *)

L                [A-Za-z]
D                [0-9]

%%

 var result : integer;

{D}+(\.{D}+)?([Ee][+-]?{D}+)?    begin
                 val(yytext, yylval.yyReal, result);
                 if result=0 then
                   return(NUM)
                 else
                   return(ILLEGAL)
               end;

{L}                begin
                 yylval.yyInteger := ord(upCase(yytext[1]))-
                                     ord("A")+1;
                 return(ID)
               end;

" "                     ;

.                |
\n                returnc(yytext[1]);

":="                             return(ASSIGN);


/* Sample Yacc grammar for a simple desktop calculator; derived from a
  grammar in Aho et al: Compilers. Principles, Techniques and Tools (Sect.
  4.9).

  Lexical analyzer is in Lex program ExprLex.l.

  To compile parser and lexical analyzer, issue the following commands:

    yacc expr
    lex  exprlex
    tpc  expr

  Description: This program reads simple arithmetic expressions, constructed
  with real constants, operators +, -, *, /, unary - and parentheses
  (operators have their usual precedence, unary minus is highest), from
  standard input (one per line) and prints the result on standard output.
  Variables are denoted by a single letter (no distinction between upper and
  lowercase letters); they are assigned values through an assignment of the
  form <var>=<expr>.
  The program is terminated by entering an empty line. */

%{

{$APPTYPE CONSOLE}

program Expr;

uses YaccLib, LexLib, SysUtils, Classes;

var x : array [1..26] of Real;

procedure yydebugoutput(msg : string);
begin
WriteLn(Format("yacc parser error: %s, yystate=%d", [msg, yystate]));
end;

%}

%token <Real> NUM       /* constants */
%token <Integer> ID     /* variables */
%type <Real> expr    /* expressions */

%left "+" "-"          /* operators */
%left "*" "/"
%right UMINUS

%token ILLEGAL         /* illegal token */
%token ASSIGN             /* assign */

%%

input    : /* empty */
   | input "\n"         { yyaccept; }
   | input expr "\n"     { writeln($2:10:2); }
   | input ID ASSIGN expr "\n" { x[$2] := $4; writeln($4:10:2); }
   | error "\n"             { yyerrok; }
   ;

expr    :  expr "+" expr     { $$ := $1 + $3; }
   |  expr "-" expr     { $$ := $1 - $3; }
   |  expr "*" expr     { $$ := $1 * $3; }
   |  expr "/" expr     { $$ := $1 / $3; }
   |  "(" expr ")"         { $$ := $2; }
   |  "-" expr              { $$ := -$2; }
          %prec UMINUS
   |  NUM                   { $$ := $1; }
       |  ID                    { $$ := x[$1]; }
   ;

%%

{$I ExprLex}

var i : Integer;

begin
 for i := 1 to 26 do x[i] := 0.0;
 yyinput := TFileStream.Create(ParamStr(1), fmOpenRead);
 try
   if yyparse=0 then { done };
 finally
   FreeAndNil(yyinput);
 end;
 ReadLn;
end.


 
Fay ©   (2004-03-23 13:51) [14]

Вот бы посмотеть, как бы ты его откомпилировал бы...


 
kiber   (2004-03-23 14:57) [15]

На польской записи все исходники на си. Может, кто знает где достать компонент с мощью компилятора?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.041 c
14-1079171594
ChcngerMan
2004-03-13 12:53
2004.04.11
Просто интересно :)


6-1075029390
Barmutik
2004-01-25 14:16
2004.04.11
WebBrowser и HTTPS сессия


1-1080224872
PiratA
2004-03-25 17:27
2004.04.11
RxLIB


7-1076090147
!MS
2004-02-06 20:55
2004.04.11
Хеш текущего юзера


3-1079530237
Layner
2004-03-17 16:30
2004.04.11
Как запретить удалить запись с опред ID (Значением поля)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский