Next: pair, Previous: one_or_more_map, Up: Top [Contents]
%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 1995-2008, 2010, 2012 The University of Melbourne. % Copyright (C) 2014-2018 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: ops.m. % Main author: fjh. % Stability: low. % % This module exports a typeclass `ops.op_table' which is used to define % operator precedence tables for use by % `mercury_term_parser.read_term_with_op_table' and % `term_io.write_term_with_op_table'. % % It also exports an instance `ops.mercury_op_table' that implements the % Mercury operator table defined in the Mercury Language Reference Manual. % % See samples/calculator2.m for an example program. % %--------------------------------------------------% %--------------------------------------------------% :- module ops. :- interface. :- import_module list. %--------------------------------------------------% % An class describes what structure terms constructed with an operator % of that class are allowed to take. :- type class ---> infix(ops.assoc, ops.assoc) % term Op term ; prefix(ops.assoc) % Op term ; binary_prefix(ops.assoc, ops.assoc) % Op term term ; postfix(ops.assoc). % term Op % `x' represents an argument whose priority must be % strictly lower than the priority of the operator. % `y' represents an argument whose priority must be % lower than or equal to the priority of the operator. :- type assoc ---> x ; y. % Operators with a low "priority" bind more tightly than those % with a high "priority". For example, given that `+' has % priority 500 and `*' has priority 400, the term `2 * X + Y' % would parse as `(2 * X) + Y'. % % The lowest priority is 0. % :- type priority == int. :- type op_info ---> op_info( ops.class, ops.priority ). %--------------------------------------------------% :- typeclass op_table(Table) where [ % Check whether a string is the name of an infix operator, % and if it is, return its precedence and associativity. % pred lookup_infix_op(Table::in, string::in, ops.priority::out, ops.assoc::out, ops.assoc::out) is semidet, % Check whether a string is the name of a prefix operator, % and if it is, return its precedence and associativity. % pred lookup_prefix_op(Table::in, string::in, ops.priority::out, ops.assoc::out) is semidet, % Check whether a string is the name of a binary prefix operator, % and if it is, return its precedence and associativity. % pred lookup_binary_prefix_op(Table::in, string::in, ops.priority::out, ops.assoc::out, ops.assoc::out) is semidet, % Check whether a string is the name of a postfix operator, % and if it is, return its precedence and associativity. % pred lookup_postfix_op(Table::in, string::in, ops.priority::out, ops.assoc::out) is semidet, % Check whether a string is the name of an operator. % pred lookup_op(Table::in, string::in) is semidet, % Check whether a string is the name of an operator, and if it is, % return the op_info describing that operator in the third argument. % If the string is the name of more than one operator, return % information about its other guises in the last argument. % pred lookup_op_infos(Table::in, string::in, op_info::out, list(op_info)::out) is semidet, % Operator terms are terms of the form `X `Op` Y', where `Op' is % a variable or a name and `X' and `Y' are terms. If operator terms % are included in `Table', return their precedence and associativity. % pred lookup_operator_term(Table::in, ops.priority::out, ops.assoc::out, ops.assoc::out) is semidet, % Returns the highest priority number (the lowest is zero). % func max_priority(Table) = ops.priority, % The maximum priority of an operator appearing as the top-level % functor of an argument of a compound term. % % This will generally be the precedence of `,/2' less one. % If `,/2' does not appear in the op_table, `ops.max_priority' plus one % may be a reasonable value. % func arg_priority(Table) = ops.priority ]. %--------------------------------------------------% % The table of Mercury operators. % See the "Builtin Operators" section of the "Syntax" chapter % of the Mercury Language Reference Manual for details. % :- type mercury_op_table. :- instance ops.op_table(ops.mercury_op_table). :- func init_mercury_op_table = (ops.mercury_op_table::uo) is det. %--------------------------------------------------% %--------------------------------------------------%
Next: pair, Previous: one_or_more_map, Up: Top [Contents]