calculator.plcc 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. skip WHITESPACE '\s+'
  2. token OP '\+|-'
  3. token MOP '\*|/'
  4. token NUM '[0-9]+'
  5. %
  6. <start> ::= <exp>
  7. <exp> ::= <mult> <exprest>
  8. <exprest> **= <OP> <mult>
  9. <mult> ::= <value> <multrest>
  10. <multrest> **= <MOP> <value>
  11. <value> ::= <NUM>
  12. %
  13. Start
  14. %%{
  15. public void $run() {
  16. System.out.println(exp.calculate());
  17. }
  18. %%}
  19. Exp
  20. %%{
  21. public int calculate() {
  22. int x = mult.calculate();
  23. return exprest.calculate(x);
  24. }
  25. %%}
  26. Exprest
  27. %%{
  28. public int calculate(int resultSoFar) {
  29. Iterator<Token> opIt = opList.iterator();
  30. Iterator<Mult> multIt = multList.iterator();
  31. while(opIt.hasNext()) {
  32. String op = opIt.next().toString();
  33. int n = multIt.next().calculate();
  34. switch(op) {
  35. case "+": resultSoFar += n; break;
  36. case "-": resultSoFar -= n; break;
  37. }
  38. }
  39. return resultSoFar;
  40. }
  41. %%}
  42. Mult
  43. %%{
  44. public int calculate() {
  45. int x = value.getValue();
  46. return multrest.calculate(x);
  47. }
  48. %%}
  49. Multrest
  50. %%{
  51. public int calculate(int resultSoFar) {
  52. Iterator<Token> mopIt = mopList.iterator();
  53. Iterator<Value> valueIt = valueList.iterator();
  54. while(mopIt.hasNext()) {
  55. String op = mopIt.next().toString();
  56. int n = valueIt.next().getValue();
  57. switch(op) {
  58. case "*": resultSoFar *= n; break;
  59. case "/": resultSoFar /= n; break;
  60. }
  61. }
  62. return resultSoFar;
  63. }
  64. %%}
  65. Value
  66. %%{
  67. public int getValue() {
  68. return Integer.parseInt(num.toString());
  69. }
  70. %%}