/~ --- Token definitions --- ~/

/~ Characters to be ignored ~/
!   ' |\t' ;

/~ Non-associative tokens ~/
    '\('
    '\)'
    '[0-9]+'                        INT
    '[0-9]+\.[0-9]*|[0-9]*\.[0-9]+' FLOAT
    '\_\_[a-zA-Z0-9]+'              PARAM
    '[a-zA-Z]+(\_*[a-zA-Z0-9]+)*'   VAR
    '\&[a-zA-Z]+\;'                 HTML
    '\"[a-zA-Z0-9äüöß\=\.\ ]*\"'    STRING
    ;

/~ Left-associative tokens, from lowest to highest precedence ~/
<  '\+'
   '\-';

<  '\*'
   '/';

<  '^';

<  '\,';

<  '<='
   '>='
   '=='
   '!='
   '<'
   '>';

<  '!';

<  '\|\|'
   '\&\&';

##

/~ --- Grammar specification --- ~/

p:      e                          [* alert('Ende: : '+ %1); *]
        ;

e:        '(' e ',' e ')'          [* %% = ('coord: '+ %2+', '+ %4); *]
        | e '<=' e                 [* %% = ('le: '+ %1+', '+ %3); *]
        | e '>=' e                 [* %% = ('ge: '+ %1+', '+ %3); *]
        | e '==' e                 [* %% = ('eq: '+ %1+', '+ %3); *]
        | e '!=' e                 [* %% = ('neq: '+ %1+', '+ %3); *]
        | e '<' e                  [* %% = ('lt: '+ %1+', '+ %3); *]
        | e '>' e                  [* %% = ('gt: '+ %1+', '+ %3); *]
        | e '+' e                  [* %% = ('add: '+ %1+', '+ %3); *]
        | e '-' e                  [* %% = ('sub: '+ %1+', '+ %3); *]
		| '!' e                    [* %% = ('neg: '+ %2); *]
		| e '^' e                  [* %% = ('pow: '+ %1+', '+ %3); *]
		| e '||' e                 [* %% = ('or: '+ %1+', '+ %3); *]
		| e '&&' e                 [* %% = ('and: '+ %1+', '+ %3); *]
        | e '*' e                  [* %% = ('mul: '+ %1+', '+ %3); *]
        | e '/' e                  [* %% = ('div: '+ %1+', '+ %3); *]
        | '-' e &'*'               [* %% = ('negmult: '+ %2); *]
        | '(' e ')'                [* %% = ('bra: '+ %2); *]
        | STRING '+' e             [* %% = ('string: '+ %1+', '+ %3); *]
        | INT                      [* %% = ('int: '+ %1); *]
        | FLOAT                    [* %% = ('float: '+ %1); *]
        | PARAM                    [* %% = ('param: '+ %1); *]
        | HTML                     [* %% = ('html: '+ %1); *]
        | STRING                   [* %% = ('string: '+ %1); *]
        | VAR '(' e ')'            [* %% = ('var: '+ %1+', '+ %3); *]
        | VAR                      [* %% = ('var: '+ %1); *]
        ;