LuNA-Static-Analysis / LuNA-Static-Analysis-Repository

1 stars 0 forks source link

luna-static-checker: Доделать обход AST на Prolog (атомарные ФК) #23

Closed m-michurov closed 8 months ago

m-michurov commented 12 months ago

Пример:

import c_init( name, int) as init;
import c_print( value) as print;

sub init_1(name arr, int ind) {     
    init(arr[ind], 0);                     
}

sub init_2(name arr, int ind) {
    init(arr[ind], 1);
}

sub main() {                            
    df x;                               
    for i = 0..1250 {
        init_1(x, 2*i);    
        print(x[2*i]) @{                
            delete x[2*i];
        };
        init_2(x, 2*i+1);
        print(x[2*i+1]) @{
            delete x[2*i+1];
        };
    }
}

Вывод обхода: (тут [8, 9] - идентификаторы выражений в теле main, а [7] - начальный стек вызовов (идентификатор main))

?- walk([8, 9], aliases{}, [7]).                                                                                 
> Loop "for" with "LUNA_i" from 0 to 1250 (body aliases: _984{'LUNA_i':"Var9_7__LUNA_i",'LUNA_x':"Var7__LUNA_x"})
   "7:211:main -> 9:297:for"                                                                                     
> Calling "init_1" (struct) with args aliases{'LUNA_arr':"Var7__LUNA_x",'LUNA_ind':["*",2,"Var9_7__LUNA_i"]}     
   "7:211:main -> 9:297:for -> 11:323:init_1"                                                                    
> Calling "init" (extern) with args [luna_ref(["Var7__LUNA_x",["*",2,"Var9_7__LUNA_i"]]),0]                      
   "7:211:main -> 9:297:for -> 11:323:init_1 -> 3:110:init"                                                      
true ;
> Calling "init_2" (struct) with args aliases{'LUNA_arr':"Var7__LUNA_x",'LUNA_ind':["+",["*",2,"Var9_7__LUNA_i"],1]}
   "7:211:main -> 9:297:for -> 13:430:init_2"
> Calling "init" (extern) with args [luna_ref(["Var7__LUNA_x",["+",["*",2,"Var9_7__LUNA_i"],1]]),1]
   "7:211:main -> 9:297:for -> 13:430:init_2 -> 6:189:init"
true ;
> Calling "print" (extern) with args [luna_ref(["Var7__LUNA_x",["*",2,"Var9_7__LUNA_i"]])]
   "7:211:main -> 9:297:for -> 12:351:print"
true ;
> Calling "print" (extern) with args [luna_ref(["Var7__LUNA_x",["+",["*",2,"Var9_7__LUNA_i"],1]])]
   "7:211:main -> 9:297:for -> 14:456:print"
true ;
false.