Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.185 c
7-1079636270
Константин
2004-03-18 21:57
2004.04.11
Автозапуск


1-1080055066
В л а д и м и р
2004-03-23 18:17
2004.04.11
Модальные формы


1-1082361509
xman
2004-04-19 11:58
2004.04.11
Конвертор


3-1079169631
Trap
2004-03-13 12:20
2004.04.11
Как организовать безопасность БД *.mdb


14-1078224465
_none_
2004-03-02 13:47
2004.04.11
продается теннисный стол