[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Cannot print correct values in Bison code
From: |
Martin Alexander Neumann |
Subject: |
Re: Cannot print correct values in Bison code |
Date: |
Sat, 30 May 2020 09:59:55 +0200 |
Good morning Christian,
during reductions Bison does "hand over" a single semantic value only
from the right side of your productions to the left side of the
productions. By default it is the first, i.e. "$$ = $1" in Bison terms.
I suppose your productions of array_vals look like the following:
--------------------------------------------------------------
array_vals : array_vals COMMA vals { $$ = $1; }
| vals; { $$ = $1; }
--------------------------------------------------------------
If these rules match yours ones, then in your example,
1. "10" is reduced to "vals",
2. "vals" is reduced to "array_vals",
3. "20 is reduced to "vals",
3. "array_vals COMMA vals" is reduced to "array_vals"
...
Therefore, your example is constantly handing over "10" only as semantic
value.
If you want to hand over more semantic values during a reduction, you
have to extend this code yourself, e.g.
--------------------------------------------------------------
array_vals : array_vals COMMA vals { $$ = concatenate*($1, $3); }
| vals; { $$ = $1; }
--------------------------------------------------------------
* Some self-made function that somehow can join two semantic values into
one. It could for example save these two values in a linked list.
Greetings,
Alex
On 30.05.20 02:59, M. P. D Productions wrote:
> *BISON VERSION: 3.6.2*
>
> Hey! I'm very new to Flex/Bison, so please go easy on me. I am trying to
> declare the syntax of an "array" as follows:
> *array: '[' array_vals ']'*
>
> *array_vals:*
> *| vals*
>
> *vals: STRING //String values defined in my lexer*
> *| FLOAT //Float values defined in my lexer*
> *| INT //Integer values defined in my lexer*
>
> I feel like this is pretty self explanatory, but there's just *one *problem:
> Wherever I print the "array_vals", using this: *array: '[' array_vals ']'
> { cout << $2 << endl; }* I get only the first value of the array in my
> source code, so if I have this in my source file: "[10, 20, 30, 40]" then
> it only prints "10." I've tried printing the "vals" in "array_vals", and
> it's even weirder and inconsistent. I know that this isn't a bug since I
> went from Bison version 3.5.1 to 3.6.2 and there was no difference. If
> someone knows, then thank you, but once again, I am new to this, so please
> go easy on me.
>