Package: libopentoken-dev
Version: 3.0b-8
Severity: normal

I'm the author of the Ada lexer in OpenToken. The following code fragment is 
not correctly analyzed: Character'('x')

The result is

IDENTIFIER_T Character
CHARACTER_T '('
IDENTIFIER_T x
TICK_T '
RIGHT_PARENTHESIS_T )

This would be the correct result:

IDENTIFIER_T Character
TICK_T '
LEFT_PARENTHESIS_T (
CHARACTER_T 'x'
RIGHT_PARENTHESIS_T )

I have a solution for this, but am not overly happy with it since I had to 
change the lexer interface, which introduces an incompatibility.

I have no idea how to change the character literal recognizer itself in order 
to deliver the correct result. It would need to know the previous token (a 
Character_Literal cannot follow an Identifier, so it must be a Tick that 
follows the identifier Character).

So I changed the lexer to handle this case by disabling the recognizer after an 
identifier and enabling it else.

Please see the changes in the attachments.

(The Character_Set change in fact has nothing to do with the above - I only 
removed an unused declaration.)

I'm not a Debian user.

-------------------------------------------------------------------------------
--
-- Copyright (C) 1999, 2008 Christoph Karl Walter Grein
--
-- This file is part of the OpenToken package.
--
-- The OpenToken package is free software; you can redistribute it and/or
-- modify it under the terms of the  GNU General Public License as published
-- by the Free Software Foundation; either version 2, or (at your option)
-- any later version. The OpenToken package is distributed in the hope that
-- it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY 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  distributed with the OpenToken
-- package;  see file GPL.txt.  If not, write to  the Free Software Foundation,
-- 59 Temple Place - Suite 330,  Boston, MA 02111-1307, USA.
--
-- As a special exception,  if other files  instantiate  generics from this
-- unit, or you link this unit with other files to produce an executable,
-- this unit does not by itself cause the resulting executable to be
-- covered by the GNU General Public License.  This exception does not
-- however invalidate any other reasons why the executable file might be
-- covered by the GNU Public License.
--
-- Maintainer: Christoph K. W. Grein ([EMAIL PROTECTED])
--
-- Update History:
-- $Log: test_ada_lexer.adb,v $
-- Revision 1.3  2000/01/27 21:16:09  Ted
-- Fix to use new text feeder objects
--
-- Revision 1.2  1999/12/27 19:56:05  Ted
-- fix file contents to work w/ new hierarchy
--
-- Revision 1.1  1999/08/17 03:36:53  Ted
-- Initial Version
--
-- 0.1 - 23 June 1999  Input via command line parameter; bug fix for EOF
-- 0.0 - 22 June 1999  First preliminary release
-------------------------------------------------------------------------------

with Ada.Text_IO;
with Ada.Command_Line;

with Ada_Lexer;
use  Ada_Lexer;

procedure Test_Ada_Lexer is

  -- Global text file for reading parse data
  File: Ada.Text_IO.File_Type;

