% Source: http://www.cs.kuleuven.ac.be/~dtai/prototypes/dppd/grammar.html
% rename when -> when_
expression( Term, Qualifiers ) -->
    value( Term ), qualification( Qualifiers ).
expression( Term, [] ) -->
    value( Term ).

value( Term ) --> identifier( Term ).
value( Term ) --> numeric( Term ).
value( Term ) --> built_in( Term ).
value( Term ) --> bracketted( Term ).
value( subscripted( Term, Subscript ) ) -->
    identifier( Term ), start_subscript, value( Subscript ), end_subscript.
value( Term ) --> leftparen, value( Term ), rightparen.

qualification( merge_qualifiers( Qualifier, Qualifiers ) ) -->
    qualifier( Qualifier ), 
    qualification( Qualifiers ).
qualification( Qualifier ) -->
    qualifier( Qualifier ).

qualifier( such_that( Left, Right ) ) -->
    such_that, value( Left ), equals, value( Right ).
qualifier( for_all( Term ) ) --> for_all, subrange( Term ).
qualifier( when( Term ) )    --> when_, value( Term ).
qualifier( where( Term ) )   --> where, is_a( Term ).

leftparen --> ['('].
rightparen --> [')'].
leftbracket --> ['['].
rightbracket --> [']'].
colon --> [':'].
semicolon --> [';'].
dotdot --> ['..'].
comma --> [','].
equals --> ['='].
where --> [where].
when_ --> [when].
is_a --> [is].
such_that --> [suchthat].
such_that --> [such], [that].
for_all --> [forall].
for_all --> [for], [all].
start_subscript --> ['{'].
end_subscript --> ['}'].

identifier( Identifier ) --> common_function( Identifier ).
identifier( Identifier ) --> common_variable( Identifier ).

common_variable( a ) --> [a].
common_variable( n ) --> [n].
common_variable( f ) --> [f].
common_variable( v ) --> [v].
common_variable( x ) --> [x].
common_variable( i ) --> [i].
common_variable( shp ) --> [shp].
common_variable( arg ) --> [arg].
common_variable( res ) --> [res].


numeric( _, nomatch, _ ).
built_in( _, nomatch, _ ).
bracketted( _, nomatch, _ ).
common_function( _, nomatch, _ ).
