Re: [PATCH] Tokenizer

From: Alex Rousskov <rousskov_at_measurement-factory.com>
Date: Tue, 03 Jun 2014 06:58:44 -0600

On 06/02/2014 10:02 PM, Amos Jeffries wrote:
> On 3/06/2014 6:07 a.m., Alex Rousskov wrote:
>> On 06/02/2014 11:27 AM, Kinkie wrote:
>>>>> + * At least one terminating delimiter is required. \0 may be passed
>>>>> + * as a delimiter to treat end of buffer content as the end of token.
>>>>
>>>>> + if (tokenLen == SBuf::npos && !delimiters['\0']) {

>>>> The above is from the actually committed code (not the code posted for
>>>> review). Please remove \0 as a special case. As far as I can tell, the
>>>> reason it was added is already covered well enough by the existing API.
>>>> The addition of this special case is likely to just confuse and break
>>>> things. For example, adding \0 to delimiters for the purpose of
>>>> disabling this special case will also tell Tokenizer to skip \0
>>>> characters in input, which is often wrong.

> But it is not wrong that often. On direct network input such as we are
> dealing with it is more often a "right" delimiter. Consider
> \0-terminated string values inside NTLM, Kerberos/GSSAPI, ICP, HTCP
> packets, our own SSL helper 'eom' line endings, HTTP/2 using \0
> delimiter for Cookies, etc.

Grammars that use 0-terminated strings will add \0 to delimiter sets as
needed. Grammars that do not use 0-terminated strings will not add \0 to
delimiter sets. In either case, assigning a secondary meaning to \0
breaks parsing and spoils the API. There is no need for these problems
as Kinkie's alternative API demonstrates. The only argument half-worth
having is whether that more complex API is needed at all.

> The use case for token() is finding a { D* T+ D+ } sequence.

Sure, the above is the definition of the new token() API. When it comes
to actual/real use cases, I suspect any correct parsing code calling
token() will not need a special Tokenizer API to exclude "{T+} followed
by {T+}" cases. In other words, all the necessary checks can and should
be done without that special API. If you have a use case where the new
API is required, please share it.

Cheers,

Alex.
Received on Tue Jun 03 2014 - 12:58:50 MDT

This archive was generated by hypermail 2.2.0 : Tue Jun 03 2014 - 12:00:17 MDT