[mercury-users] Bug in lexer.m
Julien Fischer
juliensf at csse.unimelb.edu.au
Wed Jul 16 18:45:32 AEST 2008
On Tue, 15 Jul 2008, Nicholas Nethercote wrote:
> On Tue, 15 Jul 2008, Nicholas Nethercote wrote:
>
>> :- pred string_ungetchar(string::in, posn::in, posn::out) is det.
>>
>> string_ungetchar(String, Posn0, Posn) :-
>> Posn0 = posn(LineNum0, LineOffset0, Offset0),
>> Offset = Offset0 - 1,
>> string.unsafe_index(String, Offset, Char),
>> ( Char = '\n' ->
>> LineNum = LineNum0 - 1,
>> Posn = posn(LineNum, Offset, Offset)
>> ;
>> Posn = posn(LineNum0, LineOffset0, Offset)
>> ).
>>
>>
>> In a 'posn', the first arg is the current line number, the 3rd arg is the
>> current offset into the string being parsed, and the 2nd arg is the offset
>> of the start of the current line.
>>
>> When the above code goes back over a newline, the 2nd argument is
>> incorrectly set -- it gets set to 'Offset', which is the offset of the
>> newline character that ended the line. It should be set to the offset of
>> the beginning of that line (which will be a number of characters earlier
>> than 'Offset'). But by this point the offset for the start of that line
>> has been lost and cannot be easily recreated.
>>
>> I suspect this has been wrong for a very long time, but nobody has noticed
>> because the lexer doesn't ever use the 2nd field anywhere (it could be used
>> to report column numbers for lexing errors, but it isn't). So perhaps the
>> 3-argument 'posn' type could be replaced with a 2-argument type, and some
>> memory would be saved.
>
> And some more savings could be made if that 2-argument type was split into
> two parts which were passed around separately. It results in extra arguments
> to lots of lexing predicates, but avoids the deconstruct/construct pair which
> currently occurs on every character.
>
> I just made a change like this to the Zinc lexer, which is structured
> similarly, and got a nice speedup (I think it was about 20--30%, although I
> didn't measure it all that carefully).
Thanks for reporting this!
Julien.
--------------------------------------------------------------------------
mercury-users mailing list
Post messages to: mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions: mercury-users-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the users
mailing list