mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-12 12:26:29 +00:00
Fix a bug introduced by petr's last change: put back the
Estimated hours taken: 1 Branches: main extras/moose/moose.m: Fix a bug introduced by petr's last change: put back the `:- import_module list.' declaration, since it is needed for the references to `[]', `[|]', `list', and `list_skel'. But put it back in the implementation section rather than in the interface section, because it is not needed by the interface. extras/moose/tests/Mmakefile: extras/moose/tests/array_based.moo: Add a regression test.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
%----------------------------------------------------------------------------%
|
%----------------------------------------------------------------------------%
|
||||||
% Copyright (C) 1998-2003 The University of Melbourne.
|
% Copyright (C) 1998-2004 The University of Melbourne.
|
||||||
% This file may only be copied under the terms of the GNU General
|
% This file may only be copied under the terms of the GNU General
|
||||||
% Public License - see the file COPYING in the Mercury Distribution.
|
% Public License - see the file COPYING in the Mercury Distribution.
|
||||||
%
|
%
|
||||||
@@ -657,6 +657,8 @@ write_parser(Where, NT, Decl, _TT, InAtom, OutAtom, !IO) :-
|
|||||||
true
|
true
|
||||||
),
|
),
|
||||||
io__format("\
|
io__format("\
|
||||||
|
:- import_module list.
|
||||||
|
|
||||||
parse(Result, Toks0, Toks) :-
|
parse(Result, Toks0, Toks) :-
|
||||||
parse(Toks0, Toks, [0], [], Result).
|
parse(Toks0, Toks, [0], [], Result).
|
||||||
|
|
||||||
|
|||||||
17
extras/moose/tests/Mmakefile
Normal file
17
extras/moose/tests/Mmakefile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
.SUFFIXES: .m .moo
|
||||||
|
|
||||||
|
default_target : all
|
||||||
|
|
||||||
|
depend : array_based.depend
|
||||||
|
|
||||||
|
array_based.depend: array_based.m
|
||||||
|
|
||||||
|
all: array_based.c
|
||||||
|
|
||||||
|
.moo.m:
|
||||||
|
../moose $<
|
||||||
|
|
||||||
|
realclean:
|
||||||
|
rm -f array_based.m
|
||||||
|
|
||||||
81
extras/moose/tests/array_based.moo
Normal file
81
extras/moose/tests/array_based.moo
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
% This is a regression test. It tests that Moo supports parsers that do not
|
||||||
|
% use lists.
|
||||||
|
|
||||||
|
:- module array_based.
|
||||||
|
|
||||||
|
:- interface.
|
||||||
|
|
||||||
|
:- import_module char, int, array.
|
||||||
|
|
||||||
|
:- type token
|
||||||
|
---> ('+')
|
||||||
|
; num(int)
|
||||||
|
; ('(')
|
||||||
|
; (')')
|
||||||
|
; eof
|
||||||
|
.
|
||||||
|
|
||||||
|
:- parse(exprn/1, token, eof, xx, in, out).
|
||||||
|
|
||||||
|
:- pred scan(array(char), array(token)).
|
||||||
|
:- mode scan(in, out) is det.
|
||||||
|
|
||||||
|
:- implementation.
|
||||||
|
|
||||||
|
:- import_module string, require.
|
||||||
|
|
||||||
|
:- rule exprn(int).
|
||||||
|
exprn(Num) ---> exprn(A), [+], term(B), { Num = A + B }.
|
||||||
|
exprn(Term) ---> term(Term).
|
||||||
|
|
||||||
|
:- rule term(int).
|
||||||
|
term(Num) ---> factor(Num).
|
||||||
|
|
||||||
|
:- rule factor(int).
|
||||||
|
factor(Num) ---> ['('], exprn(Num), [')'].
|
||||||
|
factor(Num) ---> [num(Num)].
|
||||||
|
|
||||||
|
scan(Chars, Toks) :-
|
||||||
|
scan(Chars, array__make_empty_array, Toks0),
|
||||||
|
Toks = array_reverse(Toks0).
|
||||||
|
|
||||||
|
:- pred scan(array(char), array(token), array(token)).
|
||||||
|
:- mode scan(in, in, out) is det.
|
||||||
|
|
||||||
|
scan(Cs0, Toks0, Toks) :-
|
||||||
|
( array__size(Cs0) = 0 ->
|
||||||
|
Toks = array_cons(eof, Toks0)
|
||||||
|
;
|
||||||
|
C = Cs0^elem(0),
|
||||||
|
Cs = array_tail(Cs0),
|
||||||
|
(if
|
||||||
|
char__is_whitespace(C)
|
||||||
|
then
|
||||||
|
scan(Cs, Toks0, Toks)
|
||||||
|
else if
|
||||||
|
char__digit_to_int(C, Num)
|
||||||
|
then
|
||||||
|
scan(Cs, array_cons(num(Num), Toks0), Toks)
|
||||||
|
else if
|
||||||
|
C = ('+')
|
||||||
|
then
|
||||||
|
scan(Cs, array_cons('+', Toks0), Toks)
|
||||||
|
else if
|
||||||
|
C = ('(')
|
||||||
|
then
|
||||||
|
scan(Cs, array_cons('(', Toks0), Toks)
|
||||||
|
else if
|
||||||
|
C = (')')
|
||||||
|
then
|
||||||
|
scan(Cs, array_cons(')', Toks0), Toks)
|
||||||
|
else
|
||||||
|
error("expr: syntax error in input")
|
||||||
|
)
|
||||||
|
).
|
||||||
|
|
||||||
|
:- func array_cons(T, array(T)) = array(T).
|
||||||
|
:- external(array_cons/2).
|
||||||
|
:- func array_reverse(array(T)) = array(T).
|
||||||
|
:- external(array_reverse/1).
|
||||||
|
:- func array_tail(array(T)) = array(T).
|
||||||
|
:- external(array_tail/1).
|
||||||
Reference in New Issue
Block a user