fork download
  1. //-------------------------------------------------------------------
  2. // 8. statement = BEGIN block END
  3. // | lvalue ASSIGN expr
  4. // | READ LPAREN idList RPAREN
  5. // | WRITE LPAREN exprList RPAREN
  6. // | IF expr THEN statement (ELSE statement)?
  7. // | WHILE expr DO statement
  8. // | EXIT
  9. //-------------------------------------------------------------------
  10. public static void statement() {
  11. //statement = BEGIN block END
  12. if (token.type.name().equals("beginTK")) {
  13. token = next();
  14. block();
  15. if (token.type.name().equals("endTK")) {
  16. token = next();
  17. } else {
  18. error("END keyword expected after block");
  19. }
  20. // statement = lvalue ASSIGN expr // lvalue = ID args
  21. } else if (token.type.name().equals("identifierTK")) {
  22. lvalue();
  23. if (token.type.name().equals("assignTK")) {
  24. token = next();
  25. expr();
  26. } else {
  27. error("Assignment operator expected after lvalue");
  28. }
  29. // statement = READ LPAREN idList RPAREN
  30. } else if (token.type.name().equals("readTK")) {
  31. token = next();
  32. if (token.type.name().equals("lparenTK")) {
  33. token = next();
  34. idList();
  35. if (token.type.name().equals("rparenTK")) {
  36. token = next();
  37. } else {
  38. error("Right parenthesis expected after idList in READ statement");
  39. }
  40. } else {
  41. error("Left parenthesis expected before idList in READ statement");
  42. }
  43. // statement = WRITE LPAREN exprList RPAREN
  44. } else if (token.type.name().equals("writeTK")) {
  45. token = next();
  46. if (token.type.name().equals("lparenTK")) {
  47. token = next();
  48. exprList();
  49. if (token.type.name().equals("rparenTK")) {
  50. token = next();
  51. } else {
  52. error("Right parenthesis expected after exprList in WRITE statement");
  53. }
  54. } else {
  55. error("Left parenthesis expected before exprList in WRITE statement");
  56. }
  57. //statement = IF expr THEN statement (ELSE statement)?
  58. } else if (token.type.name().equals("ifTK")) {
  59. token = next();
  60. expr();
  61. if (token.type.name().equals("thenTK")) {
  62. token = next();
  63. statement();
  64. if (token.type.name().equals("elseTK")) {
  65. token = next();
  66. statement();
  67. }
  68. } else {
  69. error("THEN keyword expected after IF expression");
  70. }
  71. //statement = WHILE expr DO statement
  72. } else if (token.type.name().equals("whileTK")) {
  73. token = next();
  74. expr();
  75. if (token.type.name().equals("doTK")) {
  76. token = next();
  77. statement();
  78. } else {
  79. error("DO keyword expected after WHILE expression");
  80. }
  81. //statement = EXIT
  82. } else if (token.type.name().equals("exitTK")) {
  83. token = next();
  84. }
  85. }
Success #stdin #stdout 0.03s 25700KB
stdin
Standard input is empty
stdout
//-------------------------------------------------------------------
// 8. statement = BEGIN block END
// | lvalue ASSIGN expr
// | READ LPAREN idList RPAREN
// | WRITE LPAREN exprList RPAREN
// | IF expr THEN statement (ELSE statement)?
// | WHILE expr DO statement
// | EXIT
//-------------------------------------------------------------------
public static void statement() {
//statement = BEGIN block END
if (token.type.name().equals("beginTK")) {
token = next();
block();
if (token.type.name().equals("endTK")) {
token = next();
} else {
error("END keyword expected after block");
}
// statement = lvalue ASSIGN expr // lvalue = ID args
} else if (token.type.name().equals("identifierTK")) {
lvalue();
if (token.type.name().equals("assignTK")) {
token = next();
expr();
} else {
error("Assignment operator expected after lvalue");
}
// statement = READ LPAREN idList RPAREN
} else if (token.type.name().equals("readTK")) {
token = next();
if (token.type.name().equals("lparenTK")) {
token = next();
idList();
if (token.type.name().equals("rparenTK")) {
token = next();
} else {
error("Right parenthesis expected after idList in READ statement");
}
} else {
error("Left parenthesis expected before idList in READ statement");
}
// statement = WRITE LPAREN exprList RPAREN
} else if (token.type.name().equals("writeTK")) {
token = next();
if (token.type.name().equals("lparenTK")) {
token = next();
exprList();
if (token.type.name().equals("rparenTK")) {
token = next();
} else {
error("Right parenthesis expected after exprList in WRITE statement");
}
} else {
error("Left parenthesis expected before exprList in WRITE statement");
}
//statement = IF expr THEN statement (ELSE statement)?
} else if (token.type.name().equals("ifTK")) {
token = next();
expr();
if (token.type.name().equals("thenTK")) {
token = next();
statement();
if (token.type.name().equals("elseTK")) {
token = next();
statement();
}
} else {
error("THEN keyword expected after IF expression");
}
//statement = WHILE expr DO statement
} else if (token.type.name().equals("whileTK")) {
token = next();
expr();
if (token.type.name().equals("doTK")) {
token = next();
statement();
} else {
error("DO keyword expected after WHILE expression");
}
//statement = EXIT
} else if (token.type.name().equals("exitTK")) {
token = next();
}
}