Форум: "Основная";
Текущий архив: 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.037 c