Session 12 Opening Exercise Handout

The small context-free grammar from Session 9:

statement  := repeat statement until expression
            | print identifier
            | identifier <- expression
expression := identifier = expression
            | zero? expression
            | number

... and a recursive-descent parser for it. Assume a function called match(Token) that consumes a token and returns either true or returns false.

public boolean statement()
{
  switch ( scanner.peek() )
  {
    Token.repeat :
      return match(Token.repeat) && statement() &&
             match(Token.until)  && expression();
    Token.print :
      return match(Token.print) && match(Token.identifier);
    Token.identifier :
      return match(Token.identifier) &&
             match(Token.assign)     && expression();
    default:
      return false;
  }
}

public boolean expression()
{
  switch ( scanner.peek() )
  {
    Token.identifier :
      return match(Token.identifier) &&
             match(Token.equals)     && expression();
    Token.zeroPredicate :
      return match(Token.zeroPredicate) && expression();
    Token.number :
      return match(Token.number);
    default:
      return false;
  }
}