Fix for A=<<1>>

Ulf Wiger etxuwig@REDACTED
Fri May 2 13:47:36 CEST 2003

I quickly glanced at erl_scan.erl to see if my instinctive
objection to your patch was correct, and it was... but
leading to a further question/complaint:

erl_scan.erl is designed to be reentrant. Thus, your code
may not always work, since it might happen that the split
into chunks will occur right inside "=<<".

What I observed in erl_scan.erl is that this kind of
cheating is already done when matching "<<", ">>", ">=",
"->", etc.

pre_escape/2 does things the hard (reentrant) way, but e.g.
scan_escape/2 cheats.

Or am I overlooking some magic code snippet that guarantees
that there are always enough bytes in the scan buffer to
ensure that the right function clause matches?

(BTW, xmerl_scan.erl, which I wrote, suffers from the same
problem; matching multiples in the function head is great
for readability, but not if you want your scanner to be


On Thu, 1 May 2003, James Hague wrote:

>That the start of "A=<<1>>" is incorrectly tokenized into
>A, =<, < has always bothered me, so here's a patch for
>erl_scan.erl that fixes it.  Special casing this in the
>scanner is a bit grotty, but it's better than having a
>special case in the documentation.
>I'm posting this here instead of erlang-patches to see if
>anyone can come up with a reason why this is a bad idea
>(besides being an odd special case).
>(Apologies for the manual patch, BTW.)
>%% Punctuation characters and operators, first recognise multiples.
>%% The first clause looks for "=<<" and splits it into "=","<<" so
>%% matches like "=<<1>>" aren't tokenized as "=<","<".
>scan1([$=,$<,$<|Cs], Toks, Pos) ->
>    scan1(Cs, [{'<<',Pos},{'=',Pos}|Toks], Pos);

Ulf Wiger, Senior Specialist,
   / / /   Architecture & Design of Carrier-Class Software
  / / /    Strategic Product & System Management
 / / /     Ericsson AB, Connectivity and Control Nodes

More information about the erlang-questions mailing list