advertisement

4.3 Arithmetic Expressions In this section, we shall introduce context-free grammars to generate a class of arithmetic expressions with operators , , , and ^. Especially, we have to handle the associativities and precedences of the operators. For the associativities, the operators and are associative, the operators and are left associative, and The exponential operator ^ is right associative. Example 12 : 12 + 4 + 3 = ( ( 12 + 4 ) + 3 ) = ( 12 + ( 4 + 3 ) ) 12 4 3 = ( ( 12 4 ) 3 ) = ( 12 ( 4 3 ) ) 12 4 3 = ( ( 12 4 ) 3 ) ( 12 ( 4 3 ) ) 12 4 3 = ( ( 12 4 ) 3 ) ( 12 ( 4 3 ) ) 12 ^ 4 ^ 3 = ( 12 ^ ( 4 ^ 3 ) ) = ( 12 ^ 64 ) (12 ^ 4) ^ 3 = 12 ^ 12 The following operators takes precedence in decreasing order. ( unary minus ) ^ ( exponent ) , , . Example 13 : 12 2 + 15 3 4 ^ 3 = ( 12 2 ) + ( (15 3) (4 ^ 3) ) Left associativity Example 14: The following grammar as in the example 10 is ambiguous. E E + E | E E | (E) | <integer> In order to eliminate ambiguity, we impose left associativities for the operators + and . After introduce a new variable, say <term>, we have a new grammar as follows. E E + <term> | E <term> | <term> <term> (E) | <integer> Note : Sometimes we need to apply the theorem 4 to revise the above left recursive productions to right recursive productions. The unique parse tree for the sentence 7 + 4 6 + 5 is as follows. E E E + <term> E + <term> <term> <integer> * 5 <integer> * <term> <integer> * <integer> 4 6 * 7 The parse tree interprets the expression 7+46+5 as (((7+4) 6)+5). Right associativity Example 15: The following grammar generating expressions with operator ^ is ambiguous. E E ^ E | (E) | <integer> The leftmost derivation for 2^3^2 is as follows. E E ^ E * 2 ^ E 2 ^ E ^ E * 2 ^ 3 ^ E * 2 ^ 3 ^ 2 The rightmost derivation for 2^3^2 is as follows. E E ^ E * E ^ 2 E ^ E ^ 2 * E ^ 3 ^ 2 * 2 ^ 3 ^ 2 Hence, the sentence 2^3^2 has 2 different parse trees as follows. E E E ^ E E ^ E <integer> * <integer> <integer> 2 * * 3 2 E <integer> * E ^ ^ E E <integer> <integer> * 2 * 2 3 The left tree interprets 2^3^2 as 2^(3^2)=2^9 = 512. The right tree interprets 2^3^2 as (2^3)^2 = 8^2 = 64, a wrong result. In order to eliminate ambiguity, we impose right associativity for the operator ^. After introduce a new variable, say <expon>, we have a new grammar as follows. Example 16: The following grammar generates expressions for operator ^ to possess right associativity. E <expon> ^ E | <expon> <expon> (E) | <integer> Consider the leftmost derivation and the rightmost derivation for the sentence 2^3^2. E <expon> ^ E * 2 ^ E 2 ^ <expon> ^ E * 2 ^ 3 ^ E * 2 ^ 3 ^ <expon> * 2^3^2 E <expon> ^ E <expon> ^ <expon>^E <expon> ^ <expon> ^ <expon> * <expon> ^<expon> ^ 2 * 2 ^ 3 ^ 2 Hence, the sentence 2^3^2 has a unique parse tree as follows. E <expon> ^ E <expon> ^ E <integer> * <integer> <expon> 2 * <integer> 3 * 2 Precedence Both the operators + and are (left) associative. The operator has higher precedence than the operator +. Consider the grammar in the following example 17. Although it generates expressions for operators to posses left associativities, it is not correct because of ignoring the precedence rule. Example 17: Consider the grammar E E + <term> | E <term> | <term> <term> (E) | <integer> Consider the leftmost derivation and the rightmost derivation for the sentence 2 + 3 2. The leftmost derivation for 2 + 3 2 is as follows. E E <term> E + <term> <term> <term> + <term> <term> * 2 + 3 2 The rightmost derivation for 2 + 3 2 is as follows. E E <term> * E 2 E + <term> 2 <term> + <term> 2 * 2 + 3 2 There is a unique parse tree for the derivation of 2 + 3 2 as follows. But, the sentence 2 + 3 2 is interpreted as (2+3) 2 = 10, which is not correct. E E E <term> <integer> * 2 + <term> <integer> * 3 <term> <integer> * 2 In order to impose a precedence rule for the operators, we need to introduce a variable for each precedence level of operators. the parentheses and a single number have the highest precedence, let it be the variable <basic>. We have productions: <basic> (E) | <integer> Next, should be the operator , let it be the variable <prod>. We have productions: <prod> <prod> <basic> | <basic> Then consider the operator +, let it be the variable E. We have productions: E E + <prod> | <prod> Example 18: The following grammar generates expressions for operators + and to obey the precedence rule. E E + <prod> | <prod> <prod> <prod> <basic> | <basic> <basic> (E) | <integer> The rightmost derivation for the sentence 7 + 4 6 + 5 is as follows. E E + <prod> E + <prod> + <basic> * E + <prod> + 5 E + <prod> <basic> + 5 * E + <prod> 6 + 5 E + <basic> 6 + 5 * E + 4 6 + 5 <prod> + 4 6 + 5 <basic> + 4 6 + 5 * 7 + 4 6 + 5 The unique parse tree for the sentence 7 + 4 6 + 5 is as follows. E E E + + <prod> <prod> <basic> <prod> <basic> <integer> * * <basic> <basic> <integer> 5 * <integer> <integer> 6 <prod> * 7 * 4 The parse tree interprets 7 + 4 6 + 5 as ((7 + (4 6)) + 5). Example 19: The following grammar generates expressions for operators +, , , and ^ to obey the precedence rules and associativities. E E + <prod> | E <prod> | <prod> <prod> <prod> <expon> | <prod> <expon> | <expon> <expon> <item> ^ <expon> | <item> <item> <item> | <basic> <basic> (E) | <integer> [[ right recursive productions : <expon> <item> ^ B | B B B ^ <item> | <item> ]]