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

shift/reduce conflict and grouping



In the grammar I'm currently working on I'm getting a shift/reduce
conflict that I cannot explain

shift/reduce conflict in state [stack: TKlasse TIdentifier TThread TCases
PPlusExpression *] on TPlus in {
        [ PPlusExpression = PPlusExpression * TPlus PStarExpression ]
(shift),
        [ PRelationExpression = PPlusExpression * ] followed by TPlus
(reduce)
}

shift/reduce conflict in state [stack: TKlasse TIdentifier TThread TCases
PPlusE
xpression *] on TMinus in {
        [ PPlusExpression = PPlusExpression * TMinus PStarExpression ]
(shift),
        [ PRelationExpression = PPlusExpression * ] followed by TMinus
(reduce)
}


Below are the corresponding productions:

relation_expression = {psubset} relation_expression psubset plus_expression
	| {not_in_set} relation_expression not_in_set plus_expression
	| {in_set} relation_expression in_set plus_expression
	| {subset} relation_expression subset plus_expression
	| {not_equal} relation_expression not_equal plus_expression
	| {less_than} relation_expression less_than plus_expression
	| {greater_than} relation_expression greater_than plus_expression
        | {less_or_equal} relation_expression less_or_equal plus_expression
	| {greater_or_equal} relation_expression greater_or_equal plus_expression
	| {plus} plus_expression;

plus_expression = {plus} plus_expression plus star_expression
	| {minus} plus_expression minus star_expression
	| {union} plus_expression union star_expression
	| {set_diff} plus_expression set_diff star_expression
	| {munion} plus_expression munion star_expression
	| {double_plus} plus_expression double_plus star_expression
	| {concat} plus_expression concat star_expression
	| {star} star_expression;


I compared my code to a simple example, which works flawlessly:

	start = expr semi;

	expr = {plus} expr plus mexpr
		| {minus} expr minus mexpr
		| {mexpr} mexpr;

	mexpr = {star} mexpr star atom
		| {div} mexpr div atom
		| {atom} atom;

	atom = int;


I cannot see any significant differences. So why does my real grammar
result in a shift/reduce conflict ?

------------------------------------------

I also have another problem. How can I create productions that are
left/right grouping (not both at the same time) ? The simple example above
is left grouping (if I'm not mistaken). However, the grammar I'm working
on has operators that are right grouping. How do I model that ?

Thanks in advance for your help.

-------------------

Pieter van der Spek
---- West Consulting B.V.        - www.west.nl
---- Tu Delft / Computer Science - www.tudelft.nl