类似早期编程语言中的宏替换问题,似乎是现在的开发语言不支持了,谁有好办法?(200分)

  • 主题发起人 主题发起人 chinahawk
  • 开始时间 开始时间
C

chinahawk

Unregistered / Unconfirmed
GUEST, unregistred user!
[purple][/purple]要做一个类似早期FOX语言中的宏替换语句的函数,实现下面的结果,
string souse;
float des;

souse:='5+4'
des:=TheFun(souse);
//des:=9;

注:TheFun就是此函数,有谁知道如何做此函数?
OICQ:69726710
 
DELHI肯定不支持宏替换语句了但如果只是一个简单的表达式则可以先找出中间的符号然后
分别取出符号左右两边的数字再判断是什么符号(+/-/*)来做运算再返回结果
 
当然不是简单的表达式了,可以是动态的!
 
编译型语言不可能支持宏替换。只有边解释-边执行的语言才有可能。

解决办法是做一个词法分析器(很复杂的东西,只能根据实际情况来写)。
一般情况下,可以利用SQL的词法分析器,不用自己写了。
 
其实用FORMAT函数就可以达到你的要求
 
micro73,
good idea
 
一个是采取Windows里面的ActiveX Script控件!
另外可以参考CSDN的ZsWang写的代码:
调用:
Calc('3+3+1')看看?
ZsWang
//完整代码
uses
Math;

procedure Bracket(mText: string; var nLStr, nCStr, nRStr: string);
var
L, R: Integer;
I: Integer;
B: Boolean;
begin
nLStr := '';
nCStr := '';
nRStr := '';
B := True;
L := 0;
R := 0;
for I := 1 to Length(mText) do
if B then begin
if mText = '(' then
Inc(L)
else if mText = ')' then
Inc(R);
if L = 0 then
nLStr := nLStr + mText
else if L > R then
nCStr := nCStr + mText
else B := False;
end else nRStr := nRStr + mText;
Delete(nCStr, 1, 1);
end; { Bracket }

function Calc(mText: string): string;
var
vText: string;

function fCalc(mText: string): string;
var
vLStr, vCStr, vRStr: string;
I, J, K, L: Integer;
begin
L := Length(mText);
if Pos('(', mText) > 0 then begin
Bracket(mText, vLStr, vCStr, vRStr);
Result := fCalc(vLStr + fCalc(vCStr) + vRStr);
// ~
end else if (Pos('+', mText) > 0) or (Pos('-', mText) > 0) then begin
I := Pos('+', mText);
J := Pos('-', mText);
if I = 0 then I := L;
if J = 0 then J := L;
K := Min(I, J);
vLStr := Copy(mText, 1, Pred(K));
vRStr := Copy(mText, Succ(K), L);
if vLStr = '' then vLStr := '0';
if vRStr = '' then vRStr := '0';
if I = K then
Result := FloatToStr(StrToFloat(fCalc(vLStr)) + StrToFloat(fCalc(vRStr)))
else Result := FloatToStr(StrToFloat(fCalc(vLStr)) - StrToFloat(fCalc(vRStr)))
end else if (Pos('*', mText) > 0) or (Pos('/', mText) > 0) then begin
I := Pos('*', mText);
J := Pos('/', mText);
if I = 0 then I := L;
if J = 0 then J := L;
K := Min(I, J);
vLStr := Copy(mText, 1, Pred(K));
vRStr := Copy(mText, Succ(K), L);
if vLStr = '' then vLStr := '0';
if vRStr = '' then vRStr := '0';
if I = K then
Result := FloatToStr(StrToFloat(fCalc(vLStr)) * StrToFloat(fCalc(vRStr)))
else Result := FloatToStr(StrToFloat(fCalc(vLStr)) / StrToFloat(fCalc(vRStr)))
end else if Pos('_', mText) = 1 then
Result := FloatToStr(-StrToFloat(fCalc(Copy(mText, 2, L))))
else Result := FloatToStr(StrToFloat(mText));
end;
var
I, L: Integer;
begin
vText := '';
L := Length(mText);
for I := 1 to L do
if (mText = '-') and (I < L) and (not (mText[Succ(I)] in ['+', '-', '(', ')'])) then
if (I = 1) or ((I > 1) and (mText[Pred(I)] in ['*', '/'])) then
vText := vText + '_'
else if ((I > 1) and (mText[Pred(I)] in ['+', '-'])) or
((I > 1) and (mText[Pred(I)] = ')') and (I < L) and
(not (mText[Succ(I)] in ['+', '-', '(', ')']))) then
vText := vText + '+_'
else vText := vText + mText
else vText := vText + mText;
Result := fCalc(vText);
end; { Calc }
 
先谢谢Kingron,我试试!
 
如果其中套用公式或函数怎么解决好些,并且公式可以进行添加删除等操作,
其实就是实现公式的汉字化,这样不懂英文的朋友就方便多了!
这个东西在做数据库查询时比较有用,可以让普通人实现复杂的综合查询,我以前见过别
人用FOX做过,并且实际应用中反映很好!
 
多人接受答案了。
 
后退
顶部