Commit Graph

3 Commits

Author SHA1 Message Date
Mark Brown
8ae09930f8 Fix a bug reported by Doug Auclair.
Estimated hours taken: 5
Branches: main

Fix a bug reported by Doug Auclair.

library/ops.m:
	Change the Mercury arg priority to 999.  It was previously set to
	1201, which allowed arguments and list elements to be parsed the
	way we intended.  However, this had the unintended side effect that
	valid terms were written out using incorrect syntax.

library/parser.m:
	Place the workaround here, where arguments and list elements are
	read.

	Note that this is still technically buggy, because we effectively
	allow syntax which should be illegal according to the operator
	precedence table.  But the proper fix for this involves moving to
	a BNF style parser, so that is left for later work.

tests/hard_coded/Mmakefile:
	Run the term_io_test case twice, checking it against the expected
	output each time.  The first time it is run with the supplied input
	file.  The second time it is run with the expected output as input --
	this ensures that terms are read in the same way that they are
	written out.

tests/hard_coded/term_io_test.m:
	Read input from stdin rather than a fixed file.

tests/hard_coded/term_io_test.inp:
	Add additional input terms.

tests/hard_coded/term_io_test.exp:
tests/invalid/*.err_exp:
	Update the expected output for this and other test cases.
2006-03-07 01:03:46 +00:00
Simon Taylor
0fd128ff7d Allow user-defined operator precedence tables for parser__read_term
Estimated hours taken: 4

Allow user-defined operator precedence tables for parser__read_term
and term_io__write_term.

library/ops.m:
	Define a typeclass `op_table' with methods for accessing
	operator precedence tables.

	Define a type `ops__mercury_op_table', representing the
	standard Mercury operator table.
	Make `ops__mercury_op_table' an instance of `op_table'.

	Define `ops__table' as equivalent to `ops__mercury_op_table'
	(it's obsolete, but we can't mark types as obsolete).

	Rename `ops__init_op_table' as `ops__init_mercury_op_table',
	mark ops__init_op_table as obsolete


library/parser.m:
library/term_io.m:
	Add variants of `parser__read_term' and `term_io__write_term'
	which take an operator precedence table.

	Don't hard-code the maximum priority and argument priority.
	Use the `op_table' methods to find those.

	Make the priority of operator terms (X `op` Y) 1, not 100.
	The reference manual states that operator terms have
	the highest precedence possible.

	This change slows down a program which does nothing but
	parse terms by a bit under 5%, less for writing.

library/hash_table.m:
	Fix a few places where parentheses are required because
	operator terms now have the lowest possible priority.
	`rem' is an operator -- it doesn't need backquotes.

compiler/mercury_to_mercury.m:
library/io.m:
	Rename `ops__init_op_table' to `ops__init_mercury_op_table'.

	Pass the `op_table' to `ops__max_priority'.

NEWS:
doc/reference_manual.texi:
	Document the changes.

	Add operator terms to the operator table.

	In the "Terms" section of the reference manual, use the same
	terminology to describe operator terms as is used in the
	"Builtin Operators" section.

samples/Mmakefile:
samples/README:
samples/calculator2.m:
	An example program.

tests/hard_coded/term_io_test.exp:
tests/invalid/func_errors.err_exp:
tests/invalid/inst_list_dup.err_exp:
tests/invalid/predmode.err_exp:
tests/invalid/some_err.exp:
	`term_io__write_term' now has the same argument priority
	behaviour as `parser__read_term', so remove some unnecessary
	parentheses from the output.
2001-11-08 15:30:40 +00:00
Thomas Conway
cc2665a18d Oops - I forgot to add these to the previous commit.
Estimated hours taken: 0.0

Oops - I forgot to add these to the previous commit.
1998-11-13 05:33:03 +00:00