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 / scans.ads < prev    next >
Text File  |  1996-09-28  |  18KB  |  395 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                                S C A N S                                 --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.27 $                             --
  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. with Types; use Types;
  26. package Scans is
  27.  
  28. --  The scanner maintains a current state in the global variables defined
  29. --  in this package. The call to the Scan routine advances this state to
  30. --  the next token. The state is initialized by the call to one of the
  31. --  initialization routines in Sinput.
  32.  
  33.    --  The following type is used to identify token types returned by Scan.
  34.    --  The class column in this table indicates the token classes which
  35.    --  apply to the token, as defined by subsquent subtype declarations.
  36.  
  37.    --  Note: the coding in SCN depends on the fact that the first entry in
  38.    --  this type declaration is *not* for a reserved word. For details on
  39.    --  why there is this requirement, see Scn.Initialize_Scanner.
  40.  
  41.    type Token_Type is (
  42.  
  43.       --  Token name          Token type   Class(es)
  44.  
  45.       Tok_Integer_Literal, -- numeric lit  Literal, Lit_Or_Name
  46.  
  47.       Tok_Real_Literal,    -- numeric lit  Literal, Lit_Or_Name
  48.  
  49.       Tok_String_Literal,  -- string lit   Literal. Lit_Or_Name
  50.  
  51.       Tok_Char_Literal,    -- char lit     Name, Literal. Lit_Or_Name
  52.  
  53.       Tok_Operator_Symbol, -- op symbol    Name, Literal, Lit_Or_Name, Desig
  54.  
  55.       Tok_Identifier,      -- identifer    Name, Lit_Or_Name, Desig
  56.  
  57.       Tok_Double_Asterisk, -- **
  58.  
  59.       Tok_Ampersand,       -- &            Binary_Addop
  60.       Tok_Minus,           -- -            Binary_Addop, Unary_Addop
  61.       Tok_Plus,            -- +            Binary_Addop, Unary_Addop
  62.  
  63.       Tok_Asterisk,        -- *            Mulop
  64.       Tok_Mod,             -- MOD          Mulop
  65.       Tok_Rem,             -- REM          Mulop
  66.       Tok_Slash,           -- /            Mulop
  67.  
  68.       Tok_New,             -- NEW
  69.  
  70.       Tok_Abs,             -- ABS
  71.       Tok_Others,          -- OTHERS
  72.       Tok_Null,            -- NULL
  73.  
  74.       Tok_Dot,             -- .            Namext
  75.       Tok_Apostrophe,      -- '            Namext
  76.  
  77.       Tok_Left_Paren,      -- (            Namext, Consk
  78.  
  79.       Tok_Delta,           -- DELTA        Atkwd, Sterm, Consk
  80.       Tok_Digits,          -- DIGITS       Atkwd, Sterm, Consk
  81.       Tok_Range,           -- RANGE        Atkwd, Sterm, Consk
  82.  
  83.       Tok_Right_Paren,     -- )            Sterm
  84.       Tok_Comma,           -- ,            Sterm
  85.  
  86.       Tok_And,             -- AND          Logop, Sterm
  87.       Tok_Or,              -- OR           Logop, Sterm
  88.       Tok_Xor,             -- XOR          Logop, Sterm
  89.  
  90.       Tok_Less,            -- <            Relop, Sterm
  91.       Tok_Equal,           -- =            Relop, Sterm
  92.       Tok_Greater,         -- >            Relop, Sterm
  93.       Tok_Not_Equal,       -- /=           Relop, Sterm
  94.       Tok_Greater_Equal,   -- >=           Relop, Sterm
  95.       Tok_Less_Equal,      -- <=           Relop, Sterm
  96.  
  97.       Tok_In,              -- IN           Relop, Sterm
  98.       Tok_Not,             -- NOT          Relop, Sterm
  99.  
  100.       Tok_Box,             -- <>           Relop, Eterm, Sterm
  101.       Tok_Colon_Equal,     -- :=           Eterm, Sterm
  102.       Tok_Colon,           -- :            Eterm, Sterm
  103.       Tok_Greater_Greater, -- >>           Eterm, Sterm
  104.  
  105.       Tok_Abstract,        -- ABSTRACT     Eterm, Sterm
  106.       Tok_Access,          -- ACCESS       Eterm, Sterm
  107.       Tok_Aliased,         -- ALIASED      Eterm, Sterm
  108.       Tok_All,             -- ALL          Eterm, Sterm
  109.       Tok_Array,           -- ARRAY        Eterm, Sterm
  110.       Tok_At,              -- AT           Eterm, Sterm
  111.       Tok_Body,            -- BODY         Eterm, Sterm
  112.       Tok_Constant,        -- CONSTANT     Eterm, Sterm
  113.       Tok_Do,              -- DO           Eterm, Sterm
  114.       Tok_Is,              -- IS           Eterm, Sterm
  115.       Tok_Limited,         -- LIMITED      Eterm, Sterm
  116.       Tok_Of,              -- OF           Eterm, Sterm
  117.       Tok_Out,             -- OUT          Eterm, Sterm
  118.       Tok_Record,          -- RECORD       Eterm, Sterm
  119.       Tok_Renames,         -- RENAMES      Eterm, Sterm
  120.       Tok_Reverse,         -- REVERSE      Eterm, Sterm
  121.       Tok_Tagged,          -- TAGGED       Eterm, Sterm
  122.       Tok_Then,            -- THEN         Eterm, Sterm
  123.  
  124.       Tok_Less_Less,       -- <<           Eterm, Sterm, After_SM
  125.  
  126.       Tok_Abort,           -- ABORT        Eterm, Sterm, After_SM
  127.       Tok_Accept,          -- ACCEPT       Eterm, Sterm, After_SM
  128.       Tok_Case,            -- CASE         Eterm, Sterm, After_SM
  129.       Tok_Delay,           -- DELAY        Eterm, Sterm, After_SM
  130.       Tok_Else,            -- ELSE         Eterm, Sterm, After_SM
  131.       Tok_Elsif,           -- ELSIF        Eterm, Sterm, After_SM
  132.       Tok_End,             -- END          Eterm, Sterm, After_SM
  133.       Tok_Exception,       -- EXCEPTION    Eterm, Sterm, After_SM
  134.       Tok_Exit,            -- EXIT         Eterm, Sterm, After_SM
  135.       Tok_Goto,            -- GOTO         Eterm, Sterm, After_SM
  136.       Tok_If,              -- IF           Eterm, Sterm, After_SM
  137.       Tok_Pragma,          -- PRAGMA       Eterm, Sterm, After_SM
  138.       Tok_Raise,           -- RAISE        Eterm, Sterm, After_SM
  139.       Tok_Requeue,         -- REQUEUE      Eterm, Sterm, After_SM
  140.       Tok_Return,          -- RETURN       Eterm, Sterm, After_SM
  141.       Tok_Select,          -- SELECT       Eterm, Sterm, After_SM
  142.       Tok_Terminate,       -- TERMINATE    Eterm, Sterm, After_SM
  143.       Tok_Until,           -- UNTIL        Eterm, Sterm, After_SM
  144.       Tok_When,            -- WHEN         Eterm, Sterm, After_SM
  145.  
  146.       Tok_Begin,           -- BEGIN        Eterm, Sterm, After_SM, Labeled_Stmt
  147.       Tok_Declare,         -- DECLARE      Eterm, Sterm, After_SM, Labeled_Stmt
  148.       Tok_For,             -- FOR          Eterm, Sterm, After_SM, Labeled_Stmt
  149.       Tok_Loop,            -- LOOP         Eterm, Sterm, After_SM, Labeled_Stmt
  150.       Tok_While,           -- WHILE        Eterm, Sterm, After_SM, Labeled_Stmt
  151.  
  152.       Tok_Entry,           -- ENTRY        Eterm, Sterm, Declk, Deckn, After_SM
  153.       Tok_Protected,       -- PROTECTED    Eterm, Sterm, Declk, Deckn, After_SM
  154.       Tok_Task,            -- TASK         Eterm, Sterm, Declk, Deckn, After_SM
  155.       Tok_Type,            -- TYPE         Eterm, Sterm, Declk, Deckn, After_SM
  156.       Tok_Subtype,         -- SUBTYPE      Eterm, Sterm, Declk, Deckn, After_SM
  157.       Tok_Use,             -- USE          Eterm, Sterm, Declk, Deckn, After_SM
  158.  
  159.       Tok_Function,        -- FUNCTION     Eterm, Sterm, Cunit, Declk, After_SM
  160.       Tok_Generic,         -- GENERIC      Eterm, Sterm, Cunit, Declk, After_SM
  161.       Tok_Package,         -- PACKAGE      Eterm, Sterm, Cunit, Declk, After_SM
  162.       Tok_Procedure,       -- PROCEDURE    Eterm, Sterm, Cunit, Declk, After_SM
  163.  
  164.       Tok_Private,         -- PRIVATE      Eterm, Sterm, Cunit, After_SM
  165.       Tok_With,            -- WITH         Eterm, Sterm, Cunit, After_SM
  166.       Tok_Separate,        -- SEPARATE     Eterm, Sterm, Cunit, After_SM
  167.  
  168.       Tok_EOF,             -- End of file  Eterm, Sterm, Cterm, After_SM
  169.  
  170.       Tok_Semicolon,       -- ;            Eterm, Sterm, Cterm
  171.  
  172.       Tok_Arrow,           -- =>           Sterm, Cterm, Chtok
  173.  
  174.       Tok_Vertical_Bar,    -- |            Cterm, Sterm, Chtok
  175.  
  176.       Tok_Dot_Dot,         -- ..           Sterm, Chtok
  177.  
  178.       No_Token);
  179.       --  No_Token is used for initializing Token values to indicate that
  180.       --  no value has been set yet.
  181.  
  182.    --  Note: in the RM, operator symbol is a special case of string literal.
  183.    --  We distinguish at the lexical level in this compiler, since there are
  184.    --  many syntactic situations in which only an operator symbol is allowed.
  185.  
  186.    --  The following subtype declarations group the token types into classes.
  187.    --  These are used for class tests in the parser.
  188.  
  189.       subtype Token_Class_Numeric_Literal is
  190.         Token_Type range Tok_Integer_Literal .. Tok_Real_Literal;
  191.       --  Numeric literal
  192.  
  193.       subtype Token_Class_Literal is
  194.         Token_Type range Tok_Integer_Literal .. Tok_Operator_Symbol;
  195.       --  Literal
  196.  
  197.       subtype Token_Class_Lit_Or_Name is
  198.         Token_Type range Tok_Integer_Literal .. Tok_Identifier;
  199.  
  200.       subtype Token_Class_Binary_Addop is
  201.         Token_Type range Tok_Ampersand .. Tok_Plus;
  202.       --  Binary adding operator (& + -)
  203.  
  204.       subtype Token_Class_Unary_Addop is
  205.         Token_Type range Tok_Minus .. Tok_Plus;
  206.       --  Unary adding operator (+ -)
  207.  
  208.       subtype Token_Class_Mulop is
  209.         Token_Type range Tok_Asterisk .. Tok_Slash;
  210.       --  Multiplying operator
  211.  
  212.       subtype Token_Class_Logop is
  213.         Token_Type range Tok_And .. Tok_Xor;
  214.       --  Logical operator (and, or, xor)
  215.  
  216.       subtype Token_Class_Relop is
  217.         Token_Type range Tok_Less .. Tok_Box;
  218.       --  Relational operator (= /= < <= > >= not, in plus <> to catch misuse
  219.       --  of Pascal style not equal operator).
  220.  
  221.       subtype Token_Class_Name is
  222.         Token_Type range Tok_Char_Literal .. Tok_Identifier;
  223.       --  First token of name (4.1),
  224.       --    (identifier, char literal, operator symbol)
  225.  
  226.       subtype Token_Class_Desig is
  227.         Token_Type range Tok_Operator_Symbol .. Tok_Identifier;
  228.       --  Token which can be a Designator (identifier, operator symbol)
  229.  
  230.       subtype Token_Class_Namext is
  231.         Token_Type range Tok_Dot .. Tok_Left_Paren;
  232.       --  Name extension tokens. These are tokens which can appear immediately
  233.       --  after a name to extend it recursively (period, quote, left paren)
  234.  
  235.       subtype Token_Class_Consk is
  236.         Token_Type range Tok_Left_Paren .. Tok_Range;
  237.       --  Keywords which can start constraint
  238.       --    (left paren, delta, digits, range)
  239.  
  240.       subtype Token_Class_Eterm is
  241.         Token_Type range Tok_Colon_Equal .. Tok_Semicolon;
  242.       --  Expression terminators. These tokens can never appear within a simple
  243.       --  expression. This is used for error recovery purposes (if we encounter
  244.       --  an error in an expression, we simply scan to the next Eterm token).
  245.  
  246.       subtype Token_Class_Sterm is
  247.         Token_Type range Tok_Delta .. Tok_Dot_Dot;
  248.       --  Simple_Expression terminators. A Simple_Expression must be followed
  249.       --  by a token in this class, or an error message is issued complaining
  250.       --  about a missing binary operator.
  251.  
  252.       subtype Token_Class_Atkwd is
  253.         Token_Type range Tok_Delta .. Tok_Range;
  254.       --  Attribute keywords. This class includes keywords which can be used
  255.       --  as an Attribute_Designator, namely DELTA, DIGITS and RANGE
  256.  
  257.       subtype Token_Class_Cterm is
  258.         Token_Type range Tok_EOF .. Tok_Vertical_Bar;
  259.       --  Choice terminators. These tokens terminate a choice. This is used for
  260.       --  error recovery purposes (if we encounter an error in a Choice, we
  261.       --  simply scan to the next Cterm token).
  262.  
  263.       subtype Token_Class_Chtok is
  264.         Token_Type range Tok_Arrow .. Tok_Dot_Dot;
  265.       --  Choice tokens. These tokens signal a choice when used in an Aggregate
  266.  
  267.       subtype Token_Class_Cunit is
  268.         Token_Type range Tok_Function .. Tok_Separate;
  269.       --  Tokens which can begin a compilation unit
  270.  
  271.       subtype Token_Class_Declk is
  272.         Token_Type range Tok_Entry .. Tok_Procedure;
  273.       --  Keywords which start a declaration
  274.  
  275.       subtype Token_Class_Deckn is
  276.         Token_Type range Tok_Entry .. Tok_Use;
  277.       --  Keywords which start a declaration but can't start a compilation unit
  278.  
  279.       subtype Token_Class_After_SM is
  280.         Token_Type range Tok_Less_Less .. Tok_EOF;
  281.       --  Tokens which always, or almost always, appear after a semicolon. Used
  282.       --  in the Resync_Past_Semicolon routine to avoid gobbling up stuff when
  283.       --  a semicolon is missing. Of significance only for error recovery.
  284.  
  285.       subtype Token_Class_Labeled_Stmt is
  286.         Token_Type range Tok_Begin .. Tok_While;
  287.       --  Tokens which start labeled statements
  288.  
  289.       type Token_Flag_Array is array (Token_Type) of Boolean;
  290.       Is_Reserved_Keyword : constant Token_Flag_Array := Token_Flag_Array'(
  291.          Tok_Mod      .. Tok_Rem      => True,
  292.          Tok_New      .. Tok_Null     => True,
  293.          Tok_Delta    .. Tok_Range    => True,
  294.          Tok_And      .. Tok_Xor      => True,
  295.          Tok_In       .. Tok_Not      => True,
  296.          Tok_Abstract .. Tok_Then     => True,
  297.          Tok_Abort    .. Tok_Separate => True,
  298.          others                       => False);
  299.       --  Flag array used to test for reserved word
  300.  
  301.    --------------------------
  302.    -- Scan State Variables --
  303.    --------------------------
  304.  
  305.    --  Note: these variables can only be referenced during the parsing of a
  306.    --  file. Reference to any of them from Sem or the expander is wrong.
  307.  
  308.    Scan_Ptr : Source_Ptr;
  309.    --  Current scan pointer location. After a call to Scan, this points
  310.    --  just past the end of the token just scanned.
  311.  
  312.    Token : Token_Type;
  313.    --  Type of current token
  314.  
  315.    Token_Ptr : Source_Ptr;
  316.    --  Pointer to first character of current token
  317.  
  318.    Current_Line_Start : Source_Ptr;
  319.    --  Pointer to first character of line containing current token
  320.  
  321.    Start_Column : Column_Number;
  322.    --  Starting column number (zero origin) of the first non-blank character
  323.    --  on the line containing the current token. This is used for error
  324.    --  recovery circuits which depend on looking at the column line up.
  325.  
  326.    First_Non_Blank_Location : Source_Ptr;
  327.    --  Location of first non-blank character on the line containing the
  328.    --  current token (i.e. the location of the character whose column number
  329.    --  is stored in Start_Column).
  330.  
  331.    Token_Node : Node_Id := Empty;
  332.    --  Node table Id for the current token. This is set only if the current
  333.    --  token is one for which the scanner constructs a node (i.e. it is an
  334.    --  identifier, operator symbol, or literal. For other token types,
  335.    --  Token_Node is undefined.
  336.  
  337.    Token_Name : Name_Id := No_Name;
  338.    --  For identifiers, this is set to the Name_Id of the identifier scanned.
  339.    --  For all other tokens, Token_Name is set to Error_Name. Note that it
  340.    --  would be possible for the caller to extract this information from
  341.    --  Token_Node. We set Token_Name separately for two reasons. First it
  342.    --  allows a quicker test for a specific identifier. Second, it allows
  343.    --  a version of the parser to be built that does not build tree nodes,
  344.    --  usable as a syntax checker.
  345.  
  346.    Prev_Token : Token_Type := No_Token;
  347.    --  Type of previous token
  348.  
  349.    Prev_Token_Ptr : Source_Ptr;
  350.    --  Pointer to first character of previous token
  351.  
  352.    Version_To_Be_Found : Boolean;
  353.    --  This flag is True if the scanner is still looking for an RCS version
  354.    --  number in a comment. Normally it is initialized to False so that this
  355.    --  circuit is not activated. If the -dv switch is set, then this flag is
  356.    --  initialized to True, and then reset when the version number is found.
  357.    --  We do things this way to minimize the impact on comment scanning.
  358.  
  359.    --------------------------------------------------------
  360.    -- Procedures for Saving and Restoring the Scan State --
  361.    --------------------------------------------------------
  362.  
  363.    --  The following procedures can be used to save and restore the entire
  364.    --  scan state. They are used in cases where it is necessary to backup
  365.    --  the scan during the parse.
  366.  
  367.    type Saved_Scan_State is private;
  368.    --  Used for saving and restoring the scan state
  369.  
  370.    procedure Save_Scan_State (Saved_State : out Saved_Scan_State);
  371.    pragma Inline (Save_Scan_State);
  372.    --  Saves the current scan state for possible later restoration. Note that
  373.    --  there is no harm in saving the state and then never restoring it.
  374.  
  375.    procedure Restore_Scan_State (Saved_State : in Saved_Scan_State);
  376.    pragma Inline (Restore_Scan_State);
  377.    --  Restores a scan state saved by a call to Save_Scan_State.
  378.    --  The saved scan state must refer to the current source file.
  379.  
  380. private
  381.    type Saved_Scan_State is record
  382.       Save_Scan_Ptr                 : Source_Ptr;
  383.       Save_Token                    : Token_Type;
  384.       Save_Token_Ptr                : Source_Ptr;
  385.       Save_Current_Line_Start       : Source_Ptr;
  386.       Save_Start_Column             : Column_Number;
  387.       Save_First_Non_Blank_Location : Source_Ptr;
  388.       Save_Token_Node               : Node_Id;
  389.       Save_Token_Name               : Name_Id;
  390.       Save_Prev_Token               : Token_Type;
  391.       Save_Prev_Token_Ptr           : Source_Ptr;
  392.    end record;
  393.  
  394. end Scans;
  395.