3 + 4 * 5 (3 + 4) * 5 1 - (2 - (3 - (4 - 5)))
* and / bind more strongly than + and
- 
+ or - * or /
getExpressionValue getTermValue getFactorValue Why do we need both terms and factors?
* and
/), terms are combined by additive operators (+,
-).* and
/), factors are combined by additive operators (+,
-).getExpressionValue Methodpublic int getExpressionValue()
{
int value = getTermValue();
boolean done = false;
while (!done)
{
String next = tokenizer.peekToken();
if ("+".equals(next) || "-".equals(next))
{
tokenizer.nextToken(); // Discard "+" or "-"
int value2 = getTermValue();
if ("+".equals(next)) value = value + value2;
else value = value - value2;
}
else
{
done = true;
}
}
return value;
}
getTermValue MethodThe getTermValue method calls getFactorValue in the same
way, multiplying or dividing the factor values
public int getTermValue()
{
int value = getFactorValue();
boolean done = false;
while (!done)
{
String next = tokenizer.peekToken();
if ("*".equals(next) || "/".equals(next))
{
tokenizer.nextToken();
int value2 = getFactorValue();
if ("*".equals(next)) { value = value * value2; }
else { value = value / value2; }
}
else
{
done = true;
}
}
return value;
}
getFactorValue Methodpublic int getFactorValue()
{
int value;
String next = tokenizer.peekToken();
if ("(".equals(next))
{
tokenizer.nextToken(); // Discard "("
value = getExpressionValue();
tokenizer.nextToken(); // Discard ")"
}
else
{
value = Integer.parseInt(tokenizer.nextToken());
}
return value;
}
What happens if you try to parse the illegal expression 3+4*)5?
Specifically, which method throws an exception?
To see the mutual recursion clearly, trace through the expression
(3+4)*5:
getExpressionValue calls getTermValue
getTermValue calls getFactorValue
getFactorValue consumes the ( input getFactorValue calls getExpressionValue
getExpressionValue returns eventually with the value
of 7, having consumed 3 + 4. This is the
recursive call. getFactorValue consumes the ) input getFactorValue returns 7 getTermValue consumes the inputs * and 5
and returns 35 getExpressionValue returns 35 More about Java.