Files
mercury/extras/moose/tests/array_based.moo
Julien Fischer c954687d2e Update a moose regression test.
extras/moose/tests/array_based.moo:
    Replace `:- external' declarations with `:- pragma external_func'
    declarations.
2016-04-26 13:32:33 +10:00

82 lines
1.6 KiB
Plaintext

% This is a regression test. It tests that moose 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).
:- pragma external_func(array_cons/2).
:- func array_reverse(array(T)) = array(T).
:- pragma external_func(array_reverse/1).
:- func array_tail(array(T)) = array(T).
:- pragma external_func(array_tail/1).