Files
mercury/tests/dppd/grammar_impl.m
Zoltan Somogyi c03b11ca48 Update the style of more test cases.
And updated expected outputs for changed line numbers.
2021-07-27 19:29:21 +10:00

204 lines
5.2 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
:- module grammar_impl.
:- interface.
:- type variable
---> a
; n
; f
; v
; x
; i
; shp
; arg
; res
; forall
; var_for
; var_all
; such
; that
; suchthat
; var_is
; subscripted(variable, variable)
; var_where
; var_when
; '('
; ')'
; '['
; ']'
; '{'
; '}'
; (', ')
; (':')
; (';')
; ('..')
; ('=').
:- pred expression_query(list(variable)::in) is semidet.
:- import_module list.
:- implementation.
:- type qualifier
---> such_that(expression, expression)
; for_all(term)
; qual_when(term)
; qual_where(term)
; merge_qualifiers(qualifier, qualifier)
; none.
:- type expression == variable.
:- type term == variable.
expression_query(String) :-
expression(n, none, String, []).
:- pred expression(expression::in, qualifier::in,
list(variable)::in, list(variable)::out) is nondet.
:- implementation.
expression(Term, Qualifiers) -->
value(Term), qualification(Qualifiers).
expression(Term, none) -->
value(Term).
:- pred value(variable::in, list(variable)::in, list(variable)::out) is nondet.
value(Term) -->
identifier(Term).
value(Term) -->
numeric(Term).
value(Term) -->
built_in(Term).
value(Term) -->
bracketed(Term).
value(subscripted(Term, Subscript)) -->
identifier(Term), start_subscript, value(Subscript), end_subscript.
value(Term) -->
leftparen, value(Term), rightparen.
:- pred qualification(qualifier::in, list(variable)::in,
list(variable)::out) is nondet.
qualification(merge_qualifiers(Qualifier, Qualifiers)) -->
qualifier(Qualifier),
qualification(Qualifiers).
qualification(Qualifier) -->
qualifier(Qualifier).
:- pred qualifier(qualifier::in, list(variable)::in, list(variable)::out)
is nondet.
qualifier(such_that(Left, Right)) -->
such_that, value(Left), equals, value(Right).
qualifier(for_all(Term)) -->
for_all, subrange(Term).
qualifier(qual_when(Term)) -->
(when), value(Term).
qualifier(qual_where(Term)) -->
(where), is_a(Term).
:- pred leftparen(list(variable)::in, list(variable)::out) is semidet.
leftparen --> ['('].
:- pred rightparen(list(variable)::in, list(variable)::out) is semidet.
rightparen --> [')'].
:- pred leftbracket(list(variable)::in, list(variable)::out) is semidet.
leftbracket --> ['['].
:- pred rightbracket(list(variable)::in, list(variable)::out) is semidet.
rightbracket --> [']'].
:- pred colon(list(variable)::in, list(variable)::out) is semidet.
colon --> [':'].
:- pred semicolon(list(variable)::in, list(variable)::out) is semidet.
semicolon --> [';'].
:- pred dotdot(list(variable)::in, list(variable)::out) is semidet.
dotdot --> ['..'].
:- pred comma(list(variable)::in, list(variable)::out) is semidet.
comma --> [', '].
:- pred equals(list(variable)::in, list(variable)::out) is semidet.
equals --> ['='].
:- pred where(list(variable)::in, list(variable)::out) is semidet.
where --> [var_where].
:- pred when(list(variable)::in, list(variable)::out) is semidet.
when --> [var_when].
:- pred is_a(list(variable)::in, list(variable)::out) is semidet.
is_a --> [var_is].
:- pred such_that(list(variable)::in, list(variable)::out) is semidet.
such_that --> [suchthat].
such_that --> [such], [that].
:- pred for_all(list(variable)::in, list(variable)::out) is semidet.
for_all --> [forall].
for_all --> [var_for], [var_all].
:- pred start_subscript(list(variable)::in, list(variable)::out) is semidet.
start_subscript --> ['{'].
:- pred end_subscript(list(variable)::in, list(variable)::out) is semidet.
end_subscript --> ['}'].
:- pred identifier(variable::in, list(variable)::in, list(variable)::out)
is semidet.
identifier(Identifier) --> common_function(Identifier).
identifier(Identifier) --> common_variable(Identifier).
:- pred common_variable(variable::in,
list(variable)::in, list(variable)::out) is semidet.
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].
:- pred numeric(variable::in, list(variable)::in,
list(variable)::out) is failure.
numeric(_) -->
fail.
:- pred built_in(variable::in, list(variable)::in, list(variable)::out)
is failure.
built_in(_) -->
fail.
:- pred bracketed(variable::in, list(variable)::in, list(variable)::out)
is failure.
bracketed(_) --> fail.
:- pred common_function(variable::in, list(variable)::in, list(variable)::out)
is failure.
common_function(_) --> fail.
:- pred is_a(variable::in, list(variable)::in, list(variable)::out) is failure.
is_a(_) --> fail.
:- pred subrange(variable::in, list(variable)::in, list(variable)::out)
is failure.
subrange(_) --> fail.
:- pred fail(T::in, T::out) is failure.
fail -->
{ fail }.