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

Reply via email to