mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-22 04:43:53 +00:00
204 lines
5.2 KiB
Mathematica
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 }.
|