Hi Ram, I think the error message appears because the second alternative for " ConditionTerm" start with an "(", and the first derives (via "Value") a string that can also start with "(" because of the second alternative in "Factor".
One solution is to allow those parentheses in only one place. Here's an example (grammar for a different language): --------------------------------------------------------------------------------- expression = xor_expression {'OR' xor_expression} ; xor_expression = and_expression {'XOR' and_expression} ; and_expression = comparison {('&' | 'AND') comparison} ; comparison = equ_expression {('=' | '<>') equ_expression} ; equ_expression = add_expression {comparison_operator add_expression} ; comparison_operator = '<' | '>' | '<=' | '>=' ; add_expression = term {add_operator term} ; add_operator = '+' | '-' ; term = unary_expression {multiply_operator unary_expression} ; multiply_operator = '*' | '/' | 'MOD' ; unary_expression = {unary_operator} primary_expression ; unary_operator = '-' | '+' | 'NOT' ; primary_expression = constant | variable | '(' expression ')' ... ; --------------------------------------------------------------------------------- It seems you are trying with your grammar to force the condition of an if(...) to be a comparison. The above approach would allow anything derivable from "expression" to appear there, so you would have to check during semantic analysis that your restriction is adhered to. On the other hand, if I'm not mistaken standard C allows if(1)... Regards Oliver Gramberg Ram Marzin <ra...@bgu.ac.il> Sent by: grammatica-users-bounces+oliver.gramberg=de.abb....@nongnu.org 28.11.2010 18:45 Please respond to grammatica-users@nongnu.org To grammatica-users@nongnu.org cc Subject [Grammatica-users] inherent ambiguity issue Hello, My name is Ram and I use grammatica SW as a part of my acadmic project in the university. I use grammatica to help me develop c parser (an important part of my project). I get an inherent ambiguity error which I cannot solve, The code is: /* Expression */ Expression = Term [ExpressionRest] ; ExpressionRest = "+" Expression | "-" Expression ; Term = Factor [TermRest] ; TermRest = "*" Term | "/" Term | "%" Term ; Factor = Atom | "(" Expression ")" ; Atom = Number | STRING_DATA | VARIABLE_NAME | FunctionCall | Casting; Number = INT_NUMBER | FLOAT_NUMBER; /* Condition Statement */ Condition = ConditionTerm [ConditionRest] ; ConditionRest = AND Condition | OR Condition ; ConditionTerm = ConditionAtom | "(" Condition ")" ; ConditionAtom = Value ConditionOperator Value ; ConditionOperator = "==" | "!=" | ">" | "<" | "<=" | ">="; Value = Expression; The error is: Error: in pt.grammar: lines 163-164: inherent ambiguity in production 'ConditionTerm' starting with token "(" ConditionTerm = ConditionAtom | "(" Condition ")" ; I understand why it happens, there is unlimit look ahead option but how can I solve it ? Thanks, Ram. _______________________________________________ Grammatica-users mailing list Grammatica-users@nongnu.org http://lists.nongnu.org/mailman/listinfo/grammatica-users
_______________________________________________ Grammatica-users mailing list Grammatica-users@nongnu.org http://lists.nongnu.org/mailman/listinfo/grammatica-users