Hans Aberg writes: > I thought "OR" was a terminal, and "expr" a nonterminal that may expand to > contain "OR" by the rule you listed as > expr -> expr OR expr
Yes, that's correct. But that's not the full story. I've posted it before, but here it is again: answer_statement: ANSWER expr answer_btn_list ... ; answer_btn_list: WITH answer_btn_list_oneplus | /* empty */ ; answer_btn_list_oneplus: answer_btn_list_oneplus OR expr | expr %prec PSEUDO_MAX ; expr contains a lot of things, expr OR expr is one of them. > Which is causing the shift/reduce conflicts. Your answer gives me the > impression that you may not understand how a grammar works. Correct me if I'm wrong, but given: answer "Hello" with "Cancel" or "OK" the shift-reduce conflict is on the token "OR" after "Cancel". Bison could, due to the ambiguous grammar, either shift OR (leading to reduction by expr OR expr -> expr) or reduce (expr -> answer_btn_list_oneplus). By default, it decided on shift. I didn't like that, so I now have that %prec in there, which tells bison to reduce. > The question is really: How do you want the rules > expr -> expr OR expr > x -> ANSWER expr WITH expr OR expr > to be applied when the expression > ANSWER expr WITH expr OR expr OR expr OR expr > appears on top of the stack? I hope the above answers that. > But you have not told us whether > answer "Hello" OR "world" with "Cancel" or "OK" or "Bye" > is legal. Well, syntacticly (is that a word?) it's legal. It would display a dialogue with three buttons, except for the runtime error from "hello" and "world" not being boolean values. > So then you must have yet another rule you have not told us, either > x -> ANSWER expr WITH "(" expr ")" > x -> ANSWER expr WITH expr Actually, it's one of the many things in expr: '(' expr ')'. > I can only give my hunch of what the grammar might be (leaving it to Akim > finding an efficient one): I've tried changing the expr above to expr_orless and then adding a seperate expr: expr_orless | expr OR expr, but that led to reduce-reduce conflicts. I honestly didn't spend much time thinking about why.
msg00828/pgp00000.pgp
Description: PGP signature