Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2018-10-29 16:52:45 ЛС | профиль | цитата
Вот моё решение проверки наличия локальной переменной в lng.decl_loc_var():
direct.inc

...
function BlockContains(Block: TCodeBlock; const S: string): Boolean;
var
I: Integer;
begin
for I := 0 to Block.CurList.Count - 1 do
begin
if S = PScData(Block.CurList.Items[i]).value.sdata then // Ищет только на совпадение целой строки
//if IndexOfStr(PScData(Block.CurList.Items[i]).value.sdata, S) > -1 then // Ищет часть строки
begin
Result := True;
Exit;
end;
end;
Result := False;
end;
...

function lng_proc(parser:TParser; obj:pointer; index:integer; args:TArgs):TScData;
var
dt: PScData;
old, s: string;
t: integer;
begin

...

lng_blk_loc_var:
begin
dt := GVarList.find('loc_vars');
if dt = nil then
parser.debug('LOC_VARS - not found')
else
begin
old := parser.codeb.select(dt.toStr());
s := args.Values[0].toStr + ':' + args.Values[1].toStr + ';';
// Проверяем наличие строки в блоке
if not BlockContains(parser.codeb, s) then
begin
parser.Print(s);
parser.PrintLine;
end;
parser.codeb.select(old);
end;
end;

...

end;

hiFor.hws

func doFor
  fvar(old,step_code,end_num,start_num)
//lang(i:int) // Хоть убей - не понимаю принципа этого. С ним - не работает.

end_num = End
start_num = Start

lng.decl_loc_var(i,'integer')
if(isndef(IncludeEnd))
end_num = end_num && ' - 1'
end

println('for ', i, ' := ', start_num, ' to ', end_num, ' do')
lng.begin()
event(onEvent, i)
lng.end()

event(onStop)
end

Считаю неправильным вынесение в direct.inc того, что можно сделать на чистом FTCG (lng.decl_priv_var/lng.decl_loc_var). Можно было сделать подключаемый общий *.hws файл с требуемыми функциями.
карма: 26

0
Редактировалось 3 раз(а), последний 2018-10-29 16:56:22