X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=mjc2wsl.git;a=blobdiff_plain;f=src-wsl%2Ftransf-exp.wsl;h=aeb3b32e1ea34491cf4bce4ac3d61c313785e8e3;hp=8bc0357c4510f13b0605ea5c0691a5604355e7c9;hb=84d0da471eb64cacd414f2e5de3d6c891522b1cc;hpb=dd51d4504d3c15dd2c58bf9ece80cd182b02d5d5;ds=inline diff --git a/src-wsl/transf-exp.wsl b/src-wsl/transf-exp.wsl index 8bc0357..aeb3b32 100755 --- a/src-wsl/transf-exp.wsl +++ b/src-wsl/transf-exp.wsl @@ -1,5 +1,5 @@ C:" -Copyright (C) 2012 Doni Pracner http://perun.dmi.rs/pracner +Copyright (C) 2012,2014 Doni Pracner http://perun.dmi.rs/pracner This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public @@ -19,8 +19,14 @@ License along with this program. If not, see =========================================================="; C:"Automatic transformation tool for simplification of WSL"; -C:"code automaticaly translated from assembly using asm2wsl."; -C:"a simple version"; +C:"code automaticaly translated from a low level language."; +C:"such as assembly or bytecode generated by our translators."; + +C:"experimental version"; + +C:"set the following so that Action Systems are not automaticaly treated as regular"; +Assume_A_S_Regular := 0; + MW_PROC @Process_Prog() == FOREACH Statement DO IF @Trans?(TR_Push_Pop) THEN @@ -31,6 +37,7 @@ MW_PROC @Process_Prog() == FOREACH Statement DO IF @ST(@I) = T_A_S THEN C:"don't need to test for this, works for T_A_S"; + @Trans(TR_Simplify_Action_System, ""); IF @Trans?(TR_Collapse_Action_System) THEN @Trans(TR_Collapse_Action_System, ""); FI; @@ -40,64 +47,109 @@ MW_PROC @Process_Prog() == @Delete FI OD; - FOREACH Statement DO - IF @Trans?(TR_Flag_Removal) THEN - @Trans(TR_Flag_Removal, ""); - FI - OD; + C:"remove all the comments "; FOREACH Statement DO IF @ST(@I) = T_Comment THEN @Delete FI OD; + FOREACH Statement DO + IF @Trans?(TR_Simplify_Item) THEN + @Trans(TR_Simplify_Item,"") + FI + OD; + C:"Convert DO loops into WHILE loops"; FOREACH Statement DO IF @Trans?(TR_Floop_To_While) THEN @Trans(TR_Floop_To_While, ""); FI OD; + FOREACH Statement DO + IF @Trans?(TR_Flag_Removal) THEN + @Trans(TR_Flag_Removal, ""); + FI + OD; C:"Go back to the start, and remove redundant"; @GOTO(< >); @Trans(TR_Delete_All_Redundant, ""); SKIP END; -BEGIN -VAR< prog := < >, inifilename := "transf.ini", - filename:="", file := "", inifile:= "" ->: -IF @File_Exists?(inifilename) THEN - inifile := @Open_Input_File(inifilename); - filename := @Read_Line(inifile); - WHILE NOT @EOF?(filename) DO +MW_PROC @Prog_Stat_Comp(Pro, After VAR)== + VAR < ma := 0, mb :=1 > : + ma := @McCabe(Pro); + mb := @McCabe(After); + PRINT ("McCabe ", ma, " ", mb, " ",(mb-ma)); + ma := @Stat_Count(Pro); + mb := @Stat_Count(After); + PRINT ("Statem ", ma, " ",mb, " ",(mb-ma)); + ma := @CFDF_Metric(Pro); + mb := @CFDF_Metric(After); + PRINT ("CF/DF ", ma," ", mb," ", (mb-ma)); + ma := @Total_Size(Pro); + mb := @Total_Size(After); + PRINT ("Size ", ma," ", mb, " ",(mb-ma)); + ma := @Struct_Metric(Pro); + mb := @Struct_Metric(After); + PRINT ("Struct ", ma, " ",mb, " ",(mb-ma)); + SKIP + ENDVAR +END; + +MW_PROC @Get_New_Name(VAR str) == + IF @Ends_With?(str, ".wsl") THEN + str := SUBSTR(str, 0, SLENGTH(str)-4) + FI; + str := str ++ "_t.wsl" +END; + +MW_PROC @Process_File(filename) == IF @File_Exists?(filename) THEN - PRINT(""); @New_Program(@Parse_File(filename, T_Statements)); PRINT("Processing: ", filename); prog := @Program; @Process_Prog(); - Get_New_Name(VAR filename); + @Get_New_Name(VAR filename); @PP_Item(@Program, 80, filename); - Prog_Stat(prog); - PRINT(""); - PRINT("After Conversion"); - Prog_Stat(@Program) - FI; - filename := @Read_Line(inifile) - OD; - @Close_Input_Port(inifile); + PRINT(""); + PRINT(filename); + @Prog_Stat_Comp(prog, @Program); + PRINT("") + ELSE + PRINT("ERROR: File ",filename," not found"); + FI +END; + +BEGIN +VAR< prog := < >, inifilename := "transf.ini", + filename:="", file := "", inifile:= "", + Argv := @Argv +>: +C:"First one is the script name that is being executed"; +Argv := TAIL(Argv); + +IF Argv = < > THEN + PRINT("no arguments passed; using ",inifilename); + IF @File_Exists?(inifilename) THEN + inifile := @Open_Input_File(inifilename); + filename := @Read_Line(inifile); + WHILE NOT @EOF?(filename) DO + PRINT(""); + @Process_File(filename); + filename := @Read_Line(inifile) + OD; + @Close_Input_Port(inifile); + ELSE + PRINT("ini file (",inifilename,") not found.", + " it should contain a list of filenames to be converted"); + PRINT("OR you can give command line arguments to be processed"); + FI ELSE - PRINT("ini file (",inifilename,") not found.", - " it should contain a list of filenames to be converted"); - PRINT("you can input a filename now:"); - filename := @Read_Line(Standard_Input_Port); - IF @File_Exists?(filename) THEN - @New_Program(@Parse_File(filename, T_Statements)); - @Process_Prog(); - Get_New_Name(VAR filename); - @PP_Item(@Program, 80, filename) - FI; + FOR arg IN Argv DO + @Process_File(arg); + OD FI ENDVAR WHERE @@ -111,13 +163,6 @@ PROC Prog_Stat(Pro VAR)== SKIP END -PROC Get_New_Name(VAR str) == - IF @Ends_With?(str, ".wsl") THEN - str := SUBSTR(str, 0, SLENGTH(str)-4) - FI; - str := str ++ "_t.wsl" -END - PROC Get_Before_Name(VAR str) == IF @Ends_With?(str, ".wsl") THEN str := SUBSTR(str, 0, SLENGTH(str)-4)