I've recently been thrown into the worked of working with Flex and Bison rather unarmed, and there's a thing or two that I'm having difficulties understanding. One of the smaller things we need do is work with making calculators for Infix/Postfix/Prefix notation...the first of which I managed to do, eventually. With the latter two, however, I'm stumped over a thing or two. Such as...when it comes to evaluating something along the lines of (+ 1 2 3 4). I'm not certain how to get it to work with X amount of numbers...only specific quantities.

Code: Select all

expr: '+' expr expr { $$ = $2 * $3; }

Such as that...with a simple + A B. I understand the exceedingly simple concepts of how to make it so it can do specifically/only + A B C. But I don't know how to get it to do such as + A B...n. I've perused the Bison manual extensively, but not seen any examples or other things that help me out overly much...the examples for recursion seem near non-existent, at least in showing results and such to help me understand it.. Could somebody help me out here, be it with a mere hint or more? I hope I explained it well enough; if not, do pester me, and I shall attempt again. <3 Any help'd be much appreciated..! Mostly, some sort've example of Bison recursion wuold do me wonders, I imagine. I'm looking such up myself, and just trying random things as well in the meanwhile to see if I can get this working.. =>

Edit: Ah...after suddenly feeling foolish, I got the gist of Bison recursion quite easily. Still, I cannot figure out how to do something such as the + 1 2 3 4 above. I have issues getting such as that to work..but I'll keep trying. =3

## Help with Bison recursion.. =>

**Moderators:** phlip, Moderators General, Prelates

### Re: Help with Bison recursion.. =>

Probably something along the lines of:

plus-expr: "+" | plus-expr expr

That's usually how operators are chained for binary notation, so I would expect it works for prefix (haven't tested it though).

plus-expr: "+" | plus-expr expr

That's usually how operators are chained for binary notation, so I would expect it works for prefix (haven't tested it though).

- Yakk
- Poster with most posts but no title.
**Posts:**11083**Joined:**Sat Jan 27, 2007 7:27 pm UTC**Location:**E pur si muove

### Re: Help with Bison recursion.. =>

I forgot how the grammer rules of Bison prefer things. There is:

expr-> plus-expr | mult-expr | div-expr | sub-expr | ...

plus-expr -> "(" "+" expr expr opt-many-expr ")"

opt-many-expr -> nothing | expr opt-many-expr

And there is:

expr-> plus-expr | mult-expr | div-expr | sub-expr | ...

plus-expr -> "(""+" expr many-expr ")"

opt-many-expr -> expr | expr many-expr

and there is:

plus-expr -> "(""+" expr expr many-with-end-expr

many-with-end-expr -> ")" | expr many-with-end-expr

or even:

expr -> literal | "(" forumla

formula -> plus-expr | mult-expr | ...

plus-expr -> "+" expr expr long-expr-tail

long-expr-tail -> ")" | expr long-expr-tail

the goal, of course, is to get things to clump right.

I think the right choice might be the many-with-end-expr, or long-expr-tail, but it has been a while since I wrote a parse tree for a compiler.

The long-expr-tail one has the nice property that each derivation rule you should follow can be determined by the leftmost token.

at expr, if you see "(", follow right rule. Otherwise, it is a literal.

at formula, "+" means plus-expr, "*" means mult-expr, etc.

at plus-expr, there is only one rule. Get a "+", then an expr, then an expr.

at long-expr-tail, if you see a ")" you know what to do. Otherwise, you will be following the right rule.

I believe that is known as an LL(1) grammar -- left lookahead, left expansion first grammar. I can't remember if that is the kind of things Bison wants or not, off the top of my head.

expr-> plus-expr | mult-expr | div-expr | sub-expr | ...

plus-expr -> "(" "+" expr expr opt-many-expr ")"

opt-many-expr -> nothing | expr opt-many-expr

And there is:

expr-> plus-expr | mult-expr | div-expr | sub-expr | ...

plus-expr -> "(""+" expr many-expr ")"

opt-many-expr -> expr | expr many-expr

and there is:

plus-expr -> "(""+" expr expr many-with-end-expr

many-with-end-expr -> ")" | expr many-with-end-expr

or even:

expr -> literal | "(" forumla

formula -> plus-expr | mult-expr | ...

plus-expr -> "+" expr expr long-expr-tail

long-expr-tail -> ")" | expr long-expr-tail

the goal, of course, is to get things to clump right.

I think the right choice might be the many-with-end-expr, or long-expr-tail, but it has been a while since I wrote a parse tree for a compiler.

The long-expr-tail one has the nice property that each derivation rule you should follow can be determined by the leftmost token.

at expr, if you see "(", follow right rule. Otherwise, it is a literal.

at formula, "+" means plus-expr, "*" means mult-expr, etc.

at plus-expr, there is only one rule. Get a "+", then an expr, then an expr.

at long-expr-tail, if you see a ")" you know what to do. Otherwise, you will be following the right rule.

I believe that is known as an LL(1) grammar -- left lookahead, left expansion first grammar. I can't remember if that is the kind of things Bison wants or not, off the top of my head.

One of the painful things about our time is that those who feel certainty are stupid, and those with any imagination and understanding are filled with doubt and indecision - BR

Last edited by JHVH on Fri Oct 23, 4004 BCE 6:17 pm, edited 6 times in total.

Last edited by JHVH on Fri Oct 23, 4004 BCE 6:17 pm, edited 6 times in total.

### Re: Help with Bison recursion.. =>

Bison wants LR, but all LL languages are LR.

### Re: Help with Bison recursion.. =>

Ah, thank you very much..! That certainly led to me working out how to do things properly, and all is working quite well, now. Thankee very, very much. <3

### Who is online

Users browsing this forum: No registered users and 8 guests