std.d.lexer: pre-voting review / discussion

Timon Gehr timon.gehr at gmx.ch
Thu Sep 12 14:34:36 PDT 2013


On 09/12/2013 10:03 PM, Martin Nowak wrote:
> On 09/12/2013 05:39 PM, Timon Gehr wrote:
>>
>> Lookahead is realized as follows in the parser:
>>
>> (assume 'code' is the circular buffer range.)
>>
>> auto saveState(){muteerr++; return code.pushAnchor();} // saves the
>> state and mutes all error messages until the state is restored
>>
>> void restoreState(Anchor state){ muteerr--; code.popAnchor(state); }
>>
>> The 'Anchor' is a trivial wrapper around a size_t. The circular buffer
>> grows automatically to keep around tokens still reachable by an anchor.
>> (The range only needs small constant space besides the buffer to support
>> this functionality, though it is unable to detect usage errors.)
>
> Do you think it's possible to use CircularBufferRange itself as anchor.

Well, this implementation is geared towards the usage pattern found in 
the top-down parser. If the first anchor is not restored last, it will 
not generally work. This does not conform to the range interface. 
Implementing .save requires a more advanced and less efficient 
implementation.

> Then calling save() would return a CircularBufferRange and you could
> scratch the two functions above. I had some promising experiments in
> that direction,

What did you do? The way I think I'd approach it would be to maintain a 
binary min-heap using a few pointers in each range instance.

> but the implicit save on copy is annoying because you
> end up with anchors from temporary copies.

Is this referring to suboptimal efficiency? I guess that is rather hard 
to address in a safe way. Basically, you'd want to forget about "anchor 
management" in case it can be proven that there is another range on the 
same buffer that stays at most as progressed during the whole lifetime 
of the range under consideration.

Of course, it is always possible to do it in unsafely.


More information about the Digitalmars-d mailing list