Jeffrey H. wrote:
> When given a line of code such as:
>
> a = "this", b = "that", c = "those"
>
> [...]
>  have found is that this is interpreted as
>
> a = "this", (b = "that"), (c = "those")
>
> and not
>
> a = "this", (b = "that", c = "those")
>
> I would like to be able to explain 'why' the other assignments are allowed

The code of your program is parsed, by a "parser". The parser has rules 
about what can be found in a program, and if you look at these rules 
you'll discover why your code doesn't tranlstae to ' a = "this", (b = 
"that", c = "those") '.

The rules can be found as BNF notation:

http://docs.huihoo.com/ruby/ruby-man-1.4/yacc.html

(that doc it's probably quite obsolete, but it can serve our purpose.)

You can see that multiple assignment is described using this pattern:

  MLHS `=' MRHS

It stands for "Multiple-assiggment Left Hand Side = Multiple-assignment 
Right Hand Side".

Now, this expression is part of a larger structure: EXPR (it stand 
probbaly for "expression").

Now, let's look at the pattern for MRHS:

  ARGS [`,' `*' ARG]

Now, let's look at the pattern for ARGS:

  ARG (`,' ARG)*

It's composed of ARG thingies, so let's look at the pattern for ARG:

ARG    : LHS `=' ARG
    | LHS OP_ASGN ARG
    | ARG `..' ARG
    | ARG `...' ARG
    | ARG `+' ARG
    | ARG `-' ARG
    | ARG `*' ARG
  [lot's of lines snipped]

Now comes the important part: you'll discover that there's a thing ARG 
*can't* be: EXPR. And since the MLHS=MRHS is under EXPR, it follows that 
the right hand side or multiple assignment can't (directly) contain a 
multiple asignment.

In other words, ' a = "this", b = "that", c = "those" ' can't be parsed 
into ' a = "this", (b = "that", c = "those") ' because this isn't a 
valid structure.

The BNF I used my not be the actual one used for ruby, but that's not 
important, I just wanted to show why a parser chooses one interpretation 
for a source-code and not another.

==

BTW, you can see to what tree Ruby parses your source by installing the 
'rubynode' gem. Then you'd be able to do:

require 'rubygems'
require 'rubynode'
 pp ' a = "this", b = "that", c = "those" '.parse_to_nodes.transform

-- 
Posted via http://www.ruby-forum.com/.