lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On Fri, Oct 9, 2015 at 4:17 AM, Rena <hyperhacker@gmail.com> wrote:
> On Oct 9, 2015 6:41 AM, "Thomas Jericke" <tjericke@indel.ch> wrote:
>>
>> On 10/09/2015 12:48 AM, Nagaev Boris wrote:
>>>
>>>
>>> t[[[z]]] looks ambiguous. Everybody would have to remember what it
>>> means: t("z") or t["z"].
>>>
>> t[[z]] is t("z") so t[[[]]] would actually be t("[]"), wouldn't it?
>> --
>> Thomas
>>
>
> Yeah, this syntax is ambiguous. t [[[z]]] already looks like it could be
> parsed as one of:
> t["z"] -- replacing innermost [[]] with ""
> t"[z"] -- replacing first [[ and ]] with ""
> t"[z]" -- replacing outermost [[]] with ""
>
> As far as neatness, I think spaces improve it a lot here by clearly defining
> the intended meaning:
> t[ [[z]] ] -- or even:
> t[
>     [[some long string here]]
> ]
> But of course spaces don't matter to the compiler.
>
> My solution if I were presented with this situation would be one of:
> local s=[[z]]
> X = t[s]
> Or: refactor so that indexing a table with a string that doesn't fit nicely
> in quotes is no longer necessary. :)

Spaces DO matter to the compiler. It may recognize some tokens without
whitespace in between, but it most certainly does NOT allow whitespace
WITHIN a token.

Besides, I don't know if anyone's actually TESTED what Lua does here.
I just did:

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print[[[x]]]
stdin:1: unexpected symbol near ']'
> print[[ [x] ]]
 [x]

In other words, the parse it ACTUALLY takes is: print"[x"]

This comes to no surprise to me because I've written a compiler
before; the lexer is doing greedy matching, extracting the longest
token it can from the stream.

/s/ Adam