module languages/modula-3/syntax/Tokens

exports
sorts Literal Id Escape Number FloatNumber CharLiteral TextLiteral Letter Digit
      DQUOTE PrintingChar TextContents IdList OctalDigit Exponent HexDigit
      OtherChar QualId

lexical syntax
  Number | FloatNumber | CharLiteral | TextLiteral             -> Literal       
  Letter (Letter | Digit | "_")*                                 -> Id            
  "'" PrintingChar | Escape | DQUOTE "'"                       -> CharLiteral   
  "\""                                                         -> DQUOTE        
  (PrintingChar | Escape)*                                       -> TextContents  
  DQUOTE TextContents DQUOTE                                   -> TextLiteral   
  "\\n"                                                        -> Escape        
  "\\t"                                                        -> Escape        
  "\\r"                                                        -> Escape        
  "\\f"                                                        -> Escape        
  "\\\\"                                                       -> Escape        
  "'"                                                     -> Escape        
  "\\" DQUOTE                                                  -> Escape        
  "\\" OctalDigit OctalDigit OctalDigit                        -> Escape        
  Digit Digit*                                                 -> Number        
  Digit Digit* "_" HexDigit HexDigit*                          -> Number        
  Digit Digit* "." Digit Digit* Exponent?                      -> FloatNumber   
  [EeDdXx] [\+\-]? Digit Digit*                                -> Exponent      
  Letter | Digit | OtherChar                                   -> PrintingChar  
  Digit | [A-Fa-f]                                             -> HexDigit      
  [0-9]                                                        -> Digit         
  [0-7]                                                        -> OctalDigit    
  [A-Za-z]                                                     -> Letter        
  [\<\>\ \!\?\#\$\%\&\(\)\*\+\,\-\.\/\:\;\_\`\{\}\~\[\]\|\^\=] -> OtherChar     

lexical restrictions
  Number -/- [0-9]
  Id -/- [a-zA-Z0-9\_]

context-free syntax
  Id ("." Id)? -> QualId  
  {Id ","}+    -> IdList