Original BNF (Fig. 6.17):
expr --> expr + term | term
term --> term * factor | factor
factor --> ( expr ) | number
number --> number digit | digit
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Original EBNF (Fig. 6.18):
expr --> term { + term }
term --> factor { * factor }
factor --> ( expr ) | number
number --> digit { digit }
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
a) At most, one unary minus is allowed in each expression, and it must come at the beginning of an expression, so -2 + 3 is legal (and equals 1) and -2 + (-3) is legal, but -2 + -3 is not.
Modified BNF:
signed-expr --> - expr | expr
expr --> expr + term | term
term --> term * factor | factor
factor --> ( signed-expr ) | number
number --> number digit | digit
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
The reason this works, is because the root is changed from expr to signed-expr, and now only the first term that doesn't have a parenthesis will be signed or any other term that has parenthesis.
The reason that -2 + -3 would not work in this situation is the fact that the minus is added at the expression level, and if there is no () around the -3, it's not evaluated as an expression so it can never pass this test.
Modified EBNF:
signed-expr --> - expr | expr
expr --> term { + term }
term --> factor { * factor }
factor --> ( signed-expr ) | number
number --> digit { digit }
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
This one works for the same reason that the previous BNF version does. Although, the syntax is slightly different.
Modified BNF:
expr --> expr + term | term
term --> term * factor | factor
factor --> - ( expr ) | ( expr ) | signed-number
signed-number --> - number | number
number --> number digit | digit
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Modified EBNF:
expr --> term { + term }
term --> factor { * factor }
factor --> -( expr ) | ( expr ) | signed-number
signed-number --> - number | number
number --> digit { digit }
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
This version is basically identical to the BNF form, due to the type of change we are making. The E (Extended) does not get in our way for this modification.
c) Arbitrarily many unary minuses are allowed before numbers and left parenthesis, so everything above is legal.
This would require us to create signed-factors so we can have double negatives.
Modified BNF:
expr --> expr + term | term
term --> term * signed-factor | signed-factor
signed-factor --> - factor | factor
factor --> ( expr ) | signed-number
signed-number --> - number | number
number --> number digit | digit
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Modified EBNF:
expr --> term { + term }
term --> signed-factor { * signed-factor }
signed-factor --> - factor | factor
factor --> ( expr ) | signed-number
signed-number --> - number | number
number --> digit { digit }
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
c) says that 'arbitrarily many unary minuses are allowed before numbers and left parenthesis,' but this is not true.
ReplyDeleteThe last BNF does not accept an arbitrary number of minuses, but only up to two. The correct solution should be
signed-factor --> factor | - signed-factor
factor --> ( expr ) | number
Along with - signed-factor, + signed-factor is generally included as well to allow unary pluses.