Files
PolyORB/compilers/iac/lexer.ads
Oliver Kellogg 2b691e0b96 Make IAC ignore IDL4 annotation applications:
compilers/iac/lexer.ads
- In Token_Type add T_At.

compilers/iac/lexer.adb
- In procedure Process, in then-part of `if not Initialized' add call
    New_Token (T_At, "@");
- In procedure Scan_Token (Fatal : Boolean) case-statement decoding
  Buffer (Token_Location.Scan) add handling of '@':
  - If the following token is an identifier then skip the identifier
    and whitespace that may follow it; if the following token is '('
    then seek ')' and increment Token_Location.Scan to the index after
    the ')'.  Do not modify the value of Token.
  - Otherwise set Token to T_At.
2018-05-26 22:30:16 +02:00

355 lines
10 KiB
Ada

------------------------------------------------------------------------------
-- --
-- POLYORB COMPONENTS --
-- --
-- L E X E R --
-- --
-- S p e c --
-- --
-- Copyright (C) 2005-2017, Free Software Foundation, Inc. --
-- --
-- This is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. This software is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public --
-- License for more details. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- PolyORB is maintained by AdaCore --
-- (email: sales@adacore.com) --
-- --
------------------------------------------------------------------------------
with Ada.Containers.Vectors;
with GNAT.OS_Lib; use GNAT.OS_Lib;
with Locations; use Locations;
with Source_Input; use Source_Input;
with Types; use Types;
package Lexer is
pragma Elaborate_Body (Lexer);
type Token_Type is
(T_Error,
T_Identifier,
-- About pragmas
T_Pragma,
T_Pragma_Unrecognized,
T_Pragma_Id,
T_Pragma_Prefix,
T_Pragma_Version,
T_Pragma_Range,
T_Pragma_Range_Idl,
T_Pragma_Subtype,
T_Pragma_Derived,
T_Pragma_Switchname,
T_Pragma_javaPackage,
-- About basic keywords
T_Abstract, -- First keyword
T_Component,
T_Const,
T_Consumes,
T_Emits,
T_Eventtype,
T_Exception,
T_Finder,
T_Home,
T_Import,
T_Interface,
T_Local,
T_Module,
T_Multiple,
T_Native,
T_Primary_Key,
T_Provides,
T_Publishes,
T_Typedef,
T_Type_Id,
T_Type_Prefix,
T_Uses,
T_Value_Type,
-- About attributes
T_Readonly,
T_Attribute,
T_Get_Raises,
T_Set_Raises,
-- About operations
T_Oneway,
T_Void,
T_In,
T_Inout,
T_Out,
T_Context,
T_Raises,
-- Basic types
T_Float,
T_Double,
T_Unsigned,
T_Short,
T_Long,
T_Char,
T_Wchar,
T_Boolean,
T_Octet,
T_Any,
T_Object,
T_Value_Base,
-- Boolean values
T_False,
T_True,
-- About constructed types
T_Enum,
T_Struct,
T_Union,
T_Case,
T_Default,
T_Switch,
-- About template types
T_Sequence,
T_String,
T_Wstring,
T_Fixed,
-- About value types
T_Custom,
T_Factory,
T_Private,
T_Public,
T_Supports,
T_Truncatable, -- Last keyword
-- Graphic characters
T_At,
T_Colon,
T_Comma,
T_Semi_Colon,
T_Left_Brace,
T_Left_Bracket,
T_Left_Paren,
T_Right_Brace,
T_Right_Bracket,
T_Right_Paren,
T_Equal,
T_Greater,
T_Less,
T_Tilde, -- First unary operator
T_Minus, -- First binary operator
T_Plus, -- Last unary operator
T_Percent,
T_Slash,
T_Star,
T_Ampersand,
T_Bar,
T_Circumflex,
-- Double graphic characters
T_Greater_Greater,
T_Less_Less, -- Last binary operator
T_Colon_Colon,
T_Dot_Dot, -- currently only used in #pragma range
-- Literals
T_Integer_Literal,
T_String_Literal,
T_Wide_String_Literal,
T_Character_Literal,
T_Wide_Character_Literal,
T_Fixed_Point_Literal,
T_Floating_Point_Literal,
T_Boolean_Literal,
T_EOF);
First_Token_Pos : constant := Token_Type'Pos (Token_Type'First);
Last_Token_Pos : constant := Token_Type'Pos (Token_Type'Last);
First_Pragma_Token_Pos : constant := Token_Type'Pos (T_Pragma_Unrecognized);
type Token_List_Type is array (Positive range <>) of Token_Type;
subtype Keyword_Type is Token_Type
range T_Abstract .. T_Truncatable;
subtype Literal_Type is Token_Type
range T_Integer_Literal .. T_Boolean_Literal;
subtype Operator_Type is Token_Type
range T_Tilde .. T_Less_Less;
subtype Unary_Operator_Type is Token_Type
range T_Tilde .. T_Plus;
subtype Binary_Operator_Type is Token_Type
range T_Minus .. T_Less_Less;
subtype Mode_Type is Token_Type
range T_In .. T_Out;
-----------------
-- Pragma_Type --
-----------------
-- Note: the constants below must be kept in sync with the list of pragma
-- tokens in Token_Type.
-- Can't we do away with the annoying duplication???
Pragma_Unrecognized : constant := 0;
Pragma_Id : constant := 1;
Pragma_Prefix : constant := 2;
Pragma_Version : constant := 3;
Pragma_Range : constant := 4;
Pragma_Range_Idl : constant := 5;
Pragma_Subtype : constant := 6;
Pragma_Derived : constant := 7;
Pragma_Switchname : constant := 8;
Pragma_javaPackage : constant := 9;
type Pragma_Type is new Byte
range Pragma_Unrecognized .. Pragma_javaPackage;
Token : Token_Type;
Token_Name : Name_Id;
Token_Location : Location;
function Is_Literal (T : Token_Type) return Boolean;
function Is_Operator (T : Token_Type) return Boolean;
function Is_Scoped_Name (T : Token_Type) return Boolean;
function Image (T : Token_Type) return String;
-- Return an image of token T.
procedure Finalize_Imported;
-- Pops the lexer state (when the state stack is not empty)
function Handled (File_Name_Id : Name_Id) return Boolean;
-- Indicate whether the file was parsed or not in order to avoid cyclic
-- imports
procedure Set_Handled (File_Name_Id : Name_Id);
-- Marks the file as handled
procedure Scan_Token;
-- Scan token and update global variables Token, Token_Name
-- (for identifiers and literals) and Token_Location.
procedure Scan_Token (T : Token_Type);
-- Same as above. When the current token is not the expected token
-- T, an error message is output and Token is set to T_Error. As a
-- special case, when T_Semi_Colon is expected, we output an error
-- location at the end of the line instead of the current token
-- location.
procedure Scan_Token (L : Token_List_Type);
-- Same as above. When the current token is not in the list of the
-- expected tokens L, an error message is output.
function Next_Token return Token_Type;
-- Return next token but do not update the lexer state that is
-- Token, Token_Name and Token_Location.
procedure Unexpected_Token (T : Token_Type; C : String);
-- Output an error message to indicate that T is unexpected. If C
-- is not a null string, the message also indicates in which
-- construct it is not expected.
procedure Save_Lexer (State : out Location);
-- Saves the current location in the State variable
procedure Restore_Lexer (State : Location);
-- Modifies the current location in the IDL specification
procedure Push_Lexer_State;
-- Pushes the current location in a state stack and deallocates the data
-- concerning the handled IDL specification
procedure Pop_Lexer_State;
-- Pops a location from the state stack and loads the corresponding file
procedure Skip_Declaration (Delimiter : Token_Type);
-- Skip until we find a potential end of declaration. Delimiter
-- indicates the kind of delimiters we are looking for (';', ',',
-- ':') or ('{', '(', '[') or ('}', ')', ']'). We ensure that the
-- declaration is well embraced.
procedure Skip_Line;
-- Skip current line
-- Various literal values updated when the corresponding token is read
Integer_Literal_Value : Unsigned_Long_Long;
Integer_Literal_Sign : Short;
Integer_Literal_Base : Unsigned_Short_Short;
Decimal_Point_Position : Unsigned_Short_Short;
Float_Literal_Value : Long_Double;
String_Literal_Value : Name_Id;
Character_Literal_Value : Unsigned_Short;
Is_Wide_Literal_Value : Boolean;
-- Since the name id used to designate empty string is No_Name, the
-- incorrect string should not be No_Name.
Incorrect_String : constant Name_Id := Name_Id'Last;
Incorrect_Character : constant Unsigned_Short := LUS;
-- Preprocessor and processor related entities
package String_Vectors is new Ada.Containers.Vectors
(Index_Type => Positive,
Element_Type => String_Access);
IAC_Search_Paths : String_Vectors.Vector;
-- IAC search path (for imports and for preprocessor)
Keep_TMP_Files : Boolean := False;
-- True when we want to keep temporary files generated during the
-- compilation process
procedure Add_CPP_Flag (S : String);
-- Add argument S to the preprocessor flags
procedure Add_IAC_Search_Path (S : String);
-- Add argument S to the search path
function Preprocess (Source_Name : Types.Name_Id) return Source_File_Ptr;
-- Return a Source_File representing the preprocessed source file, unless
-- preprocessing is disabled, in which case we return the original source
-- file.
procedure Process (Source : Source_File_Ptr);
-- Load file Source in the lexer
procedure Write (T : Token_Type);
end Lexer;