![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Текстовый интерпритатор [D6, D7, Win95/98, WinXP]
Kolan © (2004-09-30 20:15:00)Здравствуйте,
Не раскажите где взять такой компонент или хотя бы как его написать. Задача - сделать вычисления по заданной ф-ции.
jack128 (2004-10-01 19:43:00) [1]а ScripControl не пойдет??
TUser (2004-10-01 15:39:00) [2]Могу ошибаться, но кажется в jedi есть парсер. А ваще - парсеров по сети полно, это правда.
И не так уже это сложно - надо только начать.
Mystic (2004-10-01 15:37:00) [3]Если это интерпретатор математических выражений, то я бы скачал на torry YACC+LEX, после чего откомпилировал бы следующий исходник:
Expr.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);
Expr.y
/* 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.
Kolan (2004-10-01 15:32:00) [4]Обратную Польскую Запись я знаю в "Школе" учил. Знаю как реализовать (в теории + есть текс) с помошью стека или дерева (не помнь уже как там делали). Но то для чего это нужно не соответствует затраченным силам для написания алгоритма.
P.S. Глянте мою тему про установку (Delphi + новая компонента = НЕРАБОТАЕТ delphi) чё-то не пойму где глюк?
Ega23 (2004-10-01 14:55:00) [5]Поищи на Яндексе про Обратную Польскую Запись. Почитай внимательно. Разберись. Потом поищи алгоритм интерпритации математических выражений. Разберись.
После этого написать свой парсер у тебя не составит никакого труда.
Amoeba (2004-10-01 14:55:00) [6]Называются такие штуки математическими парсерами
Kolan (2004-10-01 14:41:00) [7]Скажите как это называется правильно. Я сюда не постил ебы сам нашел. Вот такое мне и надо считать sin(x)*cos(x^y)+exp(cos(x))
Ega23 (2004-10-01 14:08:00) [8]А я сам писал, в своё время. Алгоритмы - в сети сколько угодно, хоть залейся. А программа была - построение поверхностей второго порядка.
TUser (2004-10-01 14:04:00) [9]www.torry.net
Kolan (2004-10-01 13:58:00) [10]
> Erik1 © (01.10.04 10:57) [3]
> Вобщето можно небольшой нитерпритатор математических выражений
> поискать. Их довольно монго, есть и Free.
подскажи где
> Babay © (01.10.04 07:37) [1]
> У меня есть модуль для вычисления выражений заданных в строку
> типа sin(x)*cos(x^y)+exp(cos(x)) если что могу выслать через
> асю 274945578. Незабудь представится, а то в игнор....
Скинь на мыло kolan_nick@mail.ru
Благодарю
Amoeba (2004-10-01 11:06:00) [11]Например, есть (некомпонентный класс) в RxLib/JVCL
Erik1 (2004-10-01 10:57:00) [12]Вобщето можно небольшой нитерпритатор математических выражений поискать. Их довольно монго, есть и Free.
Ozone (2004-10-01 08:45:00) [13]Смотри в сторону обратной польской нотации
Babay (2004-10-01 07:37:00) [14]У меня есть модуль для вычисления выражений заданных в строку типа sin(x)*cos(x^y)+exp(cos(x)) если что могу выслать через асю 274945578. Незабудь представится, а то в игнор....