I want to write a new parser for mathematical program. When i write BNF grammar for that, I'm stuck in expressions. And this is the BNF notation I wrote.
program : expression*
expression: additive_expression
additive_expression : multiplicative_expression
                    | additive_expression '+' multiplicative_expression
                    | additive_expression '-' multiplicative_expression
multiplicative_expression : number
                          | number '*' multiplicative_expression
                          | number '/' multiplicative_expression
But i cannot understand how to write BNF expression grammar for ++, --, +=, -=, &&, || etc. this operators. I mean operators in languages like C, C++, C#, Python, Java etc.
I know that when using +, -, *, / operators, grammar should be written according to the BODMAS theory.
What i want to know is whether any theory should be used in writing grammar for other operators?
I took a good look at the C++ Language grammar ( expressions part ). But I can not understand it.
<expression> ::= <assignment_expression>
               | <assignment_expression> <expression>
<assignment_expression> ::= <logical_or_expression> "=" <assignment_expression>
                          | <logical_or_expression> "+=" <assignment_expression>
                          | <logical_or_expression> "-=" <assignment_expression>
                          | <logical_or_expression> "*=" <assignment_expression>
                          | <logical_or_expression> "/=" <assignment_expression>
                          | <logical_or_expression> "%=" <assignment_expression>
                          | <logical_or_expression> "<<=" <assignment_expression>
                          | <logical_or_expression> ">>=" <assignment_expression>
                          | <logical_or_expression> "&=" <assignment_expression>
                          | <logical_or_expression> "|=" <assignment_expression>
                          | <logical_or_expression> "^=" <assignment_expression>
                          | <logical_or_expression>
<constant_expression> ::= <conditional_expression>
<conditional_expression> ::= <logical_or_expression>
<logical_or_expression> ::= <logical_or_expression> "||" <logical_and_expression>
                          | <logical_and_expression>
<logical_and_expression> ::= <logical_and_expression> "&&" <inclusive_or_expression>
                           | <inclusive_or_expression>
<inclusive_or_expression> ::= <inclusive_or_expression> "|" <exclusive_or_expression>
                            | <exclusive_or_expression>
<exclusive_or_expression> ::= <exclusive_or_expression> "^" <and_expression>
                            | <and_expression>
<and_expression> ::= <and_expression> "&" <equality_expression>
                   | <equality_expression>
<equality_expression> ::= <equality_expression> "==" <relational_expression>
                        | <equality_expression> "!=" <relational_expression>
                        | <relational_expression>
<relational_expression> ::= <relational_expression> ">" <shift_expression>
                          | <relational_expression> "<" <shift_expression>
                          | <relational_expression> ">=" <shift_expression>
                          | <relational_expression> "<=" <shift_expression>
                          | <shift_expression>
<shift_expression> ::= <shift_expression> ">>" <addictive_expression>
                     | <shift_expression> "<<" <addictive_expression>
                     | <addictive_expression>
<addictive_expression> ::= <addictive_expression> "+" <multiplicative_expression>
                         | <addictive_expression> "-" <multiplicative_expression>
                         | <multiplicative_expression>
<multiplicative_expression> ::= <multiplicative_expression> "*" <unary_expression>
                              | <multiplicative_expression> "/" <unary_expression>
                              | <multiplicative_expression> "%" <unary_expression>
                              | <unary_expression>
<unary_expression> ::= "++" <unary_expression>
                     | "--" <unary_expression>
                     | "+" <unary_expression>
                     | "-" <unary_expression>
                     | "!" <unary_expression>
                     | "~" <unary_expression>
                     | "size" <unary_expression>
                     | <postfix_expression>
<postfix_expression> ::= <postfix_expression> "++"
                       | <postfix_expression> "--"
                       | <primary_expression>
<primary_expression> ::= <integer_literal>
                       | <floating_literal>
                       | <character_literal>
                       | <string_literal>
                       | <boolean_literal>
                       | "(" <expression> ")"
                       | IDENTIFIER
<integer_literal> ::= INTEGER
<floating_literal> ::= FLOAT
<character_literal> ::= CHARACTER
<string_literal> ::= STRING
<boolean_literal> ::= "true"
                    | "false"
Can you help me understand this? I searched a lot on the internet about this. But I could not find the right solution for this.
Thank you
if (a > b + 7)intends to compareawithb + 7, rather than adding 7 to the boolean result of comparingawithb. So some of these decisions have a basis in common use and others are more or less arbitrary. - rici