mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-18 19:03:45 +00:00
67 lines
1.5 KiB
Mathematica
67 lines
1.5 KiB
Mathematica
% vim: ts=4 sw=4 et ft=mercury
|
|
%
|
|
% This a regression test for Mantis bug #128. The bug was that the loop
|
|
% invariants pass considered the unification that constructed a partially
|
|
% instantiated term (_L3 - comma in parse_enum0) to be an invariant goal,
|
|
% and attempted to hoist it out of parse_enum0's loop. Due to the free
|
|
% variable inside the term, this yielded a compiler abort.
|
|
|
|
:- module bug128.
|
|
|
|
:- interface.
|
|
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- implementation.
|
|
|
|
:- import_module assoc_list.
|
|
:- import_module int.
|
|
:- import_module list.
|
|
:- import_module maybe.
|
|
:- import_module pair.
|
|
:- import_module string.
|
|
|
|
:- type tokens == assoc_list(int, token).
|
|
|
|
:- type token
|
|
---> comma
|
|
; symbol(string)
|
|
; eof.
|
|
|
|
main(!IO) :-
|
|
write_string("Hello, world!\n", !IO).
|
|
|
|
:- type value
|
|
---> value(int, value0).
|
|
|
|
:- type value0
|
|
---> value_sym(string).
|
|
|
|
:- type parse_res(T)
|
|
---> ok(T)
|
|
; error.
|
|
|
|
:- pred parse_enum0(int::in, assoc_list(string, maybe(value))::in,
|
|
parse_res(value)::out, tokens::in, tokens::out) is det.
|
|
|
|
parse_enum0(L, Vs0, Res, !Ts) :-
|
|
( if next(_L2 - symbol(Sym), !Ts) then
|
|
( if next(_L3 - comma, !Ts) then
|
|
Vs = [Sym - no | Vs0],
|
|
parse_enum0(L, Vs, Res, !Ts)
|
|
else
|
|
Res = error
|
|
)
|
|
else
|
|
Res = error
|
|
).
|
|
|
|
:- pred next(pair(int, token)::out, tokens::in, tokens::out) is det.
|
|
|
|
next(L - T, [L - T | Ts], Ts).
|
|
next(0 - eof, [], []).
|