DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 54906 (0xd67a) Types: TextFile Names: »B«
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04 └─ ⟦d65440be7⟧ »DATA« └─⟦this⟧
with Pile_Controle; with Reprise_Arriere; use Reprise_Arriere; with Flot_Controle; with Moteur; package body Calcul is procedure Parse_Error (Afile : Text_Io.File_Type) is Error : exception; begin Text_Io.Put_Line (" Error .. "); raise Error; end Parse_Error; procedure Dupliquer_Station_Dans_Param (Nom_Station : Les_Types.Ptr_String; J : Natural; Ok : in out Boolean) is Val_Param : Table_Symbole.Pobject; Object_Station_Transmis_En_Param : Table_Symbole.Pobject; Object_Station : Table_Symbole.Pobject; -- la copie de la station Nom_T1 : Les_Types.Ptr_String; begin Table_Symbole.Rechercher (Nom_Station, Object_Station_Transmis_En_Param, Ok); if Ok then null; else Pile_Controle.B.Recherche_Si_Parametre_De (null, Nom_Station, Object_Station_Transmis_En_Param, Ok); end if; Pile_Controle.A.Lire_Parametre_De (null, J, Val_Param, Ok); Object_Station := new Object (Structure); Object_Station.Nom := new String'(Val_Param.Nom.all); Object_Station.Le_Type := Structure; Object_Station.Addresse := Object_Station_Transmis_En_Param.Addresse; Object_Station.Nombre_Parametre := Object_Station_Transmis_En_Param.Nombre_Parametre; for I in 1 .. Object_Station_Transmis_En_Param.Nombre_Parametre loop Object_Station.Parametre (I) := new Object (Object_Station_Transmis_En_Param.Parametre (I).Le_Type); Object_Station.Parametre (I).Nom := new String' (Object_Station_Transmis_En_Param.Parametre (I).Nom.all); Object_Station.Parametre (I).Le_Type := Object_Station_Transmis_En_Param.Parametre (I).Le_Type; Object_Station.Parametre (I).Addresse := Object_Station_Transmis_En_Param.Parametre (I).Addresse; end loop; Object_Station.L_Arbre_Abstrait := Object_Station_Transmis_En_Param.L_Arbre_Abstrait; Pile_Controle.A.Modifier_Parametre_De (null, J, Object_Station, Ok); end Dupliquer_Station_Dans_Param; function Parse_Passage_Parametres (Afile : Text_Io.File_Type; Atime : Duration; Nom_Ssprg : Les_Types.Ptr_String) return Boolean is Nom_Param, Nom_T1 : Les_Types.Ptr_String; Ok : Boolean := True; I : Natural := 1; Val_Param : Table_Symbole.Pobject; Valeur_Variable : Float; Ptr1, Ptr2 : L_Arbre_Abstrait.Pnoeud; function Parse_Descript_Parametre (Afile : Text_Io.File_Type; Atime : Duration) return Boolean; procedure Parse_Liste (Afile : Text_Io.File_Type; Ok : in out Boolean; Atime : Duration) is begin if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); if Parse_Descript_Parametre (Afile, Atime) then if (Lex_Get_Token = L_Virg and I < 10) then Lex_Next_Token (Afile); Parse_Liste (Afile, Ok, Atime); else null; end if; else Ok := False; end if; else Ok := False; end if; end Parse_Liste; function Parse_Descript_Parametre (Afile : Text_Io.File_Type; Atime : Duration) return Boolean is begin case Lex_Get_Token is when L_Reg => Nom_Param := new String'(Lex_Get_Value.all); Object_Inconnu := new Table_Symbole.Object; Table_Symbole.Rechercher (Nom_Param, Object_Inconnu, Ok); if Ok then case Object_Inconnu.Le_Type is when Registre => Val_Param := new Table_Symbole.Object (Registre); Parse_Expr (Ok, Valeur_Variable, Afile, Atime); Table_Symbole.Lire_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); Val_Param.Valeur := Valeur_Variable; Table_Symbole.Modifier_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); when Structure => Dupliquer_Station_Dans_Param (Nom_Param, I, Ok); Lex_Next_Token (Afile); when Effet => Parse_Expr (Ok, Valeur_Variable, Afile, Atime); Pile_Controle.A.Lire_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); Val_Param.Valeur := Valeur_Variable; Pile_Controle.A.Modifier_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); when others => null; end case; else Addresseur.Depiler (Stacka, Nom_T1); Table_Symbole.Recherche_Si_Parametre_De (Nom_T1, Nom_Param, Object_Inconnu, Ok); Addresseur.Empiler (Stacka, Nom_T1); if Ok then case Object_Inconnu.Le_Type is when Registre => Val_Param := new Table_Symbole.Object (Registre); Parse_Expr (Ok, Valeur_Variable, Afile, Atime); Pile_Controle.A.Lire_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); Val_Param.Valeur := Valeur_Variable; Pile_Controle.A.Modifier_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); when Structure => Dupliquer_Station_Dans_Param (Nom_Param, I, Ok); Lex_Next_Token (Afile); when Effet => Parse_Expr (Ok, Valeur_Variable, Afile, Atime); Pile_Controle.A.Lire_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); Val_Param.Valeur := Valeur_Variable; Pile_Controle.A.Modifier_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); when others => null; end case; end if; end if; when L_Digit => Val_Param := new Table_Symbole.Object (Registre); Parse_Expr (Ok, Valeur_Variable, Afile, Atime); Pile_Controle.A.Lire_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); Val_Param.Valeur := Valeur_Variable; Pile_Controle.A.Modifier_Parametre_De (Nom_Ssprg, I, Val_Param, Ok); when others => Ok := False; end case; return Ok; end Parse_Descript_Parametre; begin Ptr1 := L_Arbre_Abstrait.Creer_Feuille (Vide, null); if Lex_Get_Token = L_Open then Lex_Next_Token (Afile); while (Lex_Get_Token /= L_Close) loop if (Parse_Descript_Parametre (Afile, Atime)) then null; else Ok := False; end if; Ptr1 := Ptr2; I := I + 1; if Lex_Get_Token /= L_Close then Lex_Next_Token (Afile); end if; end loop; Lex_Next_Token (Afile); else Ok := False; end if; return Ok; end Parse_Passage_Parametres; function Adresse_Vers_Chaine (A : Natural) return Les_Types.Ptr_String is P : Les_Types.Ptr_String; begin if 0 <= A and A <= 9 then P := new String'("0" & Natural'Image (A) (2 .. 2)); else P := new String'(Natural'Image (A)); end if; return P; end Adresse_Vers_Chaine; function Valeur_Vers_Chaine (A : Natural) return Les_Types.Ptr_String is P : Les_Types.Ptr_String; begin if 0 <= A and A <= 9 then P := new String'("000" & Natural'Image (A) (2 .. 2)); else if 10 <= A and A <= 99 then P := new String'("00" & Natural'Image (A) (2 .. 3)); else if 100 <= A and A <= 999 then P := new String'("0" & Natural'Image (A) (2 .. 4)); else if 1000 <= A and A <= 9999 then P := new String'(Natural'Image (A) (2 .. 5)); end if; end if; end if; end if; return P; end Valeur_Vers_Chaine; procedure Modifie_Valeur_Acteur_Affiche_Trame (Atime : Duration; Val : in out Table_Symbole.Pobject; Local : Les_Types.Type_Value) is La_Trame : Les_Types.Ptr_String; begin case Val.Le_Type is when Binaire => if Float (Local) > 0.0 then Val.Valeurb := True; La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse). all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (1).all & " " & "F"); else Val.Valeurb := False; La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse). all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (0).all & " " & "F"); end if; when Discret => Val.Valeurd := Natural (Local); La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse).all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (Val.Valeurd).all & " " & "F"); when Fugitif => Val.Valeurf := Natural (Local); La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse).all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (Val.Valeurf).all & " " & "F"); when Temporel => Val.Valeurt := Natural (Local); La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse).all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (Val.Valeurt).all & " " & "F"); when others => null; end case; Moteur.Ajoute_Trame_Dans_Tableau (Atime, La_Trame); end Modifie_Valeur_Acteur_Affiche_Trame; procedure Modifie_Valeur_Acteur_Affiche_Trame (Atime : Duration; Val : in out Table_Symbole.Pobject; Local, Local1 : Les_Types.Type_Value) is La_Trame : Les_Types.Ptr_String; begin case Val.Le_Type is when Binaire => if Float (Local) > 0.0 then Val.Valeurb := True; La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse). all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (1).all & " " & "F"); else Val.Valeurb := False; La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse). all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (0).all & " " & "F"); end if; when Discret => Val.Valeurd := Natural (Local); La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse).all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (Val.Valeurd).all & " " & Valeur_Vers_Chaine (Natural (Local1)).all & " " & "F"); when Fugitif => Val.Valeurf := Natural (Local); La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse).all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (Val.Valeurf).all & " " & Valeur_Vers_Chaine (Natural (Local1)).all & " " & "F"); when Temporel => Val.Valeurt := Natural (Local); La_Trame := new String' ("D " & Adresse_Vers_Chaine (Object_Inconnu.Addresse).all & " " & Adresse_Vers_Chaine (Val.Addresse).all & " " & Valeur_Vers_Chaine (Val.Valeurt).all & " " & Valeur_Vers_Chaine (Natural (Local1)).all & " " & "F"); when others => null; end case; Moteur.Ajoute_Trame_Dans_Tableau (Atime, La_Trame); Text_Io.Put_Line (" Trame Evol"); end Modifie_Valeur_Acteur_Affiche_Trame; procedure Modifie_L_Acteur_De_Station (Atime : Duration; Local : Les_Types.Type_Value; L_Acteur : Les_Types.Ptr_String; Object_Station : Table_Symbole.Pobject) is I : Natural := 1; Trouve : Boolean := False; begin if Object_Station.Le_Type = Structure then while (I <= Object_Station.Nombre_Parametre) and (not Trouve) loop if L_Acteur.all = Object_Station.Parametre (I).Nom.all then Trouve := True; Modifie_Valeur_Acteur_Affiche_Trame (Atime, Object_Station.Parametre (I), Local); end if; I := I + 1; end loop; end if; end Modifie_L_Acteur_De_Station; procedure Modifie_L_Acteur_De_Station (Atime : Duration; Local, Local1 : Les_Types.Type_Value; L_Acteur : Les_Types.Ptr_String; Object_Station : Table_Symbole.Pobject) is I : Natural := 1; Trouve : Boolean := False; begin if Object_Station.Le_Type = Structure then while (I <= Object_Station.Nombre_Parametre) and (not Trouve) loop if L_Acteur.all = Object_Station.Parametre (I).Nom.all then Trouve := True; Modifie_Valeur_Acteur_Affiche_Trame (Atime, Object_Station.Parametre (I), Local, Local1); end if; I := I + 1; end loop; end if; end Modifie_L_Acteur_De_Station; function Parse_Actions_Preenregistrees (Afile : Text_Io.File_Type; Atime : Duration) return Boolean is La_Station, L_Acteur, Nom_T1 : Les_Types.Ptr_String; Local, Local1 : Les_Types.Type_Value; Ok1 : Boolean; Bool, Val : Table_Symbole.Pobject; Ptr1, Ptr2, Ptr3 : Arbre_Abstrait_Types.L_Arbre_Abstrait.Pnoeud; begin Ok1 := True; case Lex_Get_Token is when L_Activer => Lex_Next_Token (Afile); if Lex_Get_Token = L_Open then Lex_Next_Token (Afile); if Lex_Get_Token = L_Reg then La_Station := new String'(Lex_Get_Value.all); Lex_Next_Token (Afile); if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); if Lex_Get_Token = L_Reg then L_Acteur := new String'(Lex_Get_Value.all); Table_Symbole.Lire_Parametre_De (La_Station, L_Acteur, Val, Ok1); Val.Valeurb := True; Table_Symbole.Modifier_Parametre_De (La_Station, L_Acteur, Val, Ok1); if Ok1 then null; else Ok1 := True; end if; Lex_Next_Token (Afile); if Lex_Get_Token = L_Close then null; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; when L_Changer => Lex_Next_Token (Afile); if Lex_Get_Token = L_Open then Lex_Next_Token (Afile); if Lex_Get_Token = L_Reg then La_Station := new String'(Lex_Get_Value.all); Lex_Next_Token (Afile); if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); if Lex_Get_Token = L_Reg then Lex_Next_Token (Afile); L_Acteur := new String'(Lex_Get_Value.all); Object_Inconnu := new Table_Symbole.Object; Table_Symbole.Rechercher (La_Station, Object_Inconnu, Ok1); if Ok1 then null; if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); if Ok1 then null; if Ok1 then Table_Symbole.Rechercher (La_Station, Object_Inconnu, Ok1); Table_Symbole.Lire_Parametre_De (La_Station, L_Acteur, Val, Ok1); Modifie_Valeur_Acteur_Affiche_Trame (Atime, Val, Local); Table_Symbole.Modifier_Parametre_De (La_Station, L_Acteur, Val, Ok1); if Lex_Get_Token = L_Close then null; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Addresseur.Depiler (Stacka, Nom_T1); Table_Symbole.Recherche_Si_Parametre_De (Nom_T1, La_Station, Object_Inconnu, Ok1); Addresseur.Empiler (Stacka, Nom_T1); if Ok1 then Object_Inconnu := new Table_Symbole.Object; Pile_Controle.B. Recherche_Si_Parametre_De (Nom_T1, La_Station, Object_Inconnu, Ok1); if Ok1 then if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); if Lex_Get_Token = L_Close then null; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; Object_Inconnu := new Table_Symbole.Object; Pile_Controle.B. Recherche_Si_Parametre_De (Nom_T1, La_Station, Object_Inconnu, Ok1); Modifie_L_Acteur_De_Station (Atime, Local, L_Acteur, Object_Inconnu); Pile_Controle.B. Modifier_Parametre_De (null, La_Station, Object_Inconnu, Ok1); else Parse_Error (Afile); end if; if Ok1 then case Object_Inconnu.Le_Type is when Structure => null; when others => null; end case; end if; else Parse_Error (Afile); end if; end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; when L_Evoluer => Lex_Next_Token (Afile); if Lex_Get_Token = L_Open then Lex_Next_Token (Afile); if Lex_Get_Token = L_Reg then La_Station := new String'(Lex_Get_Value.all); Lex_Next_Token (Afile); if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); if Lex_Get_Token = L_Reg then Lex_Next_Token (Afile); L_Acteur := new String'(Lex_Get_Value.all); Object_Inconnu := new Table_Symbole.Object; Table_Symbole.Rechercher (La_Station, Object_Inconnu, Ok1); if Ok1 then null; if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); if Ok1 then if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); Parse_Expr (Ok1, Local1, Afile, Atime); if Ok1 then null; if Ok1 then Table_Symbole.Rechercher (La_Station, Object_Inconnu, Ok1); Table_Symbole.Lire_Parametre_De (La_Station, L_Acteur, Val, Ok1); Modifie_Valeur_Acteur_Affiche_Trame (Atime, Val, Local, Local1); Table_Symbole.Modifier_Parametre_De (La_Station, L_Acteur, Val, Ok1); if Lex_Get_Token = L_Close then null; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Addresseur.Depiler (Stacka, Nom_T1); Table_Symbole.Recherche_Si_Parametre_De (Nom_T1, La_Station, Object_Inconnu, Ok1); Addresseur.Empiler (Stacka, Nom_T1); if Ok1 then Object_Inconnu := new Table_Symbole.Object; Pile_Controle.B. Recherche_Si_Parametre_De (Nom_T1, La_Station, Object_Inconnu, Ok1); if Ok1 then if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); if Lex_Get_Token = L_Virg then Lex_Next_Token (Afile); Parse_Expr (Ok1, Local1, Afile, Atime); if Lex_Get_Token = L_Close then null; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; Object_Inconnu := new Table_Symbole.Object; Pile_Controle.B. Recherche_Si_Parametre_De (Nom_T1, La_Station, Object_Inconnu, Ok1); Modifie_L_Acteur_De_Station (Atime, Local, Local1, L_Acteur, Object_Inconnu); Pile_Controle.B. Modifier_Parametre_De (null, La_Station, Object_Inconnu, Ok1); else Parse_Error (Afile); end if; if Ok1 then case Object_Inconnu.Le_Type is when Structure => null; when others => null; end case; end if; else Parse_Error (Afile); end if; end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; else Parse_Error (Afile); end if; when others => Parse_Error (Afile); end case; Lex_Next_Token (Afile); return True; end Parse_Actions_Preenregistrees; function Parse_Inst (Afile : Text_Io.File_Type; Atime : in Duration) return Boolean is T1 : Duration; Local : Type_Value; Reg, Nom_T1 : Les_Types.Ptr_String; Element : Table_Symbole.Pobject (Effet); Etiq_Retour, Etiq_Debut, Etiq_Apres : Natural := 0; Ok1, Valeur_Boolean : Boolean; Token_Courant : Token; I : Integer; Label_Get1, Label_Get2, Label_Get3 : Natural; begin Ok1 := True; Token_Courant := Lex_Get_Token; case Token_Courant is when L_A => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); T1 := Duration (Local); if Lex_Get_Token = L_Faire then Lex_Next_Token (Afile); if Parse_Inst (Afile, T1 + Atime) then null; else Ok1 := False; end if; else Ok1 := False; end if; when L_Debut => Lex_Next_Token (Afile); I := 0; while (Lex_Get_Token /= L_Fin) loop if (Parse_Inst (Afile, Atime) = True) then null; else Ok1 := False; end if; I := I + 1; end loop; Lex_Next_Token (Afile); when L_Activer => Ok1 := Parse_Actions_Preenregistrees (Afile, Atime); if Lex_Get_Token = L_Separ then Lex_Next_Token (Afile); else null; end if; when L_Changer => Ok1 := Parse_Actions_Preenregistrees (Afile, Atime); if Lex_Get_Token = L_Separ then Lex_Next_Token (Afile); else null; end if; when L_Evoluer => Ok1 := Parse_Actions_Preenregistrees (Afile, Atime); if Lex_Get_Token = L_Separ then Lex_Next_Token (Afile); else null; end if; when L_Reg => Reg := new String'(Lex_Get_Value.all); Lex_Next_Token (Afile); if Lex_Get_Token = L_Eq then Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); if Ok1 then Object_Inconnu := new Table_Symbole.Object; Table_Symbole.Rechercher (Reg, Object_Inconnu, Ok1); if Ok1 then case Object_Inconnu.Le_Type is when Registre => Pile_Controle.B.Lire_Parametre_De (Nom_T1, Reg, Object_Inconnu, Ok1); Object_Inconnu.Valeur := Local; when others => null; end case; else Addresseur.Depiler (Stacka, Nom_T1); Table_Symbole.Recherche_Si_Parametre_De (Nom_T1, Reg, Object_Inconnu, Ok1); Addresseur.Empiler (Stacka, Nom_T1); if Ok1 then case Object_Inconnu.Le_Type is when Registre => Pile_Controle.B.Lire_Parametre_De (Nom_T1, Reg, Object_Inconnu, Ok1); Object_Inconnu.Valeur := Local; when others => null; end case; else Addresseur.Depiler (Stacka, Nom); Table_Symbole.Recherche_Si_Parametre_De (Nom, Reg, Object_Inconnu, Ok1); Addresseur.Empiler (Stacka, Nom); if Ok1 then case Object_Inconnu.Le_Type is when Registre => Object_Inconnu.Valeur := Local; Table_Symbole.Modifier_Parametre_De (Nom, Reg, Object_Inconnu, Ok1); when others => null; end case; else Object_Inconnu := new Object (Registre); Object_Inconnu.Nom := new String'(Reg.all); Object_Inconnu.Le_Type := Registre; Object_Inconnu.Valeur := Local; Table_Symbole.Inserer (Reg, Object_Inconnu, Ok1); Object_Inconnu := new Object (Registre); Object_Inconnu.Valeur := 3.14; Table_Symbole.Rechercher (Reg, Object_Inconnu, Ok1); end if; end if; end if; end if; end if; if Lex_Get_Token = L_Separ then -- fin d'instruction Lex_Next_Token (Afile); else Ok1 := False; end if; when L_Prt => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); Token_Courant := Lex_Get_Token; Text_Io.Put_Line (" => "); Float_Texte.Put (Local); if Token_Courant = L_Separ then Lex_Next_Token (Afile); else Ok1 := False; end if; when L_Retourne => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); Object_Inconnu := new Object (Registre); Pile_Controle.B.Lire_Valeur_Retour_De (Nom, Object_Inconnu, Ok1); if Ok1 then Object_Inconnu.Valeur := Local; Pile_Controle.B.Modifier_Valeur_Retour_De (Nom, Object_Inconnu, Ok1); Pile_Controle.B.Lire_Valeur_Retour_De (Nom, Object_Inconnu, Ok1); end if; Token_Courant := Lex_Get_Token; if Token_Courant = L_Separ then Lex_Next_Token (Afile); else Ok1 := False; end if; when L_Separ => Lex_Next_Token (Afile); when L_Executer => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); Token_Courant := Lex_Get_Token; if Token_Courant = L_Separ then Lex_Next_Token (Afile); else Ok1 := False; end if; when L_Tant => Lex_Next_Token (Afile); if Lex_Get_Token = L_Que then Lex_Next_Token (Afile); Parse_Expr_Bool (Valeur_Boolean, Afile, Atime); if Valeur_Boolean then if (Parse_Inst (Afile, Atime) = True) then null; else Ok1 := False; end if; Pile_Lex.Prg_Lire_Posi_Iterateur (Label_Get3); Pile_Lex.Prg_Iterateur_A_Position (Gen_Read (Label_Get3).Indice - 1); Lex_Next_Token (Afile); else Pile_Lex.Prg_Lire_Posi_Iterateur (Label_Get2); Pile_Lex.Prg_Iterateur_A_Position (Gen_Read (Label_Get2).Indice - 1); Lex_Next_Token (Afile); end if; end if; when L_Si => Lex_Next_Token (Afile); Parse_Expr_Bool (Valeur_Boolean, Afile, Atime); if Valeur_Boolean then if Lex_Get_Token = L_Alors then Lex_Next_Token (Afile); if (Parse_Inst (Afile, Atime) = True) then null; else Ok1 := False; end if; Pile_Lex.Prg_Lire_Posi_Iterateur (Label_Get1); Pile_Lex.Prg_Iterateur_A_Position (Gen_Read (Label_Get1).Indice); Lex_Next_Token (Afile); end if; else Pile_Lex.Prg_Lire_Posi_Iterateur (Label_Get1); Pile_Lex.Prg_Iterateur_A_Position (Gen_Read (Label_Get1).Indice - 1); Lex_Next_Token (Afile); if (Parse_Inst (Afile, Atime) = True) then null; else Ok1 := False; end if; end if; when others => Ok1 := False; end case; return Ok1; end Parse_Inst; procedure Parse_Fact (Ok : out Boolean; Value : out Les_Types.Type_Value; Afile : Text_Io.File_Type; Atime : Duration) is Element : Table_Symbole.Pobject (Fonction); Etiq_Retour, Etiq_Debut, Etiq_Apres : Natural := 0; Herited, Local : Les_Types.Type_Value; Reg, Nom_T1, Nom_T2 : Les_Types.Ptr_String; Ok1, Ok2 : Boolean; Token_Courant : Token; begin Ok1 := True; Herited := 0.0; Local := 0.0; Token_Courant := Lex_Get_Token; case Token_Courant is when L_Open => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited + Local; if Lex_Get_Token = L_Close then Lex_Next_Token (Afile); else Ok1 := False; end if; else Ok1 := False; end if; when L_Sqrt => Lex_Next_Token (Afile); Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited + Sqrt (Local); else Ok1 := False; end if; when L_Log => Lex_Next_Token (Afile); Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited + Log (Local); else Ok1 := False; end if; when L_Exp => Lex_Next_Token (Afile); Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited + Exp (Local); else Ok1 := False; end if; when L_Sin => Lex_Next_Token (Afile); Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited + Sin (Local); else Ok1 := False; end if; when L_Cos => Lex_Next_Token (Afile); Parse_Fact (Ok, Local, Afile, Atime); if Ok1 then Herited := Herited + Cos (Local); else Ok1 := False; end if; when L_Arctan => Lex_Next_Token (Afile); Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited + Arctan (Local); else Ok1 := False; end if; when L_Reg => Reg := new String'(Lex_Get_Value.all); Object_Inconnu := new Table_Symbole.Object; Table_Symbole.Rechercher (Reg, Object_Inconnu, Ok1); if Ok1 then case Object_Inconnu.Le_Type is when Les_Types.Registre => Local := Object_Inconnu.Valeur; when Les_Types.Effet => Pile_Controle.A.Empiler (Reg, Ok1); Etiq_Debut := Object_Inconnu.Etiquette; Lex_Next_Token (Afile); if (Parse_Passage_Parametres (Afile, Atime, Reg)) then null; end if; Pile_Controle.Depile_De_A_Empile_Sur_B; Addresseur.Empiler (Stacka, Reg); Pile_Lex.Prg_Lire_Posi_Iterateur (Etiq_Retour); Pile_Entiers.Empiler (Stack, Etiq_Retour); Pile_Lex.Prg_Iterateur_A_Position (Etiq_Debut); Lex_Next_Token (Afile); if (Parse_Inst (Afile, Atime) = True) then null; else Ok1 := False; end if; Object_Inconnu := null; Object_Inconnu := new Table_Symbole.Object (Registre); Pile_Controle.B.Lire_Valeur_Retour_De (Reg, Object_Inconnu, Ok1); Local := Object_Inconnu.Valeur; Pile_Controle.B.Depiler; Addresseur.Depiler (Stacka, Reg); Pile_Entiers.Depiler (Stack, Etiq_Retour); Pile_Lex.Prg_Iterateur_A_Position (Etiq_Retour - 1); when others => null; end case; else Addresseur.Depiler (Stacka, Nom_T1); Table_Symbole.Recherche_Si_Parametre_De (Nom_T1, Reg, Object_Inconnu, Ok1); Addresseur.Empiler (Stacka, Nom_T1); if Ok1 then case Object_Inconnu.Le_Type is when Les_Types.Registre => Pile_Controle.B.Lire_Parametre_De (Nom_T1, Reg, Object_Inconnu, Ok1); Local := Object_Inconnu.Valeur; when others => null; end case; else Addresseur.Depiler (Stacka, Nom_T1); Addresseur.Depiler (Stacka, Nom_T2); Table_Symbole.Recherche_Si_Parametre_De (Nom_T2, Reg, Object_Inconnu, Ok1); Addresseur.Empiler (Stacka, Nom_T2); Addresseur.Empiler (Stacka, Nom_T1); if Ok1 then case Object_Inconnu.Le_Type is when Les_Types.Registre => Pile_Controle.B.Lire_Parametre_De (Nom_T1, Reg, Object_Inconnu, Ok1); Local := Object_Inconnu.Valeur; when others => null; end case; end if; end if; end if; Herited := Local + Herited; Lex_Next_Token (Afile); when L_Digit => Local := Lex_Get_Value_Float; Herited := Local; Lex_Next_Token (Afile); when others => Ok1 := False; end case; Value := Herited; Ok := Ok1; end Parse_Fact; procedure Parse_Term (Ok : out Boolean; Value : out Les_Types.Type_Value; Afile : Text_Io.File_Type; Atime : Duration) is Herited, Local : Les_Types.Type_Value; Reg : Les_Types.Ptr_String; Ok1 : Boolean; Token_Courant : Token; begin Ok1 := True; Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Local; Token_Courant := Lex_Get_Token; while ((Lex_Get_Token = L_Star or Lex_Get_Token = L_Div or Lex_Get_Token = L_Mod) and Ok1) loop case Lex_Get_Token is when L_Star => Lex_Next_Token (Afile); Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited * Local; else Ok1 := False; end if; when L_Div => Lex_Next_Token (Afile); Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited / Local; else Ok1 := False; end if; when L_Mod => Lex_Next_Token (Afile); Parse_Fact (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited; else Ok1 := False; end if; when others => null; end case; Token_Courant := Lex_Get_Token; end loop; else Ok1 := False; end if; Value := Herited; Ok := Ok1; end Parse_Term; procedure Parse_Expr (Ok : out Boolean; Value : out Les_Types.Type_Value; Afile : Text_Io.File_Type; Atime : Duration) is Herited, Local : Les_Types.Type_Value; Ok1 : Boolean; Token_Courant : Token; begin Ok1 := True; Parse_Term (Ok1, Local, Afile, Atime); if Ok1 then Herited := Local; Token_Courant := Lex_Get_Token; while ((Lex_Get_Token = L_Plus or Lex_Get_Token = L_Moins) and Ok1) loop case Lex_Get_Token is when L_Plus => Lex_Next_Token (Afile); Parse_Term (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited + Local; else Ok1 := False; end if; when L_Moins => Lex_Next_Token (Afile); Parse_Term (Ok1, Local, Afile, Atime); if Ok1 then Herited := Herited - Local; else Ok1 := False; end if; when others => null; end case; end loop; else Ok1 := False; end if; Value := Herited; Ok := Ok1; end Parse_Expr; procedure Parse_Expr_Bool (Val_Boolean : in out Boolean; Afile : Text_Io.File_Type; Atime : Duration) is Local, Local1 : Les_Types.Type_Value; Ok1 : Boolean := True; begin Parse_Expr (Ok1, Local, Afile, Atime); if Ok1 then case Lex_Get_Token is when L_Lt => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local1, Afile, Atime); if not Ok1 then Ok1 := False; end if; if (Local < Local1) then Val_Boolean := True; else Val_Boolean := False; end if; when L_Gt => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local1, Afile, Atime); if not Ok1 then Ok1 := False; end if; if (Local > Local1) then Val_Boolean := True; else Val_Boolean := False; end if; when L_Geq => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local1, Afile, Atime); if not Ok1 then Ok1 := False; end if; if (Local >= Local1) then Val_Boolean := True; else Val_Boolean := False; end if; when L_Eq => Lex_Next_Token (Afile); Parse_Expr (Ok1, Local1, Afile, Atime); if not Ok1 then Ok1 := False; end if; if (Local = Local1) then Val_Boolean := True; else Val_Boolean := False; end if; when others => null; end case; end if; if not Ok1 then Parse_Error (Afile); end if; end Parse_Expr_Bool; end Calcul;