Changeset 370


Ignore:
Timestamp:
Jan 4, 2015, 4:02:45 PM (6 years ago)
Author:
Maxim Reznik
Message:

Add evaluation for numeric static expression

Location:
trunk/ada-2012/src
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/ada-2012/src/ag/static_value.ag

    r362 r370  
    104104Rules for numeric_literal.numeric_literal_token :
    105105(.
    106       ${numeric_literal.static_value} := 0;  --  FIXME
     106    ${numeric_literal.static_value} := Gela.Pass_Utils.Create_Numeric_Value
     107      (Self.Compilation, ${numeric_literal_token.Index});
    107108.)
    108109Rules for null_literal.null_literal_token :
  • trunk/ada-2012/src/api/gela-semantic_types.ads

    r338 r370  
    3434   --  Index of static value
    3535
    36    type Static_Operator is (Concat);
     36   --  See also Gela.Lexical_Types.Operators
     37   type Static_Operator is
     38     (Less_Operator,
     39      Equal_Operator,
     40      Greater_Operator,
     41      Hyphen_Operator,
     42      Slash_Operator,
     43      Star_Operator,
     44      Ampersand_Operator,
     45      Plus_Operator,
     46      Less_Or_Equal_Operator,
     47      Greater_Or_Equal_Operator,
     48      Inequality_Operator,
     49      Double_Star_Operator,
     50      Or_Operator,
     51      And_Operator,
     52      Xor_Operator,
     53      Mod_Operator,
     54      Rem_Operator,
     55      Abs_Operator,
     56      Not_Operator);
    3757
    3858end Gela.Semantic_Types;
  • trunk/ada-2012/src/api/gela-value_sets.ads

    r356 r370  
    1818      Value : out Gela.Semantic_Types.Value_Index) is abstract;
    1919   --  Get string value for given literal.
     20
     21   not overriding procedure Numeric_Literal
     22     (Self  : in out Value_Set;
     23      Image : League.Strings.Universal_String;
     24      Value : out Gela.Semantic_Types.Value_Index) is abstract;
     25   --  Get numeric value for given literal.
    2026
    2127   not overriding procedure Name
  • trunk/ada-2012/src/arithmetic/gela-arithmetic-integers.adb

    r272 r370  
    88--  $Revision$ $Date$
    99
     10with Ada.Streams;
    1011with Ada.Strings.Fixed;
    1112with Ada.Strings.Maps.Constants;
    1213
    13 with Ada.Streams;
     14with League.Stream_Element_Vectors.Hash;
    1415
    1516package body Gela.Arithmetic.Integers is
     
    725726      end if;
    726727   end Get_Sign;
     728
     729   ----------
     730   -- Hash --
     731   ----------
     732
     733   function Hash (Left : Value) return Ada.Containers.Hash_Type is
     734   begin
     735      return League.Stream_Element_Vectors.Hash
     736        (League.Stream_Element_Vectors.Stream_Element_Vector (Left));
     737   end Hash;
    727738
    728739   -----------
  • trunk/ada-2012/src/arithmetic/gela-arithmetic-integers.ads

    r272 r370  
    99--  Purpose:
    1010--  Multyprecission integer arithmetic
     11
     12with Ada.Containers;
    1113
    1214with League.Stream_Element_Vectors;
     
    4143
    4244   function Image (Left : Value) return String;
     45   function Hash (Left : Value) return Ada.Containers.Hash_Type;
    4346
    4447   function Zero return Value;
  • trunk/ada-2012/src/semantic/gela-pass_utils.adb

    r362 r370  
    360360   end Create_Function_Call_Value;
    361361
     362   function Create_Numeric_Value
     363     (Comp  : Gela.Compilations.Compilation_Access;
     364      Value : Gela.Lexical_Types.Token_Index)
     365      return Gela.Semantic_Types.Value_Index
     366   is
     367      Token  : constant Gela.Lexical_Types.Token := Comp.Get_Token (Value);
     368      Source : constant League.Strings.Universal_String := Comp.Source;
     369      Image  : constant League.Strings.Universal_String :=
     370        Source.Slice (Token.First, Token.Last);
     371      Result : Gela.Semantic_Types.Value_Index;
     372   begin
     373      Comp.Context.Values.Numeric_Literal (Image, Result);
     374
     375      return Result;
     376   end Create_Numeric_Value;
     377
    362378   -------------------------
    363379   -- Create_String_Value --
  • trunk/ada-2012/src/semantic/gela-pass_utils.ads

    r356 r370  
    6969   --  Return end of declarative region of unit's parent
    7070
     71   function Create_Numeric_Value
     72     (Comp  : Gela.Compilations.Compilation_Access;
     73      Value : Gela.Lexical_Types.Token_Index)
     74      return Gela.Semantic_Types.Value_Index;
     75   --  Return end of declarative region of unit's parent
     76
    7177   function Create_Function_Call_Value
    7278     (Comp          : Gela.Compilations.Compilation_Access;
  • trunk/ada-2012/src/semantic/gela-plain_value_sets.adb

    r364 r370  
    4040      end;
    4141
    42       case Op is
    43          when Gela.Semantic_Types.Concat =>
    44             declare
    45                Item : constant Gela.Plain_Value_Sets.Value :=
    46                  Self.Vector.Element (Args);
    47             begin
    48                if Item.Kind = List_Value and then
    49                  Self.Vector.Element (Item.Head).Kind = String_Value and then
    50                  Self.Vector.Element (Item.Tail).Kind = String_Value
     42      declare
     43         use type Gela.Arithmetic.Integers.Value;
     44
     45         Item : constant Gela.Plain_Value_Sets.Value :=
     46           Self.Vector.Element (Args);
     47         Left  : Gela.Plain_Value_Sets.Value;
     48         Right : Gela.Plain_Value_Sets.Value;
     49      begin
     50         if Item.Kind /= List_Value then
     51            Self.String_Literal
     52              (League.Strings.To_Universal_String ("???"),
     53               Value);
     54            return;
     55         end if;
     56
     57         Left := Self.Vector.Element (Item.Head);
     58         Right := Self.Vector.Element (Item.Tail);
     59         case Op is
     60            when Gela.Semantic_Types.Ampersand_Operator =>
     61               if Left.Kind = String_Value and then
     62                 Right.Kind = String_Value
    5163               then
    5264                  Self.String_Literal
    53                     (Self.Image (Item.Head) & Self.Image (Item.Tail),
     65                    (Left.String & Right.String,
    5466                     Value);
    5567               end if;
    56             end;
    57       end case;
     68            when Gela.Semantic_Types.Hyphen_Operator =>
     69               if Left.Kind = Integer_Value and then
     70                 Right.Kind = Integer_Value
     71               then
     72                  Self.Put_Value
     73                    ((Integer_Value, Left.Integer - Right.Integer), Value);
     74               end if;
     75            when others =>
     76               raise Constraint_Error with "unimplemeneted";
     77         end case;
     78      end;
    5879   end Apply;
    5980
     
    113134              Defining_Operator_Symbol_Access)
    114135         is
     136            use type Gela.Lexical_Types.Symbol;
     137
    115138            Symbol : constant Gela.Lexical_Types.Symbol := Node.Full_Name;
     139            Op : constant Gela.Semantic_Types.Static_Operator :=
     140              Gela.Semantic_Types.Static_Operator'Val (Symbol - 1);
     141            Item  : constant Gela.Plain_Value_Sets.Value :=
     142              (Denote_Function, Op);
    116143         begin
    117             case Symbol is
    118                when Gela.Lexical_Types.Operators.Ampersand_Operator =>
    119                   declare
    120                      Item  : constant Gela.Plain_Value_Sets.Value :=
    121                        (Denote_Function, Gela.Semantic_Types.Concat);
    122                   begin
    123                      Put_Value (Self  => Self,
    124                                 Item  => Item,
    125                                 Value => V.Result);
    126                   end;
    127                when others =>
    128                   null;
    129             end case;
     144            Put_Value (Self  => Self,
     145                       Item  => Item,
     146                       Value => V.Result);
    130147         end Defining_Operator_Symbol;
    131148
     
    148165      V : aliased Get.Visiter;
    149166   begin
    150       if Name /= null and then Name.Enclosing_Element = null then
     167      if Name /= null and then Name.Enclosing_Element /= null then
    151168         Name.Enclosing_Element.Visit (V);
    152169      else
     
    154171         declare
    155172            Item  : constant Gela.Plain_Value_Sets.Value :=
    156               (Denote_Function, Gela.Semantic_Types.Concat);
     173              (Denote_Function, Gela.Semantic_Types.Ampersand_Operator);
    157174         begin
    158175            Put_Value (Self  => Self,
     
    175192         when Denote_Function =>
    176193            return Gela.Semantic_Types.Static_Operator'Pos (X.Op);
     194         when Integer_Value =>
     195            return Gela.Arithmetic.Integers.Hash (X.Integer);
    177196         when String_Value =>
    178197            return League.Strings.Hash (X.String);
     
    190209     (Self  : Value_Set;
    191210      Value : Gela.Semantic_Types.Value_Index)
    192       return League.Strings.Universal_String is
    193    begin
    194       return Self.Vector.Element (Value).String;
     211      return League.Strings.Universal_String
     212   is
     213      Item : constant Gela.Plain_Value_Sets.Value :=
     214        Self.Vector.Element (Value);
     215   begin
     216      case Item.Kind is
     217         when String_Value =>
     218            return Item.String;
     219         when Integer_Value =>
     220            return League.Strings.From_UTF_8_String
     221              (Gela.Arithmetic.Integers.Image (Item.Integer));
     222         when others =>
     223            raise Constraint_Error;
     224      end case;
    195225   end Image;
     226
     227   ---------------------
     228   -- Numeric_Literal --
     229   ---------------------
     230
     231   overriding procedure Numeric_Literal
     232     (Self  : in out Value_Set;
     233      Image : League.Strings.Universal_String;
     234      Value : out Gela.Semantic_Types.Value_Index)
     235   is
     236      X : constant Gela.Arithmetic.Integers.Value :=
     237        Gela.Arithmetic.Integers.Literal (Image.To_UTF_8_String);
     238      Item : constant Gela.Plain_Value_Sets.Value := (Integer_Value, X);
     239   begin
     240      Self.Put_Value (Item, Value);
     241   end Numeric_Literal;
    196242
    197243   ---------------
  • trunk/ada-2012/src/semantic/gela-plain_value_sets.ads

    r356 r370  
    55with League.Strings;
    66
     7with Gela.Arithmetic.Integers;
    78with Gela.Elements.Defining_Names;
    89with Gela.Semantic_Types;
     
    1920     range 1 .. Gela.Semantic_Types.Value_Index'Last;
    2021
    21    type Value_Kinds is (String_Value, List_Value, Denote_Function);
     22   type Value_Kinds is
     23     (Integer_Value, String_Value, List_Value, Denote_Function);
    2224
    2325   type Value (Kind : Value_Kinds := String_Value) is record
     
    2527         when Denote_Function =>
    2628            Op : Gela.Semantic_Types.Static_Operator;
     29         when Integer_Value =>
     30            Integer : Gela.Arithmetic.Integers.Value;
    2731         when String_Value =>
    2832            String : League.Strings.Universal_String;
     
    6266      Value : out Gela.Semantic_Types.Value_Index);
    6367
     68   overriding procedure Numeric_Literal
     69     (Self  : in out Value_Set;
     70      Image : League.Strings.Universal_String;
     71      Value : out Gela.Semantic_Types.Value_Index);
     72
    6473   overriding procedure Name
    6574     (Self  : in out Value_Set;
Note: See TracChangeset for help on using the changeset viewer.