home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / par-prag.adb < prev    next >
Text File  |  1996-09-28  |  30KB  |  919 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             P A R . P R A G                              --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.81 $                             --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. --  Generally the parser checks the basic syntax of pragmas, but does not
  26. --  do specialized syntax checks for individual pragmas, these are deferred
  27. --  to semantic analysis time (see unit Sem_Prag). There are some pragmas
  28. --  which require recognition and either partial or complete processing
  29. --  during parsing, and this unit performs this required processing.
  30.  
  31. with Stringt; use Stringt;
  32. with Uintp;   use Uintp;
  33.  
  34. separate (Par)
  35.  
  36. function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id is
  37.    Pragma_Name : constant Name_Id    := Chars (Pragma_Node);
  38.    Pragma_Sloc : constant Source_Ptr := Sloc (Pragma_Node);
  39.    Arg_Count   : Nat;
  40.    Arg_Node    : Node_Id;
  41.    Expr_Node   : Node_Id;
  42.  
  43.    -----------------------
  44.    -- Local Subprograms --
  45.    -----------------------
  46.  
  47.    function Arg1 return Node_Id;
  48.    function Arg2 return Node_Id;
  49.    function Arg3 return Node_Id;
  50.    function Arg4 return Node_Id;
  51.    --  Obtain specified Pragma_Argument_Association. It is allowable to call
  52.    --  the routine for the argument one past the last present argument, but
  53.    --  that is the only case in which a non-present argument can be referenced.
  54.  
  55.    procedure Check_Ada_83_Warning;
  56.    --  Issues a warning message for the current pragma if operating in Ada 83
  57.    --  mode (used for language pragmas that are not a standard part of Ada 83).
  58.    --  This procedure does not raise Error_Resync. Also notes use of 95 pragma.
  59.  
  60.    procedure Check_Arg_Count (Required : Int);
  61.    --  Check argument count for pragma = Required.
  62.    --  If not give error and raise Error_Resync.
  63.  
  64.    procedure Check_Arg_Is_Convention (Arg : Node_Id);
  65.    --  Check the expression of the specified argument to make sure that it
  66.    --  is a valid convention name. If not give error and raise Error_Resync.
  67.    --  This procedure also checks for the possible allowed presence of the
  68.    --  identifier Convention for this argument.
  69.  
  70.    procedure Check_Arg_Is_Identifier (Arg : Node_Id);
  71.    --  Check the expression of the specified argument to make sure that it
  72.    --  is an identifier. If not give error and raise Error_Resync.
  73.  
  74.    procedure Check_Arg_Is_String_Literal (Arg : Node_Id);
  75.    --  Check the expression of the specified argument to make sure that it
  76.    --  is a string literal. If not give error and raise Error_Resync.
  77.  
  78.    procedure Check_Arg_Is_Library_Unit_Name (Arg : Node_Id);
  79.    --  Check the expression of the specified argument to make sure that it
  80.    --  is of the form of a library unit name, i.e. that it is an identifier
  81.    --  or a selected component with a selector name that is itself an
  82.    --  identifier. If not of this form, give error and raise Error_Resync.
  83.  
  84.    procedure Check_Arg_Is_Local_Name (Arg : Node_Id);
  85.    --  Check the expression of the specified argument to make sure that
  86.    --  it has the proper syntactic form for a local name.
  87.  
  88.    procedure Check_Arg_Is_On_Or_Off (Arg : Node_Id);
  89.    --  Check the expression of the specified argument to make sure that it
  90.    --  is an identifier which is either ON or OFF, and if not, then issue
  91.    --  an error message and raise Error_Resync.
  92.  
  93.    procedure Check_At_Least_One_Argument;
  94.    --  Check there is at least one argument.
  95.    --  If not give error and raise Error_Resync.
  96.  
  97.    procedure Check_External_And_Or_Link_Name (A1 : Node_Id; A2 : Node_Id);
  98.    --  Check last two arguments of pragma Import, Export or Interface_Name
  99.    --  to check for appropriate optional identifiers. A1 is definitely
  100.    --  present, but A2 may be missing if either External_Name or Link_Name
  101.    --  is omitted.
  102.  
  103.    procedure Check_Library_Unit_Pragma;
  104.    --  Library unit pragmas (10.1.5) have at most one argument, which must
  105.    --  be the current compilation unit.
  106.  
  107.    procedure Check_No_Identifier (Arg : Node_Id);
  108.    --  Checks that the given argument does not have an identifier. If an
  109.    --  identifier is present, then an error message is issued, and
  110.    --  Error_Resync is raised.
  111.  
  112.    procedure Check_No_Identifiers;
  113.    --  Checks that none of the arguments to the pragma has an identifier.
  114.    --  If any argument has an identifier, then an error message is issued,
  115.    --  and Error_Resync is raised.
  116.  
  117.    procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id);
  118.    --  Checks if the given argument has an identifier, and if so, requires
  119.    --  it to match the given identifier name. If there is a non-matching
  120.    --  identifier, then an error message is given and Error_Resync raised.
  121.  
  122.    ----------
  123.    -- Arg1 --
  124.    ----------
  125.  
  126.    function Arg1 return Node_Id is
  127.    begin
  128.       return First (Pragma_Argument_Associations (Pragma_Node));
  129.    end Arg1;
  130.  
  131.    ----------
  132.    -- Arg2 --
  133.    ----------
  134.  
  135.    function Arg2 return Node_Id is
  136.    begin
  137.       return Next (Arg1);
  138.    end Arg2;
  139.  
  140.    ----------
  141.    -- Arg3 --
  142.    ----------
  143.  
  144.    function Arg3 return Node_Id is
  145.    begin
  146.       return Next (Arg2);
  147.    end Arg3;
  148.  
  149.    ----------
  150.    -- Arg4 --
  151.    ----------
  152.  
  153.    function Arg4 return Node_Id is
  154.    begin
  155.       return Next (Arg3);
  156.    end Arg4;
  157.  
  158.    --------------------------
  159.    -- Check_Ada_83_Warning --
  160.    --------------------------
  161.  
  162.    procedure Check_Ada_83_Warning is
  163.    begin
  164.       Note_Feature (New_Pragmas, Pragma_Sloc);
  165.  
  166.       if Ada_83 then
  167.          Error_Msg ("(Ada 83) pragma% is non-standard", Pragma_Sloc);
  168.       end if;
  169.  
  170.       --  Put back the node for subsequent error messages, because this is a
  171.       --  situation where we do not raise Error_Resync and get out immediately
  172.  
  173.       Error_Msg_Name_1 := Pragma_Name;
  174.    end Check_Ada_83_Warning;
  175.  
  176.    ---------------------
  177.    -- Check_Arg_Count --
  178.    ---------------------
  179.  
  180.    procedure Check_Arg_Count (Required : Int) is
  181.    begin
  182.       if Arg_Count /= Required then
  183.          Error_Msg ("wrong number of arguments for pragma%", Pragma_Sloc);
  184.          raise Error_Resync;
  185.       end if;
  186.    end Check_Arg_Count;
  187.  
  188.    -----------------------------
  189.    -- Check_Arg_Is_Convention --
  190.    -----------------------------
  191.  
  192.    procedure Check_Arg_Is_Convention (Arg : Node_Id) is
  193.    begin
  194.       Check_Arg_Is_Identifier (Arg);
  195.       Check_Optional_Identifier (Arg, Name_Convention);
  196.  
  197.       if not Is_Convention_Name (Chars (Expression (Arg))) then
  198.          Error_Msg
  199.            ("argument of pragma% is not valid convention name",
  200.              Sloc (Expression (Arg)));
  201.          raise Error_Resync;
  202.       end if;
  203.    end Check_Arg_Is_Convention;
  204.  
  205.    -----------------------------
  206.    -- Check_Arg_Is_Identifier --
  207.    -----------------------------
  208.  
  209.    procedure Check_Arg_Is_Identifier (Arg : Node_Id) is
  210.    begin
  211.       if Nkind (Expression (Arg)) /= N_Identifier then
  212.          Error_Msg
  213.            ("argument for pragma% must be identifier",
  214.              Sloc (Expression (Arg)));
  215.          raise Error_Resync;
  216.       end if;
  217.    end Check_Arg_Is_Identifier;
  218.  
  219.    ------------------------------------
  220.    -- Check_Arg_Is_Library_Unit_Name --
  221.    ------------------------------------
  222.  
  223.    procedure Check_Arg_Is_Library_Unit_Name (Arg : Node_Id) is
  224.       Argx : constant Node_Id := Expression (Arg);
  225.  
  226.    begin
  227.       if Nkind (Argx) /= N_Identifier
  228.         and then (Nkind (Argx) /= N_Selected_Component
  229.                    or else Nkind (Selector_Name (Argx)) /= N_Identifier)
  230.       then
  231.          Error_Msg
  232.            ("argument for pragma% must be library unit name", Sloc (Argx));
  233.          raise Error_Resync;
  234.       end if;
  235.    end Check_Arg_Is_Library_Unit_Name;
  236.  
  237.    -----------------------------
  238.    -- Check_Arg_Is_Local_Name --
  239.    -----------------------------
  240.  
  241.    --  LOCAL_NAME ::=
  242.    --    DIRECT_NAME
  243.    --  | DIRECT_NAME'ATTRIBUTE_DESIGNATOR
  244.    --  | library_unit_NAME
  245.  
  246.    procedure Check_Arg_Is_Local_Name (Arg : Node_Id) is
  247.       Argx : constant Node_Id    := Expression (Arg);
  248.       Loc  : constant Source_Ptr := Sloc (Arg);
  249.  
  250.    begin
  251.       if Nkind (Argx) not in N_Direct_Name
  252.         and then (Nkind (Argx) /= N_Selected_Component
  253.                    or else Nkind (Selector_Name (Argx)) /= N_Identifier)
  254.         and then (Nkind (Argx) /= N_Attribute_Reference
  255.                    or else Present (Expressions (Argx))
  256.                    or else Nkind (Prefix (Argx)) /= N_Identifier)
  257.       then
  258.          Error_Msg ("argument for pragma% must be local name", Loc);
  259.          raise Error_Resync;
  260.       end if;
  261.    end Check_Arg_Is_Local_Name;
  262.  
  263.    ----------------------------
  264.    -- Check_Arg_Is_On_Or_Off --
  265.    ----------------------------
  266.  
  267.    procedure Check_Arg_Is_On_Or_Off (Arg : Node_Id) is
  268.       Argx : constant Node_Id := Expression (Arg);
  269.  
  270.    begin
  271.       Check_Arg_Is_Identifier (Arg);
  272.  
  273.       if Chars (Argx) /= Name_On and then Chars (Argx) /= Name_Off then
  274.          Error_Msg_Name_2 := Name_On;
  275.          Error_Msg_Name_3 := Name_Off;
  276.  
  277.          Error_Msg
  278.            ("argument for pragma% must be% or%", Sloc (Argx));
  279.          raise Error_Resync;
  280.       end if;
  281.    end Check_Arg_Is_On_Or_Off;
  282.  
  283.    ---------------------------------
  284.    -- Check_Arg_Is_String_Literal --
  285.    ---------------------------------
  286.  
  287.    procedure Check_Arg_Is_String_Literal (Arg : Node_Id) is
  288.    begin
  289.       if Nkind (Expression (Arg)) /= N_String_Literal then
  290.          Error_Msg
  291.            ("argument for pragma% must be string literal",
  292.              Sloc (Expression (Arg)));
  293.          raise Error_Resync;
  294.       end if;
  295.    end Check_Arg_Is_String_Literal;
  296.  
  297.    ---------------------------------
  298.    -- Check_At_Least_One_Argument --
  299.    ---------------------------------
  300.  
  301.    procedure Check_At_Least_One_Argument is
  302.    begin
  303.       if Arg_Count = 0 then
  304.          Error_Msg ("pragma% requires at least one argument", Pragma_Sloc);
  305.          raise Error_Resync;
  306.       end if;
  307.    end Check_At_Least_One_Argument;
  308.  
  309.    -------------------------------------
  310.    -- Check_External_And_Or_Link_Name --
  311.    -------------------------------------
  312.  
  313.    procedure Check_External_And_Or_Link_Name (A1 : Node_Id; A2 : Node_Id) is
  314.    begin
  315.       if No (A1) then
  316.          return;
  317.  
  318.       elsif Present (A2) then
  319.          Check_Optional_Identifier (A1, Name_External_Name);
  320.          Check_Optional_Identifier (A2, Name_Link_Name);
  321.  
  322.       elsif Chars (A1) /= Name_Link_Name then
  323.          Check_Optional_Identifier (A1, Name_External_Name);
  324.       end if;
  325.  
  326.    end Check_External_And_Or_Link_Name;
  327.  
  328.    -------------------------------
  329.    -- Check_Library_Unit_Pragma --
  330.    -------------------------------
  331.  
  332.    procedure Check_Library_Unit_Pragma is
  333.    begin
  334.       Check_Ada_83_Warning;
  335.  
  336.       if Arg_Count /= 0 then
  337.          Check_No_Identifiers;
  338.          Check_Arg_Count (1);
  339.          Check_Arg_Is_Library_Unit_Name (Arg1);
  340.       end if;
  341.    end Check_Library_Unit_Pragma;
  342.  
  343.    -------------------------
  344.    -- Check_No_Identifier --
  345.    -------------------------
  346.  
  347.    procedure Check_No_Identifier (Arg : Node_Id) is
  348.    begin
  349.       if Chars (Arg) /= No_Name then
  350.          Error_Msg_N ("pragma% does not permit named arguments", Arg);
  351.          raise Error_Resync;
  352.       end if;
  353.    end Check_No_Identifier;
  354.  
  355.    --------------------------
  356.    -- Check_No_Identifiers --
  357.    --------------------------
  358.  
  359.    procedure Check_No_Identifiers is
  360.    begin
  361.       if Arg_Count > 0 then
  362.          Arg_Node := Arg1;
  363.  
  364.          while Present (Arg_Node) loop
  365.             Check_No_Identifier (Arg_Node);
  366.             Arg_Node := Next (Arg_Node);
  367.          end loop;
  368.       end if;
  369.    end Check_No_Identifiers;
  370.  
  371.    -------------------------------
  372.    -- Check_Optional_Identifier --
  373.    -------------------------------
  374.  
  375.    procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id) is
  376.    begin
  377.       if Present (Arg) and then Chars (Arg) /= No_Name then
  378.          if Chars (Arg) /= Id then
  379.             Error_Msg_Name_2 := Id;
  380.             Error_Msg_N ("pragma% argument expects identifier%", Arg);
  381.             raise Error_Resync;
  382.          end if;
  383.       end if;
  384.    end Check_Optional_Identifier;
  385.  
  386.    ----------
  387.    -- Prag --
  388.    ----------
  389.  
  390. begin
  391.    Error_Msg_Name_1 := Pragma_Name;
  392.  
  393.    --  Count number of arguments. This loop also checks if any of the arguments
  394.    --  are Error, indicating a syntax error as they were parsed. If so, we
  395.    --  simply return, because we get into trouble with cascaded errors if we
  396.    --  try to perform our error checks on junk arguments.
  397.  
  398.    Arg_Count := 0;
  399.  
  400.    if Present (Pragma_Argument_Associations (Pragma_Node)) then
  401.       Arg_Node := Arg1;
  402.  
  403.       while Arg_Node /= Empty loop
  404.          Arg_Count := Arg_Count + 1;
  405.  
  406.          if Expression (Arg_Node) = Error then
  407.             return Error;
  408.          end if;
  409.  
  410.          Arg_Node := Next (Arg_Node);
  411.       end loop;
  412.    end if;
  413.  
  414.    --  Remaining processing is pragma dependent
  415.  
  416.    case Get_Pragma_Id (Pragma_Name) is
  417.  
  418.       ------------
  419.       -- Ada_83 --
  420.       ------------
  421.  
  422.       --  This pragma must be processed at parse time, since we want to set
  423.       --  the Ada 83 and Ada 95 switches properly at parse time to recognize
  424.       --  Ada 83 syntax or Ada 95 syntax as appropriate.
  425.  
  426.       when Pragma_Ada_83 =>
  427.          Ada_83 := True;
  428.          Ada_95 := False;
  429.  
  430.       ------------
  431.       -- Ada_95 --
  432.       ------------
  433.  
  434.       --  This pragma must be processed at parse time, since we want to set
  435.       --  the Ada 83 and Ada_95 switches properly at parse time to recognize
  436.       --  Ada 83 syntax or Ada 95 syntax as appropriate.
  437.  
  438.       when Pragma_Ada_95 =>
  439.          Ada_83 := False;
  440.          Ada_95 := True;
  441.  
  442.       ------------------
  443.       -- Debug (GNAT) --
  444.       ------------------
  445.  
  446.       --  pragma Debug (PROCEDURE_CALL_STATEMENT);
  447.  
  448.       --  Syntax check: one argument which must be of the form of a procedure
  449.       --  call, parsed either as a name or as a function call. It is then
  450.       --  converted to the corresponding procedure call.
  451.  
  452.       when Pragma_Debug =>
  453.          Check_No_Identifiers;
  454.          Check_Arg_Count (1);
  455.  
  456.          declare
  457.             Expr : constant Node_Id := New_Copy (Expression (Arg1));
  458.  
  459.          begin
  460.             if Nkind (Expr) /= N_Indexed_Component
  461.               and then Nkind (Expr) /= N_Function_Call
  462.               and then Nkind (Expr) /= N_Identifier
  463.               and then Nkind (Expr) /= N_Selected_Component
  464.             then
  465.                Error_Msg
  466.                  ("argument of pragma% is not procedure call", Sloc (Expr));
  467.                raise Error_Resync;
  468.             else
  469.                Set_Debug_Statement
  470.                  (Pragma_Node, P_Statement_Name (Expr));
  471.             end if;
  472.          end;
  473.  
  474.       ------------------------
  475.       -- Elaborate (10.2.1) --
  476.       ------------------------
  477.  
  478.       --  pragma Elaborate (library_unit_NAME {, library_unit_NAME});
  479.  
  480.       --  Syntax check: at least one argument, all arguments of the form
  481.       --   of either identifiers, or selected components with the selector
  482.       --   name being an identifier.
  483.  
  484.       when Pragma_Elaborate =>
  485.          Check_No_Identifiers;
  486.          Check_At_Least_One_Argument;
  487.  
  488.          Arg_Node := Arg1;
  489.  
  490.          while Present (Arg_Node) loop
  491.             Check_Arg_Is_Library_Unit_Name (Arg_Node);
  492.             Arg_Node := Next (Arg_Node);
  493.          end loop;
  494.  
  495.       ----------------------------
  496.       -- Elaborate_All (10.2.1) --
  497.       ----------------------------
  498.  
  499.       --  pragma Elaborate_All (library_unit_NAME {, library_unit_NAME});
  500.  
  501.       --  Syntax check: at least one argument, all arguments of the form
  502.       --   of either identifiers, or selected components with the selector
  503.       --   name being an identifier.
  504.  
  505.       when Pragma_Elaborate_All =>
  506.          Check_Ada_83_Warning;
  507.          Check_No_Identifiers;
  508.          Check_At_Least_One_Argument;
  509.  
  510.          Arg_Node := Arg1;
  511.          while Present (Arg_Node) loop
  512.             Check_Arg_Is_Library_Unit_Name (Arg_Node);
  513.             Arg_Node := Next (Arg_Node);
  514.          end loop;
  515.  
  516.       -----------------------------
  517.       -- Elaborate_Body (10.2.1) --
  518.       -----------------------------
  519.  
  520.       --  pragma Elaborate_Body [(library_unit_NAME)];
  521.  
  522.       --  Syntax check: at most one argument, which, if present, is the
  523.       --  current compilation unit name
  524.  
  525.       when Pragma_Elaborate_Body =>
  526.          Check_Library_Unit_Pragma;
  527.  
  528.       ------------------
  529.       -- Export (B.1) --
  530.       ------------------
  531.  
  532.       --  pragma Export (
  533.       --    [Convention =>]    convention_IDENTIFIER,
  534.       --    [Entity =>]        LOCAL_NAME
  535.       --  [,[External_Name =>] static_string_EXPRESSION]]
  536.       --  [,[Link_Name =>]     static_string_EXPRESSION]] );
  537.  
  538.       --  Syntax check: 2-4 arguments. 1st argument must be a
  539.       --  convention, 2nd argument must be of the form of a local name
  540.  
  541.       when Pragma_Export =>
  542.          Check_Ada_83_Warning;
  543.  
  544.          if Arg_Count in 3 .. 4 then
  545.             Check_External_And_Or_Link_Name (Arg3, Arg4);
  546.          else
  547.             Check_Arg_Count (2);
  548.          end if;
  549.  
  550.          Check_Arg_Is_Convention (Arg1);
  551.          Check_Arg_Is_Local_Name (Arg2);
  552.          Check_Optional_Identifier (Arg2, Name_Entity);
  553.  
  554.       -----------------------------
  555.       -- Error_Monitoring (GNAT) --
  556.       -----------------------------
  557.  
  558.       --  pragma Error_Monitoring (ON | OFF, [STRING_LITERAL])
  559.  
  560.       --  This pragma must be processed at parse time, since it may be used
  561.       --  to monitor syntax errors in parse only mode wih semantics off.
  562.  
  563.       --  Note: at the current time, Error_Monitoring does not work for
  564.       --  syntax errors, but this will be fixed some time ???
  565.  
  566.  
  567.       when Pragma_Error_Monitoring =>
  568.          Check_Ada_83_Warning;
  569.          Check_No_Identifiers;
  570.          Check_Arg_Is_On_Or_Off (Arg1);
  571.  
  572.          if Arg_Count > 1 then
  573.             Check_Arg_Count (2);
  574.             Check_Arg_Is_String_Literal (Arg2);
  575.          end if;
  576.  
  577.       ------------------
  578.       -- Import (B.1) --
  579.       ------------------
  580.  
  581.       --  pragma Import (
  582.       --    [Convention =>]    convention_IDENTIFIER,
  583.       --    [Entity =>]        LOCAL_NAME
  584.       --  [,[External_Name =>] static_string_EXPRESSION]]
  585.       --  [,[Link_Name =>]     static_string_EXPRESSION]] );
  586.  
  587.       --  Syntax check: 2-4 arguments. 1st argument must be a convention,
  588.       --  2nd argument must be of the form of a local name
  589.  
  590.       when Pragma_Import =>
  591.          Check_Ada_83_Warning;
  592.  
  593.          if Arg_Count in 3 .. 4 then
  594.             Check_External_And_Or_Link_Name (Arg3, Arg4);
  595.          else
  596.             Check_Arg_Count (2);
  597.          end if;
  598.  
  599.          Check_Arg_Is_Convention (Arg1);
  600.          Check_Arg_Is_Local_Name (Arg2);
  601.          Check_Optional_Identifier (Arg2, Name_Entity);
  602.  
  603.       --------------------
  604.       -- Inline (6.3.2) --
  605.       --------------------
  606.  
  607.       --  pragma Inline (NAME {, NAME});
  608.  
  609.       --  Syntax check: at least one argument, and the arguments are either
  610.       --  of the form of identifiers, or of selected components.
  611.  
  612.       when Pragma_Inline =>
  613.          Check_No_Identifiers;
  614.          Check_At_Least_One_Argument;
  615.  
  616.          Arg_Node := Arg1;
  617.          while Present (Arg_Node) loop
  618.             Expr_Node := Expression (Arg_Node);
  619.  
  620.             if Nkind (Expr_Node) /= N_Identifier
  621.               and then Nkind (Expr_Node) /= N_Selected_Component
  622.               and then Nkind (Expr_Node) /= N_Operator_Symbol
  623.             then
  624.                Error_Msg
  625.                  ("argument of pragma% is not subprogram name",
  626.                    Sloc (Expr_Node));
  627.             end if;
  628.  
  629.             Arg_Node := Next (Arg_Node);
  630.          end loop;
  631.  
  632.       ------------------------
  633.       -- Interface (Ada 83) --
  634.       ------------------------
  635.  
  636.       --  pragma Interface (convention_IDENTIFIER, LOCAL_NAME);
  637.  
  638.       --  Syntax check: two arguments, first is a convention name
  639.  
  640.       when Pragma_Interface =>
  641.          Check_No_Identifiers;
  642.          Check_Arg_Count (2);
  643.          Check_Arg_Is_Convention (Arg1);
  644.          Check_Arg_Is_Local_Name (Arg2);
  645.  
  646.       ---------------------------
  647.       -- Interface_Name (GNAT) --
  648.       ---------------------------
  649.  
  650.       --  pragma Interface_Name (
  651.       --      [Entity =>]         LOCAL_NAME
  652.       --    [,[External_Name =>]  static_string_EXPRESSION]]
  653.       --    [,[Link_Name =>]      static_string_EXPRESSION]] );
  654.  
  655.       --  Syntax check: two or three arguments, first is of the form of a
  656.       --  local name.
  657.  
  658.       when Pragma_Interface_Name =>
  659.  
  660.          if Arg_Count /= 3 then
  661.             Check_Arg_Count (2);
  662.          end if;
  663.  
  664.          Check_External_And_Or_Link_Name (Arg2, Arg3);
  665.          Check_Arg_Is_Local_Name (Arg1);
  666.  
  667.       ----------------
  668.       -- List (2.8) --
  669.       ----------------
  670.  
  671.       --  pragma List (Off | On)
  672.  
  673.       --  The processing for pragma List must be done at parse time,
  674.       --  since a listing can be generated in parse only mode.
  675.  
  676.       when Pragma_List =>
  677.          Check_No_Identifiers;
  678.          Check_Arg_Count (1);
  679.          Check_Arg_Is_On_Or_Off (Arg1);
  680.  
  681.          --  We unconditionally make a List_On entry for the pragma, so that
  682.          --  in the List (Off) case, the pragma will print even in a region
  683.          --  of code with listing turned off (this is required!)
  684.  
  685.          List_Pragmas.Increment_Last;
  686.          List_Pragmas.Table (List_Pragmas.Last) :=
  687.            (Ptyp => List_On, Ploc => Sloc (Pragma_Node));
  688.  
  689.          --  Now generate the list off entry for pragma List (Off)
  690.  
  691.          if Chars (Expression (Arg1)) = Name_Off then
  692.             List_Pragmas.Increment_Last;
  693.             List_Pragmas.Table (List_Pragmas.Last) :=
  694.               (Ptyp => List_Off, Ploc => Semi);
  695.          end if;
  696.  
  697.       ----------------
  698.       -- Page (2.8) --
  699.       ----------------
  700.  
  701.       --  pragma Page;
  702.  
  703.       --  Processing for this pragma must be done at parse time, since a
  704.       --  listing can be generated in parse only mode with semantics off.
  705.  
  706.       when Pragma_Page =>
  707.          Check_No_Identifiers;
  708.          Check_Arg_Count (0);
  709.          List_Pragmas.Increment_Last;
  710.          List_Pragmas.Table (List_Pragmas.Last) := (Page, Semi);
  711.  
  712.       ---------------------------
  713.       -- Preelaborate (10.2.1) --
  714.       ---------------------------
  715.  
  716.       --  pragma Preelaborate [(library_unit_NAME)];
  717.  
  718.       --  Syntax check: at most one argument, which, if present, is the
  719.       --  current compilation unit name
  720.  
  721.       when Pragma_Preelaborate =>
  722.          Check_Library_Unit_Pragma;
  723.  
  724.       -------------------
  725.       -- Pure (10.2.1) --
  726.       -------------------
  727.  
  728.       --  pragma Pure [(library_unit_NAME)];
  729.  
  730.       --  Syntax check: at most one argument, which, if present, is the
  731.       --  current compilation unit name.
  732.  
  733.       when Pragma_Pure =>
  734.          Check_Library_Unit_Pragma;
  735.  
  736.       -----------------------------------
  737.       -- Remote_Call_Interface (E.2.3) --
  738.       -----------------------------------
  739.  
  740.       --  Pragma Remote_Call_Interface [(library_unit_NAME)];
  741.  
  742.       --  Syntax check: at most one argument, which, if present, is the
  743.       --  current compilation unit name
  744.  
  745.       when Pragma_Remote_Call_Interface =>
  746.          Check_Library_Unit_Pragma;
  747.  
  748.       --------------------------
  749.       -- Remote_Types (E.2.2) --
  750.       --------------------------
  751.  
  752.       --  Pragma Remote_Types [(library_unit_NAME)];
  753.  
  754.       --  Syntax check: at most one argument, which, if present, is the
  755.       --  current compilation unit name
  756.  
  757.       when Pragma_Remote_Types =>
  758.          Check_Library_Unit_Pragma;
  759.  
  760.       ----------------------------
  761.       -- Shared_Passive (E.2.1) --
  762.       ----------------------------
  763.  
  764.       --  pragma Shared_Passive [(library_unit_NAME)];
  765.  
  766.       --  Syntax check: at most one argument, which, if present, is the
  767.       --  current compilation unit name
  768.  
  769.       when Pragma_Shared_Passive =>
  770.          Check_Library_Unit_Pragma;
  771.  
  772.       -----------------------------
  773.       -- Source_Reference (GNAT) --
  774.       -----------------------------
  775.  
  776.       --  pragma Source_Reference
  777.       --    (INTEGER_LITERAL [, STRING_LITERAL] );
  778.  
  779.       --  Processing for this pragma must be done at parse time, since error
  780.       --  messages needing the proper line numbers can be generated in parse
  781.       --  only mode with semantic checking turned off, and indeed we usually
  782.       --  turn off semantic checking anyway if any parse errors are found.
  783.  
  784.       when Pragma_Source_Reference =>
  785.          Check_No_Identifiers;
  786.  
  787.          if Arg_Count /= 1 then
  788.             Check_Arg_Count (2);
  789.             Check_Arg_Is_String_Literal (Arg2);
  790.  
  791.             declare
  792.                S : constant String_Id := Strval (Expression (Arg2));
  793.                C : Char_Code;
  794.  
  795.             begin
  796.                Name_Len := 0;
  797.  
  798.                for J in 1 .. String_Length (S) loop
  799.                   C := Get_String_Char (S, J);
  800.  
  801.                   if In_Character_Range (C) then
  802.                      Name_Len := Name_Len + 1;
  803.                      Name_Buffer (Name_Len) := Get_Character (C);
  804.                   else
  805.                      Store_Encoded_Character (Get_String_Char (S, J));
  806.                   end if;
  807.                end loop;
  808.  
  809.                Set_Reference_Name (Current_Source_File, Name_Find);
  810.             end;
  811.          end if;
  812.  
  813.          if Nkind (Expression (Arg1)) /= N_Integer_Literal then
  814.             Error_Msg
  815.               ("argument for pragma% must be integer literal",
  816.                 Sloc (Expression (Arg1)));
  817.             raise Error_Resync;
  818.  
  819.          else
  820.             Set_Line_Offset
  821.               (Current_Source_File,
  822.                UI_To_Int (Intval (Expression (Arg1))) - 2);
  823.          end if;
  824.  
  825.       ---------------------
  826.       -- Suppress (11.5) --
  827.       ---------------------
  828.  
  829.       --  pragma Suppress (IDENTIFIER [, [On =>] NAME]);
  830.  
  831.       --  Syntax check: first argument must be an identifier which is a
  832.       --  valid check name. Second argument must be named On if name given.
  833.  
  834.       --  Note: pragma Unsuppress shares the same processing
  835.  
  836.       when Pragma_Suppress | Pragma_Unsuppress =>
  837.          Check_No_Identifier (Arg1);
  838.          Check_Optional_Identifier (Arg2, Name_On);
  839.          Check_At_Least_One_Argument;
  840.          Check_Arg_Is_Identifier (Arg1);
  841.  
  842.          if not Is_Check_Name (Chars (Expression (Arg1))) then
  843.             Error_Msg
  844.               ("argument of pragma% is not valid check name",
  845.                 Sloc (Expression (Arg1)));
  846.          end if;
  847.  
  848.       -----------------------
  849.       -- Unsuppress (GNAT) --
  850.       -----------------------
  851.  
  852.       --  pragma Unsuppress (IDENTIFIER [, [On =>] NAME]);
  853.  
  854.       --  Syntax check: first argument must be an identifier which is a
  855.       --  valid check name. Second argument must be named On if name given.
  856.  
  857.       --  processing for Unsuppress shares the pragma Suppress circuit
  858.  
  859.       ----------------------
  860.       -- All Oher Pragmas --
  861.       ----------------------
  862.  
  863.       --  For all other pragmas, checking and processing is handled
  864.       --  entirely in Sem_Prag, and no further checking is done by Par.
  865.  
  866.       when Pragma_Abort_Defer             |
  867.            Pragma_All_Calls_Remote        |
  868.            Pragma_Annotate                |
  869.            Pragma_Asynchronous            |
  870.            Pragma_Atomic                  |
  871.            Pragma_Atomic_Components       |
  872.            Pragma_Assert                  |
  873.            Pragma_Attach_Handler          |
  874.            Pragma_Controlled              |
  875.            Pragma_Convention              |
  876.            Pragma_CPP_Class               |
  877.            Pragma_CPP_Constructor         |
  878.            Pragma_CPP_Destructor          |
  879.            Pragma_CPP_Virtual             |
  880.            Pragma_CPP_Vtable              |
  881.            Pragma_Discard_Names           |
  882.            Pragma_Inspection_Point        |
  883.            Pragma_Interrupt_Handler       |
  884.            Pragma_Interrupt_Priority      |
  885.            Pragma_Linker_Options          |
  886.            Pragma_Locking_Policy          |
  887.            Pragma_Normalize_Scalars       |
  888.            Pragma_Machine_Attribute       |
  889.            Pragma_Memory_Size             |
  890.            Pragma_Optimize                |
  891.            Pragma_Pack                    |
  892.            Pragma_Priority                |
  893.            Pragma_Queuing_Policy          |
  894.            Pragma_Restrictions            |
  895.            Pragma_Reviewable              |
  896.            Pragma_Shared                  |
  897.            Pragma_Storage_Size            |
  898.            Pragma_Storage_Unit            |
  899.            Pragma_System_Name             |
  900.            Pragma_Task_Dispatching_Policy |
  901.            Pragma_Unimplemented_Unit      |
  902.            Pragma_Volatile                |
  903.            Pragma_Volatile_Components  =>
  904.          null;
  905.  
  906.    end case;
  907.  
  908.    return Pragma_Node;
  909.  
  910.    --------------------
  911.    -- Error Handling --
  912.    --------------------
  913.  
  914. exception
  915.    when Error_Resync =>
  916.       return Error;
  917.  
  918. end Prag;
  919.