Advertisement
Ladies_Man

Parsing Director (xiao8)

Nov 10th, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.79 KB | None | 0 0
  1. public interface StackMachine
  2. {
  3.         // Положить константу в стек
  4.         void pushConst(int value);
  5.  
  6.         // Положить в стек значение переменной x
  7.         void pushVar();
  8.  
  9.         // Изменить знак числа на вершине стека
  10.         void neg();
  11.  
  12.         // Бинарные арифметические операции.
  13.         // Каждая операция снимает два операнда со стека
  14.         // и кладёт на стек результат
  15.         void add();  // сложение
  16.         void sub();  // вычитание
  17.         void mul();  // умножение
  18.         void div();  // деление
  19. }
  20.  
  21. //========================================================================================
  22.  
  23.     public class ParsingDirector {
  24.             private StackMachine stack;
  25.             private String number;
  26.             private char image;
  27.             private int tag, i, num;
  28.     /*LL1 - грамматика:
  29.     <E>  ::= <T> <E’>.
  30.     <E’> ::= + <T> <E’> | - <T> <E’> | .
  31.     <T>  ::= <F> <T’>.  
  32.     <T’> ::= * <F> <T’> | / <F> <T’> | .
  33.     <F>  ::= <number> | <var> | ( <E> ) | - <F>.
  34.     */    
  35.             public ParsingDirector (StackMachine stack) { this.stack = stack; }
  36.            
  37.             public void parse (String s) {
  38.                     i = 0;
  39.                     NextLexem(s);
  40.                     parse_E(s);     //<E>  ::= <T> <E’>.
  41.             }
  42.            
  43.             private void NextLexem (String str) {
  44.                     int j = 0;
  45.                     while (i < str.length()) {
  46.                             if (str.charAt(i) != ' ') {
  47.                                     if (str.charAt(i) == '+') {
  48.                                             image = '+';
  49.                                     } else if (str.charAt(i) == '-') {
  50.                                             image = '-';
  51.                                     } else if (str.charAt(i) == '*') {
  52.                                                     image = '*';
  53.                                             } else if (str.charAt(i) == '/') {
  54.                                                             image = '/';
  55.                                                     } else if (str.charAt(i) == '(') {
  56.                                                                     image = '(';
  57.                                                             } else if (str.charAt(i) == ')') {
  58.                                                                             image = ')';
  59.                                                             }
  60.                             tag = 1;
  61.                             if (str.charAt(i) == 'x') {
  62.                                     tag = 2;
  63.                                     image = 'x';
  64.                             }
  65.                             j = i;
  66.                             if ((str.charAt(i) >= '0') && (str.charAt(i) <= '9')) {
  67.                                     tag = 3;
  68.                                     number = "";
  69.                                     while ((j < str.length()) && (str.charAt(j) >= '0') && (str.charAt(j) <= '9')) {
  70.                                             number += str.charAt(j);
  71.                                             j++;    //move in number
  72.                                     }
  73.                                     i = j-1;
  74.                             }
  75.                             } else {
  76.                                     i++;
  77.                                     continue;
  78.                             }
  79.                             i++;
  80.                             break;
  81.                     }
  82.             }
  83.            
  84.             //<E>  ::= <T> <E’>.
  85.             private void parse_E (String str) {
  86.                     parse_T (str);
  87.                     parse_E1 (str);
  88.             }
  89.            
  90.             //<T>  ::= <F> <T’>.
  91.             private void parse_T (String str) {
  92.                     parse_F (str);
  93.                     parse_T1 (str);
  94.             }
  95.            
  96.             //<E’> ::= + <T> <E’> | - <T> <E’> | .
  97.             private void parse_E1 (String str) {
  98.                     if (tag == 1 && image == '-') {
  99.                             NextLexem(str); //next lexem for <T>
  100.                             parse_T(str);   //<T>
  101.                             stack.sub();    //- <T> <E1>
  102.                             parse_E1(str);  //<E1>
  103.                     } else if (tag == 1 && image == '+') {
  104.                             NextLexem(str);
  105.                             parse_T(str);
  106.                             stack.add();
  107.                             parse_E1(str);
  108.                     }
  109.             }
  110.            
  111.             //<T’> ::= * <F> <T’> | / <F> <T’> | .
  112.             private void parse_T1 (String str) {
  113.                     if (tag == 1 && image == '/') {
  114.                             NextLexem(str); //next lexem for <F>
  115.                             parse_F(str);   //<F>
  116.                             stack.div();    // / <F> <T1>
  117.                             parse_T1(str);  //<T1>
  118.                     } else if (tag == 1 && image == '*') {
  119.                             NextLexem(str);
  120.                             parse_F(str);
  121.                             stack.mul();
  122.                             parse_T1(str);
  123.                     }
  124.             }
  125.            
  126.             //<F>  ::= <number> | <var> | ( <E> ) | - <F>.
  127.             private void parse_F (String str) {
  128.                     if (tag == 1) {
  129.                             if (image == '-') {
  130.                                     NextLexem(str);
  131.                                     parse_F(str);
  132.                                     stack.neg(); //- <F>
  133.                             } else if (image == '(') {
  134.                                     NextLexem(str); //next lexem for <E>
  135.                                     parse_E(str);   //( <E> )
  136.                                     NextLexem(str);
  137.                             }
  138.                     } else {
  139.                             if (tag == 2) {
  140.                                     stack.pushVar();        //<var>
  141.                                     NextLexem(str);
  142.                             } else {
  143.                                     if (tag == 3) {
  144.                                             num = Integer.parseInt(number);
  145.                                             stack.pushConst(num);   //<number>
  146.                                             NextLexem(str);
  147.                                     }
  148.                             }
  149.                     }
  150.             }
  151.     }
  152.  
  153. //========================================================================================
  154.  
  155. => 5
  156. => x*(x+2)
  157. <= 35
  158.  
  159. => 10
  160. => 2 * -x + 100
  161. <= 80
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement