%%
%% Integers are named DNumber. Floats are named LNumber. 
%% Automatic conversion from Int to float when the Integer is to
%% big should happen on application detail.
%%
%% @author Eric Bouwers
module languages/php/common/literals/NumberLiterals
exports

  sorts LNumber DNumber Deci Octa Hexa

  lexical syntax
   %%An integer can either be decimal, hexidecimal or octal
    [1-9][0-9]*                  -> Deci
    [0]                          -> Deci

    [0][xX][0-9a-fA-F]+			 -> Hexa

  %%Should actually be:
  %%[0][0-7]+				 -> Octa
  %%But that is the definition of interpertation, 8 and 9 should
  %%be parseable
    [0][0-9]+				 -> Octa

    [0-9]*[\.][0-9]+			 -> DNumber {prefer}
    [0-9]+[\.][0-9]* 			 -> DNumber
    ([0-9]+ | DNumber)[eE][\+\-]?[0-9]+  -> DNumber
    [0-9]+                               -> DNumber {reject}

  lexical restrictions
    Deci       -/- [0-9\.]
    Hexa       -/- [0-9a-fA-F]
    Octa       -/- [0-9]
    DNumber    -/- [0-9]

  context-free syntax
    Deci -> LNumber{cons("Deci")}
    Hexa -> LNumber{cons("Hexa")}
    Octa -> LNumber{cons("Octa")}