begin

  Ada.Text_IO.Open (File => File,
                    Mode => Ada.Text_IO.In_File,
                    Name => Ada.Command_Line.Argument (1));

  Set_Input_Feeder (File);
  Bad_Token_on_Syntax_Error;

  loop

    Find_Next;

    Ada.Text_IO.Put_Line (Ada_Token'Image (Token_ID) & ' ' & Lexeme);

    exit when Token_ID = End_of_File_T;

  end loop;

end Test_Ada_Lexer;
-------------------------------------------------------------------------------
--
-- Copyright (C) 1999, 2008 Christoph Karl Walter Grein
--
-- This file is part of the OpenToken package.
--
-- The OpenToken package is free software; you can redistribute it and/or
-- modify it under the terms of the  GNU General Public License as published
-- by the Free Software Foundation; either version 2, or (at your option)
-- any later version. The OpenToken package is distributed in the hope that
-- it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY 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  distributed with the OpenToken
-- package;  see file GPL.txt.  If not, write to  the Free Software Foundation,
-- 59 Temple Place - Suite 330,  Boston, MA 02111-1307, USA.
--
-- As a special exception,  if other files  instantiate  generics from this
-- unit, or you link this unit with other files to produce an executable,
-- this unit does not by itself cause the resulting executable to be
-- covered by the GNU General Public License.  This exception does not
-- however invalidate any other reasons why the executable file might be
-- covered by the GNU Public License.
--
-- Maintainer: Christoph K. W. Grein ([EMAIL PROTECTED])
--
-- Update History:
-- $Log: ada_lexer.ads,v $
-- Revision 1.5  2000/08/07 00:17:43  Ted
-- Change to work w/ new package hierarchy
--
-- Revision 1.4  2000/01/27 21:21:05  Ted
-- Fix to work with 2.0
--
-- Revision 1.3  1999/12/27 19:56:05  Ted
-- fix file contents to work w/ new hierarchy
--
-- Revision 1.2  1999/10/08 23:19:01  Ted
-- Disable sign recognition in integer and real literals
--
-- Revision 1.1  1999/08/17 03:40:24  Ted
-- Initial Version
--
-- 1.0 -  8 August 1999  Final complete version
-- 0.3 - 26 June 1999    Added character literals
-- 0.2 - 25 June 1999    Added based numbers
--                       (still missing: character literals and strings)
-- 0.1 - 23 June 1999    Bug fix (numeric literals)
-- 0.0 - 22 June 1999    First preliminary release
-------------------------------------------------------------------------------

with Ada.Strings.Maps.Constants;

with OpenToken.Token.Enumerated;
with OpenToken.Token.Enumerated.Analyzer;
with OpenToken.Recognizer.Keyword, OpenToken.Recognizer.Separator;
with OpenToken.Recognizer.Identifier;
with OpenToken.Recognizer.Graphic_Character, OpenToken.Recognizer.String;
with OpenToken.Recognizer.Integer, OpenToken.Recognizer.Based_Integer_Ada_Style,
     OpenToken.Recognizer.Real, OpenToken.Recognizer.Based_Real_Ada_Style;
with OpenToken.Recognizer.Character_Set;
with OpenToken.Recognizer.Line_Comment;
with OpenToken.Recognizer.Nothing;
with OpenToken.Recognizer.End_Of_File;
with OpenToken.Text_Feeder.Text_IO;

pragma Elaborate_All (OpenToken.Token.Enumerated, 
OpenToken.Token.Enumerated.Analyzer,
                      OpenToken.Recognizer.Keyword, 
OpenToken.Recognizer.Separator,
                      OpenToken.Recognizer.Identifier,
                      OpenToken.Recognizer.Graphic_Character, 
OpenToken.Recognizer.String,
                      OpenToken.Recognizer.Integer, 
OpenToken.Recognizer.Based_Integer_Ada_Style,
                      OpenToken.Recognizer.Real, 
OpenToken.Recognizer.Based_Real_Ada_Style,
                      OpenToken.Recognizer.Character_Set,
                      OpenToken.Recognizer.Line_Comment,
                      OpenToken.Recognizer.Nothing,
                      OpenToken.Recognizer.End_Of_File,
                      OpenToken.Text_Feeder.Text_IO);

package body Ada_Lexer is

  package Master_Ada_Token is new OpenToken.Token.Enumerated (Ada_Token);
  package Tokenizer        is new Master_Ada_Token.Analyzer;

  Syntax : constant Tokenizer.Syntax :=
    (Abort_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("abort")),
     Abs_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("abs")),
     Abstract_T     => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("abstract")),
     Accept_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("accept")),
     Access_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("access")),
     Aliased_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("aliased")),
     All_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("all")),
     And_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("and")),
     Array_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("array")),
     At_T           => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("at")),
     Begin_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("begin")),
     Body_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("body")),
     Case_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("case")),
     Constant_T     => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("constant")),
     Declare_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("declare")),
     Delay_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("delay")),
     Delta_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("delta")),
     Digits_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("digits")),
     Do_T           => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("do")),
     Else_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("else")),
     Elsif_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("elsif")),
     End_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("end")),
     Entry_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("entry")),
     Exception_T    => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("exception")),
     Exit_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("exit")),
     For_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("for")),
     Function_T     => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("function")),
     Generic_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("generic")),
     Goto_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("goto")),
     If_T           => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("if")),
     In_T           => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("in")),
     Interface_T    => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("interface")),
     Is_T           => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("is")),
     Limited_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("limited")),
     Loop_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("loop")),
     Mod_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("mod")),
     New_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("new")),
     Not_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("not")),
     Null_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("null")),
     Of_T           => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("of")),
     Or_T           => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("or")),
     Others_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("others")),
     Out_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("out")),
     Overriding_T   => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("overriding")),
     Package_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("package")),
     Pragma_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("pragma")),
     Private_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("private")),
     Procedure_T    => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("procedure")),
     Protected_T    => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("protected")),
     Raise_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("raise")),
     Range_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("range")),
     Record_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("record")),
     Rem_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("rem")),
     Renames_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("renames")),
     Requeue_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("requeue")),
     Return_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("return")),
     Reverse_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("reverse")),
     Select_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("select")),
     Separate_T     => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("separate")),
     Subtype_T      => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("subtype")),
     Synchronized_T => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("synchronized")),
     Tagged_T       => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("tagged")),
     Task_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("task")),
     Terminate_T    => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("terminate")),
     Then_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("then")),
     Type_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("type")),
     Until_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("until")),
     Use_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("use")),
     When_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("when")),
     While_T        => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("while")),
     With_T         => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get 
("with")),
     Xor_T          => Tokenizer.Get (OpenToken.Recognizer.Keyword.Get ("xor")),
     Colon_T               => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(":")),
     Comma_T               => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(",")),
     Dot_T                 => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(".")),
     Semicolon_T           => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(";")),
     Tick_T                => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("'")),
     Left_Parenthesis_T    => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("(")),
     Right_Parenthesis_T   => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(")")),
     Concatenate_T         => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("&")),
     Alternative_T         => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("|")),
     Equal_T               => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("=")),
     Not_Equal_T           => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("/=")),
     Greater_Than_T        => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(">")),
     Less_Than_T           => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("<")),
     Greater_Equal_T       => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(">=")),
     Less_Equal_T          => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("<=")),
     Plus_T                => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("+")),
     Minus_T               => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("-")),
     Times_T               => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("*")),
     Divide_T              => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("/")),
     Arrow_T               => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("=>")),
     Assignment_T          => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(":=")),
     Double_Dot_T          => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("..")),
     Exponentiate_T        => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("**")),
     Left_Label_Bracket_T  => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("<<")),
     Right_Label_Bracket_T => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
(">>")),
     Box_T                 => Tokenizer.Get (OpenToken.Recognizer.Separator.Get 
("<>")),
     Integer_T       => Tokenizer.Get (OpenToken.Recognizer.Integer.Get 
(Allow_Signs => False)),
     Based_Integer_T => Tokenizer.Get 
(OpenToken.Recognizer.Based_Integer_Ada_Style.Get),
     Real_T          => Tokenizer.Get (OpenToken.Recognizer.Real.Get 
(Allow_Signs => False)),
     Based_Real_T    => Tokenizer.Get 
(OpenToken.Recognizer.Based_Real_Ada_Style.Get),
     Character_T     => Tokenizer.Get 
(OpenToken.Recognizer.Graphic_Character.Get),
     String_T        => Tokenizer.Get (OpenToken.Recognizer.String.Get),
     Identifier_T    => Tokenizer.Get (OpenToken.Recognizer.Identifier.Get),
     Comment_T       => Tokenizer.Get (OpenToken.Recognizer.Line_Comment.Get 
("--")),
     Whitespace_T    => Tokenizer.Get (OpenToken.Recognizer.Character_Set.Get 
(OpenToken.Recognizer.Character_Set.Standard_Whitespace)),
     Bad_Token_T     => Tokenizer.Get (OpenToken.Recognizer.Nothing.Get),
     End_of_File_T   => Tokenizer.Get (OpenToken.Recognizer.End_Of_File.Get));

  Analyzer: Tokenizer.Instance := Tokenizer.Initialize (Syntax);

  procedure Set_Input_Feeder (File: in Ada.Text_IO.File_Type) is
  begin
    Ada.Text_IO.Set_Input (File);
    Tokenizer.Input_Feeder := OpenToken.Text_Feeder.Text_IO.Create;
  end Set_Input_Feeder;

  procedure Exception_on_Syntax_Error is
  begin
    Tokenizer.Unset_Default (Analyzer);
  end Exception_on_Syntax_Error;

  procedure Bad_Token_on_Syntax_Error is
  begin
    Tokenizer.Set_Default (Analyzer, Bad_Token_T);
  end Bad_Token_on_Syntax_Error;

  procedure Set_Comments_Reportable (To: in Boolean) is
  begin
    Syntax (Comment_T).Recognizer.Report := To;
  end Set_Comments_Reportable;

  Exclusion: constant array (Boolean) of Ada.Strings.Maps.Character_Set :=  -- 
see Find_Next
    (False => Ada.Strings.Maps.Null_Set,                -- character literal 
enabled
     True  => Ada.Strings.Maps.Constants.Graphic_Set);  --                   
disabled

  procedure Find_Next is
    -- Take care that the expression Character'('x') is correctly processed:
    -- A character literal cannot follow an identifier.
  begin
    Tokenizer.Find_Next (Analyzer, Look_Ahead => False);
    OpenToken.Recognizer.Graphic_Character.Redefine
      (OpenToken.Recognizer.Graphic_Character.Instance (Syntax 
(Character_T).Recognizer.all),
       Exclusion (Token_ID = Identifier_T));
  end Find_Next;

  function Line return Natural is
  begin
    return Tokenizer.Line (Analyzer);
  end Line;

  function Column return Natural is
  begin
    return Tokenizer.Column (Analyzer);
  end Column;

  function Token_ID return Ada_Token is
  begin
    return Tokenizer.ID (Analyzer);
  end Token_ID;

  function Lexeme return String is
  begin
    return Tokenizer.Lexeme (Analyzer);
  end Lexeme;

end Ada_Lexer;
-------------------------------------------------------------------------------
--
-- Copyright (C) 1999, 2008 Christoph Karl Walter Grein
--
-- This file is part of the OpenToken package.
--
-- The OpenToken package is free software; you can redistribute it and/or
-- modify it under the terms of the  GNU General Public License as published
-- by the Free Software Foundation; either version 2, or (at your option)
-- any later version. The OpenToken package is distributed in the hope that
-- it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY 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  distributed with the OpenToken
-- package;  see file GPL.txt.  If not, write to  the Free Software Foundation,
-- 59 Temple Place - Suite 330,  Boston, MA 02111-1307, USA.
--
-- As a special exception,  if other files  instantiate  generics from this
-- unit, or you link this unit with other files to produce an executable,
-- this unit does not by itself cause the resulting executable to be
-- covered by the GNU General Public License.  This exception does not
-- however invalidate any other reasons why the executable file might be
-- covered by the GNU Public License.
--
-- Maintainer: Christoph K. W. Grein ([EMAIL PROTECTED])
--
-- Update History:
-- $Log: ada_lexer.ads,v $
-- Revision 1.5  2000/08/07 00:17:43  Ted
-- Change to work w/ new package hierarchy
--
-- Revision 1.4  2000/01/27 21:21:05  Ted
-- Fix to work with 2.0
--
-- Revision 1.3  1999/12/27 19:56:05  Ted
-- fix file contents to work w/ new hierarchy
--
-- Revision 1.2  1999/10/08 23:19:01  Ted
-- Disable sign recognition in integer and real literals
--
-- Revision 1.1  1999/08/17 03:40:24  Ted
-- Initial Version
--
-- 1.0 -  8 August 1999  Final complete version
-- 0.3 - 26 June 1999    Added character literals
-- 0.2 - 25 June 1999    Added based numbers
--                       (still missing: character literals and strings)
-- 0.1 - 23 June 1999    Bug fix (numeric literals)
-- 0.0 - 22 June 1999    First preliminary release
-------------------------------------------------------------------------------

with Ada.Text_IO;

package Ada_Lexer is

  ---------------------------------------------------------------------
  -- This ia a lexical analyser for the Ada language.
  --
  -- There is another lexer for the Ada and Java languages at:
  --   <http://home.T-Online.de/home/Christ-Usch.Grein/Ada/Lexer.html>
  ---------------------------------------------------------------------

  type Ada_Token is
    (-- Reserved words ARM 2.9 (2)
     Abort_T, Abs_T, Abstract_T, Accept_T, Access_T, Aliased_T, All_T, And_T, 
Array_T, At_T,
     Begin_T, Body_T,
     Case_T, Constant_T,
     Declare_T, Delay_T, Delta_T, Digits_T, Do_T,
     Else_T, Elsif_T, End_T, Entry_T, Exception_T, Exit_T,
     For_T, Function_T,
     Generic_T, Goto_T,
     If_T, In_T, Interface_T, Is_T,
     Limited_T, Loop_T,
     Mod_T,
     New_T, Not_T, Null_T,
     Of_T, Or_T, Others_T, Out_T, Overriding_T,
     Package_T, Pragma_T, Private_T, Procedure_T, Protected_T,
     Raise_T, Range_T, Record_T, Rem_T, Renames_T, Requeue_T, Return_T, 
Reverse_T,
     Select_T, Separate_T, Subtype_T, Synchronized_T,
     Tagged_T, Task_T, Terminate_T, Then_T, Type_T,
     Until_T, Use_T,
     When_T, While_T, With_T,
     Xor_T,
     -- Delimiters ARM 2.2 (9)
     -- & ' ( ) * + , - . / : ; < = > |
     -- Compound delimiters ARM 2.2 (11)
     -- => .. ** := /= >= <= << >> <>
     Colon_T, Comma_T, Dot_T, Semicolon_T, Tick_T,         -- : , . ; '
     Left_Parenthesis_T, Right_Parenthesis_T,              -- ( )
     Concatenate_T,                                        -- &
     Alternative_T,                                        -- |
     Equal_T, Not_Equal_T, Greater_Than_T, Less_Than_T,    -- = /= > <
     Greater_Equal_T, Less_Equal_T,                        -- >= <=
     Plus_T, Minus_T, Times_T, Divide_T,                   -- + - * /
     Arrow_T, Assignment_T, Double_Dot_T, Exponentiate_T,  -- => := .. **
     Left_Label_Bracket_T, Right_Label_Bracket_T, Box_T,   -- << >> <>
     -- Literals ARM 2.4 .. 2.6
     Integer_T,               -- 1, 1E+10
     Based_Integer_T,         -- 13#C#, 13#C#E+10
     Real_T,                  -- -3.141, 1.0E+10
     Based_Real_T,            -- 13#C.B#, 13#C.B#E+5
     Character_T, String_T,
     -- Other tokens
     Identifier_T,
     Comment_T,
     Whitespace_T,
     -- Syntax error
     Bad_Token_T,
     --
     End_of_File_T);

  -- Define the file where to find the code to be processed.
  -- The file must be open for reading.
  procedure Set_Input_Feeder (File: in Ada.Text_IO.File_Type);

  -- In case of syntax errors:
  -- Define whether the Syntax_Error exception shall be raised (default)
  -- or the Bad_Token_T token shall be be returned.
  procedure Exception_on_Syntax_Error;
  procedure Bad_Token_on_Syntax_Error;

  -- Change reportability of comments (off by default).
  procedure Set_Comments_Reportable (To: in Boolean);

  -- Find the next reportable token.
  procedure Find_Next;

  -- Query the current token:

  function Line   return Natural;
  function Column return Natural;

  function Token_ID return Ada_Token;
  function Lexeme   return String;

end Ada_Lexer;
-------------------------------------------------------------------------------
--
-- Copyright (C) 1999 FlightSafety International and Ted Dennison
--
-- This file is part of the OpenToken package.
--
-- The OpenToken package is free software; you can redistribute it and/or
-- modify it under the terms of the  GNU General Public License as published
-- by the Free Software Foundation; either version 2, or (at your option)
-- any later version. The OpenToken package is distributed in the hope that
-- it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY 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  distributed with the OpenToken
-- package;  see file GPL.txt.  If not, write to  the Free Software Foundation,
-- 59 Temple Place - Suite 330,  Boston, MA 02111-1307, USA.
--
-- As a special exception,  if other files  instantiate  generics from this
-- unit, or you link this unit with other files to produce an executable,
-- this unit does not by itself cause the resulting executable to be
-- covered by the GNU General Public License.  This exception does not
-- however invalidate any other reasons why the executable file might be
-- covered by the GNU Public License.
--
-- Maintainer: Ted Dennison ([EMAIL PROTECTED])
--
-- This software was originally developed by the following company, and was
-- released as open-source software as a service to the community:
--
--           FlightSafety International Simulation Systems Division
--                    Broken Arrow, OK  USA  918-259-4000
--
-- Update History:
-- $Log: opentoken-recognizer-character_set.adb,v $
-- Revision 1.2  1999/12/27 19:56:00  Ted
-- fix file contents to work w/ new hierarchy
--
-- Revision 1.1  1999/12/27 17:11:33  Ted
-- renamed everything to new hierarchy
--
-- Revision 1.2  1999/08/17 03:06:59  Ted
-- Add log line
--
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
-- This package implements a token recognizer for a token of any number of
-- characters from a given set.
-------------------------------------------------------------------------------
package body Opentoken.Recognizer.Character_Set is

  ----------------------------------------------------------------------------
  -- This procedure will be called when analysis on a new candidate string
  -- is started. The Token needs to clear its state (if any).
  ----------------------------------------------------------------------------
  procedure Clear (The_Token: in out Instance) is
  begin
    The_Token.State := Text;
  end Clear;

  ----------------------------------------------------------------------------
  -- This procedure will be called to perform further analysis on a token
  -- based on the given next character.
  ----------------------------------------------------------------------------
  procedure Analyze (The_Token: in out Instance;
                     Next_Char: in     Character;
                     Verdict  :    out Analysis_Verdict) is
  begin
    case The_Token.State is
      when Text =>
        if Ada.Strings.Maps.Is_In (Element => Next_Char, Set => The_Token.Set) 
