Next: multi_map, Previous: mercury_term_lexer, Up: Top [Contents]
%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 1995-2001, 2003-2008, 2011-2012 The University of Melbourne. % Copyright (C) 2014-2024 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: mercury_term_parser.m. % Main author: fjh. % Stability: high. % % This file exports the predicate read_term, which reads a term from the % current input stream. The read_term_from_*string predicates are the same as % the read_term predicates, except that the term is read from a string rather % than from the current input stream. The parse_tokens predicate is % similar, but it takes a list of tokens rather than a string. % % The parser is a relatively straight-forward top-down recursive descent % parser, made somewhat complicated by the need to handle operator precedences. % It uses mercury_term_lexer.get_token_list to read a list of tokens. % It uses the routines from the ops module to look up operator precedences. % %--------------------------------------------------% %--------------------------------------------------% :- module mercury_term_parser. :- interface. :- import_module io. :- import_module mercury_term_lexer. :- import_module ops. :- import_module term. :- import_module varset. %--------------------------------------------------% :- type read_term(T) ---> eof % We have reached the end-of-file. ; error(string, int) % We have found an error described the message string % on the given line number in the input. ; term(varset(T), term(T)). % We have read in the given term with the given varset. :- type read_term == read_term(generic). % read_term(Result, !IO): % read_term(Stream, Result, !IO): % % Reads a Mercury term from the current input stream, or from Stream. % :- pred read_term(read_term(T)::out, io::di, io::uo) is det. :- pred read_term(io.text_input_stream::in, read_term(T)::out, io::di, io::uo) is det. % read_term_with_op_table(Ops, Result, !IO): % read_term_with_op_table(Stream, Ops, Result, !IO): % % Reads a term from the current input stream, or from Stream, % using the given op_table to interpret the operators. % :- pred read_term_with_op_table(Ops::in, read_term(T)::out, io::di, io::uo) is det <= op_table(Ops). :- pred read_term_with_op_table(io.text_input_stream::in, Ops::in, read_term(T)::out, io::di, io::uo) is det <= op_table(Ops). % read_term_filename(FileName, Result, !IO): % read_term_filename(Stream, FileName, Result, !IO): % % Reads a term from the current input stream, or from Stream. % The string is the filename to use for the stream; this is used % in constructing the term_contexts in the read term. % This interface is used to support the `:- pragma source_file' directive. % :- pred read_term_filename(string::in, read_term(T)::out, io::di, io::uo) is det. :- pred read_term_filename(io.text_input_stream::in, string::in, read_term(T)::out, io::di, io::uo) is det. % read_term_filename_with_op_table(Ops, FileName, Result, !IO): % read_term_filename_with_op_table(Stream, Ops, FileName, Result, !IO): % % As above but using the given op_table. % :- pred read_term_filename_with_op_table(Ops::in, string::in, read_term(T)::out, io::di, io::uo) is det <= op_table(Ops). :- pred read_term_filename_with_op_table(io.text_input_stream::in, Ops::in, string::in, read_term(T)::out, io::di, io::uo) is det <= op_table(Ops). %--------------------------------------------------% % The read_term_from_string predicates are the same as the read_term % predicates, except that the term is read from a string rather than from % the current input stream. The returned value EndPos is the position % one character past the end of the term read. The arguments StringLen % and StartPos in the read_term_from_substring* versions specify % the length of the string and the position within the string % at which to start parsing. % read_term_from_string(FileName, String, EndPos, Term). % :- pred read_term_from_string(string::in, string::in, posn::out, read_term(T)::out) is det. % read_term_from_string_with_op_table(Ops, FileName, String, EndPos, Term). % :- pred read_term_from_string_with_op_table(Ops::in, string::in, string::in, posn::out, read_term(T)::out) is det <= op_table(Ops). % read_term_from_substring(FileName, String, StringLen, % StartPos, EndPos, Term). % read_term_from_linestr(FileName, String, StringLen, % StartLineContext, EndLineContext, StartLinePosn, EndLinePosn, Term). % :- pred read_term_from_substring(string::in, string::in, int::in, posn::in, posn::out, read_term(T)::out) is det. :- pred read_term_from_linestr(string::in, string::in, int::in, line_context::in, line_context::out, line_posn::in, line_posn::out, read_term(T)::out) is det. % read_term_from_substring_with_op_table(Ops, FileName, String, StringLen, % StartPos, EndPos, Term). % read_term_from_linestr_with_op_table(Ops, FileName, String, StringLen, % StartLineContext, EndLineContext, StartLinePosn, EndLinePosn, Term). % :- pred read_term_from_substring_with_op_table(Ops::in, string::in, string::in, int::in, posn::in, posn::out, read_term(T)::out) is det <= op_table(Ops). :- pred read_term_from_linestr_with_op_table(Ops::in, string::in, string::in, int::in, line_context::in, line_context::out, line_posn::in, line_posn::out, read_term(T)::out) is det <= op_table(Ops). %--------------------------------------------------% % parse_tokens(FileName, TokenList, Result): % :- pred parse_tokens(string::in, token_list::in, read_term(T)::out) is det. % parse_tokens(Ops, FileName, TokenList, Result): % :- pred parse_tokens_with_op_table(Ops::in, string::in, token_list::in, read_term(T)::out) is det <= op_table(Ops). %--------------------------------------------------% %--------------------------------------------------%
Next: multi_map, Previous: mercury_term_lexer, Up: Top [Contents]