module Casl-Lexical

%% written/changed by Bjarke Wedemeijer (January 1998)
%% adapted by Mark van den Brand (June 1999)
%% adapted by Mark van den Brand (November 2000)
%% adapted by Christian Maeder (January 2002)
%% adapted by Christian Maeder (February 2004)

exports
  sorts
    Ann
    Number Char
    Literal
    Id Simple-Id
    Sort-Id
    Token Place
    Path Url Digit Digits

  aliases
    ~[\n]*                -> Text-Line
    (~[\)]|(")" ~[\%]))*  -> Text-Lines
    [\ \t]*               -> White-Space 

  lexical syntax

    [\ \n\t\13]                    -> LAYOUT
    "%[" (~[\]]|("]" ~[\%]))* "]%" -> LAYOUT

    "%%" Text-Line "\n"            -> Comment-Line
    "%{" (~[\}]|("}" ~[\%]))* "}%" -> Comment-Group

%% Annotations
    "%(" Text-Lines ")%"                                    -> Label 
    "%" Words                                               -> Annote-Word

    Annote-Word Text-Line "\n"                              -> Annote-Line
    Annote-Word "(" Text-Lines ")%"                         -> Annote-Group

%% Words, Sign
    [\192-\207\209-\214\216-\221]             -> Letter  
    [\223-\239\241-\246\248-\253\255]         -> Letter
    [A-Za-z]                                  -> Letter
    [0-9]				      -> Digit
    Digit Digit+			      -> Digits
    Letter | "'" | Digit                      -> Word-Char
    Word-Char+                                -> Word {avoid}
    Letter Word-Char* ("_" Word)*             -> Words 
    "." Words                                 -> Dot-Words

    [\161-\163\167\169\172\176-\179]          -> Sign
    [\181-\183\185\191\215\247]               -> Sign
    [\+\-\*\/\\\&\=\<\>\!\?\:\.\$\@\#\^\~\|]  -> Sign
    Sign+                                     -> Signs {avoid}

    Digit                       -> Number
    Digits			-> Number
    Number "." Number           -> Fraction
    Number "E" [\+\-]? Number   -> Floating
    Fraction "E" [\+\-]? Number -> Floating


    "\\" [01] [0-9] [0-9]      -> Char
    "\\" "2" [0-4] [0-9]       -> Char
    "\\" "2" "5" [0-5]         -> Char
    "\\" "x" [0-9A-F][0-9A-F]  -> Char
    "\\" "o" [0-3] [0-7] [0-7] -> Char
    "\\" [ntrvbfa\?\\\"\']     -> Char
    ~[\0-\31\"\\]              -> Char    
    [\t\n\13]                  -> Char

    "'" Char|[\"] "'"          -> Quoted-Char
    [\"] Char* [\"]            -> String
              
%% The lexical syntax for libraries.
    "%" [0-9a-fA-F] [0-9a-fA-F]                       -> Path-Char
    [A-Za-z0-9\:\;\=\$\?\+\\\_\@\.\&\!\~\*\"\'\(\)\,] -> Path-Char
    Path-Char+                                        -> Path-Word
    {Path-Word [\/]}+                                 -> Path {avoid}
    "http:" Path                                      -> Url {avoid}
    "ftp:" Path                                       -> Url {avoid}
    "file:" Path                                      -> Url {avoid}

  lexical restrictions
    Words -/- 
	[A-Za-z0-9\'\192-\207\209-\214\216-\221\223-\239\241-\246\248-253\255]

    Signs -/- [\+\-\*\/\\\&\=\<\>\!\?\:\.\$\@\#\^\~\|\161-\163\167\169\172\176-\179\181-\183\185\191\215\247]

  context-free syntax

    ":"   -> Signs {reject}
    ":?"  -> Signs {reject}
    "::=" -> Signs {reject}
    "="   -> Signs {reject}
    "=>"  -> Signs {reject}
    "<=>" -> Signs {reject}
    "."   -> Signs {reject}
    "·"   -> Signs {reject}
    "|"   -> Signs {reject}
    "|->" -> Signs {reject}
    "/\\" -> Signs {reject}
    "\\/" -> Signs {reject}
    "¬"   -> Signs {reject}

    "and"       -> Words {reject}
    "arch"      -> Words {reject}
    "as"        -> Words {reject}
    "axiom"     -> Words {reject}
    "axioms"    -> Words {reject}
    "closed"    -> Words {reject}
    "def"       -> Words {reject}
    "else"      -> Words {reject}
    "end"       -> Words {reject}
    "exists"    -> Words {reject}
    "false"     -> Words {reject}
    "fit"       -> Words {reject}
    "forall"    -> Words {reject}
    "free"      -> Words {reject}
    "from"      -> Words {reject}
    "generated" -> Words {reject}
    "get"       -> Words {reject}
    "given"     -> Words {reject}
    "hide"      -> Words {reject}
    "if"        -> Words {reject}
    "in"        -> Words {reject}
    "lambda"    -> Words {reject}
    "library"   -> Words {reject}
    "local"     -> Words {reject}
    "not"       -> Words {reject}
    "op"        -> Words {reject}
    "ops"       -> Words {reject}
    "pred"      -> Words {reject}
    "preds"     -> Words {reject}
    "result"    -> Words {reject}
    "reveal"    -> Words {reject}
    "sort"      -> Words {reject}
    "sorts"     -> Words {reject}
    "spec"      -> Words {reject}
    "then"      -> Words {reject}
    "to"        -> Words {reject}
    "true"      -> Words {reject}
    "type"      -> Words {reject}
    "types"     -> Words {reject}
    "unit"      -> Words {reject}
    "units"     -> Words {reject}
    "var"       -> Words {reject}
    "vars"      -> Words {reject}
    "version"   -> Words {reject}
    "view"      -> Words {reject}
    "when"      -> Words {reject}
    "with"      -> Words {reject}
    "within"    -> Words {reject}

%% Literal
    String   -> Literal
    Digits   -> Literal
    Fraction -> Literal
    Floating -> Literal

%% Simple-Id
    Words -> Simple-Id

%% Sort-Id 
    Words     -> Sort-Id
    Words "[" {Id ","}+ "]" -> Sort-Id 

%% Id
    Mix-Token+ -> Id

%% Mix-Token
    Token             -> Mix-Token
    Place             -> Mix-Token
    "[" {Id ","}+ "]" -> Mix-Token
    "[" "]"           -> Mix-Token
    "{" "}"           -> Mix-Token
    "{" Id "}"        -> Mix-Token

%% Place
    "__" -> Place

%% Token
    Words       -> Token
    Signs       -> Token
    Digit       -> Token
    Quoted-Char -> Token
    Dot-Words   -> Token

%% Annotation and Comment
    (Annote-Line|Annote-Group|Label|Comment-Group|Comment-Line)* -> Ann

  context-free restrictions
	LAYOUT? -/- [\ \n\t\13]