then
          Verdict := Matches;
        else
          Verdict         := Failed;
          The_Token.State := Done;
        end if;
      when Done =>
        -- We shouldn't get called from here.
        Verdict := Failed;
    end case;
  end Analyze;

  ----------------------------------------------------------------------------
  -- This procedure will be called to create a character set token
  ----------------------------------------------------------------------------
  function Get (Set       : in Ada.Strings.Maps.Character_Set;
                Reportable: in Boolean := False) return Instance is
  begin
    return (Report => Reportable,
            State  => Text,
            Set    => Set);
  end Get;

end Opentoken.Recognizer.Character_Set;
-------------------------------------------------------------------------------
--
-- Copyright (C) 1999, 2008 Christoph Karl Walter Grein
--
-- This file is part of the OpenToken package.
--
-- The OpenToken package is free software; you can redistribute it and/or
-- modify it under the terms of the  GNU General Public License as published
-- by the Free Software Foundation; either version 2, or (at your option)
-- any later version. The OpenToken package is distributed in the hope that
-- it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY 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  distributed with the OpenToken
-- package;  see file GPL.txt.  If not, write to  the Free Software Foundation,
-- 59 Temple Place - Suite 330,  Boston, MA 02111-1307, USA.
--
-- As a special exception,  if other files  instantiate  generics from this
-- unit, or you link this unit with other files to produce an executable,
-- this unit does not by itself cause the resulting executable to be
-- covered by the GNU General Public License.  This exception does not
-- however invalidate any other reasons why the executable file might be
-- covered by the GNU Public License.
--
-- Maintainer: Christoph K. W. Grein ([EMAIL PROTECTED])
--
-- Update History:
-- $Log: opentoken-recognizer-graphic_character.adb,v $
-- Revision 1.2  1999/12/27 19:56:01  Ted
-- fix file contents to work w/ new hierarchy
--
-- Revision 1.1  1999/12/27 17:11:34  Ted
-- renamed everything to new hierarchy
--
-- Revision 1.2  1999/10/08 23:12:00  Ted
-- Add ability to exclude characters from the set
--
-- 1.1 -  4 July 1999  Exclusion set
-- 1.0 - 26 June 1999  First release
-------------------------------------------------------------------------------

with Ada.Characters.Handling;

-------------------------------------------------------------------------------
-- This package implements a token recognizer for a graphic character.
-------------------------------------------------------------------------------
package body Opentoken.Recognizer.Graphic_Character is

  ----------------------------------------------------------------------------
  -- This procedure will be called when analysis on a new candidate string
  -- is started. The Token needs to clear its state (if any).
  ----------------------------------------------------------------------------
  procedure Clear (The_Token: in out Instance) is
  begin
    The_Token.State := Opening_Tick;
  end Clear;

  ----------------------------------------------------------------------------
  -- This procedure will be called to perform further analysis on a token
  -- based on the given next character.
  ----------------------------------------------------------------------------
  procedure Analyze (The_Token: in out Instance;
                     Next_Char: in     Character;
                     Verdict  :    out Analysis_Verdict) is
  begin
    case The_Token.State is
      when Opening_Tick =>
        if Next_Char = ''' then  -- '' (this comment works around an emacs 
colorizing bug)
          Verdict         := So_Far_So_Good;
          The_Token.State := The_Character;
        else
          Verdict         := Failed;
          The_Token.State := Done;
        end if;
      when The_Character =>
        if Ada.Characters.Handling.Is_Graphic (Next_Char) and
           not Ada.Strings.Maps.Is_In (Element => Next_Char, Set => 
The_Token.Excluded) then
          Verdict         := So_Far_So_Good;
          The_Token.State := Closing_Tick;
        else
          Verdict         := Failed;
          The_Token.State := Done;
        end if;
      when Closing_Tick =>
        if Next_Char = ''' then
          Verdict         := Matches;
          The_Token.State := Done;
        else
          Verdict         := Failed;
          The_Token.State := Done;
        end if;
      when Done =>
        Verdict := Failed;
    end case;
  end Analyze;

  ----------------------------------------------------------------------------
  -- This procedure will be called to create a character set token.
  ----------------------------------------------------------------------------
  function Get (Exclude: Ada.Strings.Maps.Character_Set := 
Ada.Strings.Maps.Null_Set)
    return Instance is
  begin
    return (Report   => True,
            Excluded => Exclude,
            State    => Opening_Tick);
  end Get;

  procedure Redefine (Inst   : in out Instance;
                      Exclude: in     Ada.Strings.Maps.Character_Set) is
  begin
    Inst.Excluded := Exclude;
  end Redefine;

end Opentoken.Recognizer.Graphic_Character;
-------------------------------------------------------------------------------
--
-- Copyright (C) 1999, 2008 Christoph Karl Walter Grein
--
-- This file is part of the OpenToken package.
--
-- The OpenToken package is free software; you can redistribute it and/or
-- modify it under the terms of the  GNU General Public License as published
-- by the Free Software Foundation; either version 2, or (at your option)
-- any later version. The OpenToken package is distributed in the hope that
-- it will be useful, but WITHOUT ANY WARRANTY; without even the implied
-- warranty of MERCHANTABILITY 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  distributed with the OpenToken
-- package;  see file GPL.txt.  If not, write to  the Free Software Foundation,
-- 59 Temple Place - Suite 330,  Boston, MA 02111-1307, USA.
--
-- As a special exception,  if other files  instantiate  generics from this
-- unit, or you link this unit with other files to produce an executable,
-- this unit does not by itself cause the resulting executable to be
-- covered by the GNU General Public License.  This exception does not
-- however invalidate any other reasons why the executable file might be
-- covered by the GNU Public License.
--
-- Maintainer: Christoph K. W. Grein ([EMAIL PROTECTED])
--
-- Update History:
-- $Log: opentoken-recognizer-graphic_character.ads,v $
-- Revision 1.2  1999/12/27 19:56:01  Ted
-- fix file contents to work w/ new hierarchy
--
-- Revision 1.1  1999/12/27 17:11:35  Ted
-- renamed everything to new hierarchy
--
-- Revision 1.2  1999/10/08 23:12:00  Ted
-- Add ability to exclude characters from the set
--
-- 1.1 -  4 July 1999  Exclusion set
-- 1.0 - 26 June 1999  First release
-------------------------------------------------------------------------------

with Ada.Strings.Maps.Constants;

-------------------------------------------------------------------------------
-- This package implements a token recognizer for a character literal 'x',
-- where all graphic characters are allowed for x except those given in an
-- exclusion set.
-------------------------------------------------------------------------------
package Opentoken.Recognizer.Graphic_Character is

  type Instance is new Opentoken.Recognizer.Instance with private;

  ----------------------------------------------------------------------------
  -- Call this procedure to create a Graphic_Character token.
  ----------------------------------------------------------------------------
  function Get (Exclude: Ada.Strings.Maps.Character_Set := 
Ada.Strings.Maps.Null_Set)
    return Instance;

  ----------------------------------------------------------------------------
  -- Call this procedure to redefine the exclusion set.
  ----------------------------------------------------------------------------
  procedure Redefine (Inst   : in out Instance;
                      Exclude: in     Ada.Strings.Maps.Character_Set);

private

  type State_ID is (Opening_Tick, The_Character, Closing_Tick, Done);

  type Instance is new Opentoken.Recognizer.Instance with record
    Excluded: Ada.Strings.Maps.Character_Set;
    -- The finite state machine state
    State: State_ID := Opening_Tick;
  end record;

  ----------------------------------------------------------------------------
  -- This procedure will be called when analysis on a new candidate string
  -- is started. The Token needs to clear its state (if any).
  ----------------------------------------------------------------------------
  procedure Clear (The_Token: in out Instance);

  ----------------------------------------------------------------------------
  -- This procedure will be called to perform further analysis on a token
  -- based on the given next character.
  ----------------------------------------------------------------------------
  procedure Analyze (The_Token: in out Instance;
                     Next_Char: in     Character;
                     Verdict  :    out Analysis_Verdict);

end Opentoken.Recognizer.Graphic_Character;

Reply via email to