Advertisement
Guest User

Untitled

a guest
May 31st, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.67 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7. #include <math.h>
  8. /*  
  9. 1) S -> I:=E;
  10. 2) E -> T|E
  11.    E -> T
  12.    T -> M&T | M
  13.    M -> !M | (E) | I | C
  14. 3) I -> AK | A
  15.    K -> DK | D
  16. 4) C -> DC | D
  17. 5) A -> a | .. | z
  18. 6) D -> 0|1
  19. */
  20.  
  21. using namespace std;
  22. #define MAX_ID_LEN 50
  23. #define MAX_VARS 50
  24. #define MAX_BITS 20
  25.  
  26. typedef struct number
  27. {
  28.     long value;
  29.     int digits;
  30. } number;
  31.  
  32. typedef struct var
  33. {
  34.     char name[MAX_ID_LEN + 1];
  35.     number num;
  36. } var;
  37.  
  38. var vars[MAX_VARS];
  39. FILE * f = NULL;
  40. FILE *out = NULL;
  41. int c = EOF;
  42. int var_count = 0;
  43. int last_assigned = -1;
  44. int index = 0;
  45. int line = 1;
  46.  
  47. void  ProcS(void);
  48. number ProcE(void);
  49. number ProcT(void);
  50. number ProcM(void);
  51. number *ProcL(void);
  52. number ProcI(void);
  53. number ProcC(void);
  54.  
  55. int power(int x, int y)
  56. {
  57.     int res = 1;
  58.     if(y == 0) return 1;
  59.     else
  60.     for(int i = 0; i < y; i++)
  61.             res *= x;
  62.     return res;
  63. }
  64.  
  65. void get(void)
  66. {
  67.     c = getc(f);
  68. }
  69.  
  70. void space_skip(void)
  71. {
  72.     while(isspace(c))
  73.         get();
  74. }
  75.  
  76. bool isletter(char c)
  77. {
  78.     return c >= 'a' && c <= 'z';
  79. }
  80.  
  81. void error(const char * msg)
  82. {
  83.     puts(msg);
  84.     printf("Last symbol: %c\n", c);
  85.     exit(1);
  86. }
  87.  
  88. void to_binary(number x)
  89. {
  90.     char res[MAX_BITS];
  91.     for(int i = 0; i < x.digits; i++)
  92.     {
  93.         res[i] = x.value % 2 + '0';
  94.         x.value = x.value/2;
  95.     }
  96.     for(int i = x.digits - 1; i >= 0; i--)
  97.     {
  98.         cout<<res[i];
  99.     }
  100. }
  101.  
  102. void to_bin_to_file(number x)
  103. {
  104.     char res[MAX_BITS];
  105.     for(int i = 0; i < x.digits; i++)
  106.     {
  107.         res[i] = x.value % 2 + '0';
  108.         x.value = x.value/2;
  109.     }
  110.     for(int i = x.digits - 1; i >= 0; i--)
  111.     {
  112.         fprintf(out,"%c",res[i]);
  113.     }
  114. }
  115.  
  116. long to_decimal(char byte_arr[MAX_BITS], int num)
  117. {
  118.     int i,j;
  119.     long res = 0;
  120.     for(i = num - 1, j = 0; i >= 0; i--, j++)
  121.     {
  122.         if(byte_arr[j] == '1')
  123.         {
  124.             res += power(2,i);
  125.         }
  126.         else if (byte_arr[j] != '0')
  127.         {
  128.             error("Error: Wrong number!");
  129.         }
  130.     }
  131.     return res;
  132. }
  133.  
  134. void print_var(int n)
  135. {
  136.     if(n >= 0 && n < MAX_VARS)
  137.     {
  138.         cout<<vars[n].name<<" = ";
  139.         to_binary(vars[n].num);
  140.         cout<<endl;
  141.     }
  142.     else
  143.         error("Not found variable!");
  144. }
  145.  
  146. void print_all(void)
  147. {
  148.     cout<<"Defined: "<<var_count<<" variables"<<endl;
  149.     for(int i = 0; i < var_count; i++)
  150.     {
  151.         print_var(i);
  152.     }
  153. }
  154.  
  155. int ProcC(void) /*считывание константы и переведение
  156.  ее в десятичный код а также сохранение количества цифр в константе*/
  157. {
  158.     number N;
  159.     int i = 0;
  160.     char res[MAX_BITS];
  161.     int digits = 0;
  162.     while(c == '0' || c == '1')
  163.     {
  164.         res[i++] = c;
  165.         digits++;
  166.         get();
  167.     }
  168.     N.digits = digits;
  169.     N.value = to_decimal(res,digits);
  170.    
  171.     fprintf(out,"%d:\tC(",line);
  172.     to_bin_to_file(N);
  173.     fprintf(out,",@)\n");
  174.     return line++;
  175.     //return N;
  176. }
  177.  
  178. int ProcI(void) /*возвращаем значение переменной если нашел идентификатор и значение константы
  179.                    если нашел константу и ошибка если встретилась переменная */
  180. {
  181.     int i = 0;
  182.     int len;
  183.     char buf[MAX_ID_LEN+1] = {0};
  184.     if(!isletter(c)) //первой должна быть буква
  185.     {
  186.         error("Error: Not a alpha!");
  187.     }
  188.     buf[i++] = c;
  189.     get();
  190.     while((c == '0' || c == '1') && i < MAX_ID_LEN) /*дальнейшее чтение идентификатора при условии того
  191.                                                     что все остальные символы должны быть либо 0 либо 1*/
  192.     {
  193.         buf[i] = c;
  194.         ++i;
  195.         get();
  196.     }
  197.     len = i;
  198.     buf[len] = '\0';
  199.  
  200.     if(len == MAX_ID_LEN && (c == '0' || c == '1')) //проверка на идентификатор большей длины чем задано
  201.     {
  202.         error("Too long identifier!");
  203.     }
  204.     for(i = 0; i < var_count; i++) /* возвращаем значение по уже существующему идентификатору
  205.                                    если он есть в списке переменных*/
  206.     {
  207.         if(strcmp(buf,vars[i].name) == 0)
  208.         {
  209.             break;
  210.         }
  211.     }
  212.     if(i == var_count) // неопределенный идентификатор
  213.     {
  214.         error("Error: Undefined identifier!");
  215.     }
  216.     fprintf(out,"%d:\tV(%s,@)\n",line,buf);;
  217.     return line++;
  218.     //return vars[i].num;
  219. }
  220.  
  221. int ProcL() // взятие адреса переменной и создание переменной если ее нет
  222. {
  223.     char buf[MAX_ID_LEN+1] = { 0 };
  224.     int i = 0;
  225.     int len = 0;
  226.     if(!isletter(c))
  227.     {
  228.         error("In the begining of variable name must be alpha!");
  229.     }
  230.     buf[i++] = c;
  231.     get();
  232.         while((c == '0' || c == '1') && i < MAX_ID_LEN)
  233.         {
  234.           buf[i] = c;
  235.           ++i;
  236.           get();
  237.         }
  238.     len = i;
  239.     buf[len] = '\0';
  240.  
  241.     if(len == MAX_ID_LEN && (c == '0' || c == '1'))
  242.     {
  243.         error("Too long identifier!");
  244.     }
  245.    
  246.  
  247.     for(i = 0; i < var_count; i++) // берем адрес переменной
  248.     {
  249.       if(strcmp(buf,vars[i].name) == 0)
  250.       {
  251.         last_assigned = i; // индекс последней присвоенной переменной
  252.         return &vars[i].num; // возврат этой переменной
  253.       }
  254.     }
  255.    
  256.     strncpy(vars[i].name, buf, len); // если переменной нет создаем переменную с данным именем
  257.     vars[i].name[len] = '\0';
  258.     last_assigned = i; // последняя присвоенная
  259.    
  260.     fprintf(out,"%d:\tV(%s,@)\n",line,buf);;
  261.    
  262.     return line++;
  263.    
  264.     //return &vars[var_count++].num; // возвращаем адрес ячейки где потом будет храниться эта переменная
  265. }
  266. int ProcM(void) // обработка выражений в скобках и инвертирование выражений в скобках
  267. {
  268.     number res;
  269.     //int l = line - 1;
  270.     int op;
  271.     if(c == '~') // если отрицание то инвертируем все цифры в числе
  272.     {
  273.         get();
  274.         //res = ProcM();
  275.         op = ProcM();
  276.         for(int i = 0; i < res.digits; i++)
  277.         {
  278.             res.value ^= 1 << i;
  279.         }
  280.         fprintf(out, "%d:\t~(^%d,@)\n", line, op);
  281.         op = line++;
  282.     }
  283.     else if(c == '(') // обработка выражений в скобках
  284.     {
  285.         get();
  286.         space_skip();
  287.         //res = ProcE(); // содержимое скобок
  288.         op = ProcE();
  289.         space_skip();
  290.         if(c != ')')
  291.         {
  292.             error("Syntax Error: ')' is missing!");
  293.         }
  294.         get();
  295.     }
  296.     else if(isletter(c)) // если первая буква то считываем идентификатор
  297.     {
  298.         //res = ProcI();
  299.         op = ProcI();
  300.     }
  301.     else if(c == '0' || c == '1') // если 0 или 1 то считывается константа
  302.     {
  303.         //res = ProcC();
  304.         op = ProcC();
  305.     }
  306.     else
  307.     error("Syntax Error: Unexpected symbol!");
  308.     //return res;
  309.     return op;
  310. }
  311.  
  312. int ProcT(void)// поразрядное И
  313. {
  314.     number res1, res2;
  315.     //int l = line - 1;
  316.     //res1 = ProcM(); // считываем первое выражение
  317.     int op1 = ProcM();
  318.     space_skip();
  319.     if(c != '&')
  320.     //return res1;
  321.     return op1;
  322.     get();
  323.     space_skip();
  324.     //res2 = ProcT(); // считываем второе выражение
  325.     int op2 = ProcT();
  326.     res1.value &= res2.value; // выполняем поразрядное умножение
  327.     if(res1.digits < res2.digits)
  328.     res1.digits = res2.digits; // возвращаем количество цифр в полученном числе
  329.    
  330.     //fprintf(out,"%d:\t&(^%d,^%d)\n", line, l + 1, line - 1);
  331.     fprintf(out,"%d:\t&(^%d,^%d)\n", line, op1, op2);
  332.     return line++;
  333.     //return res1;
  334. }
  335.  
  336. int ProcE(void)// поразрядное ИЛИ
  337. {
  338.     number res1,res2;
  339.     //int l = line - 1;
  340.     //res1 = ProcT(); // считываем первое выражение
  341.     int op1 = ProcT();
  342.     space_skip();
  343.     if(c != '|') // если не встретиили поразрядное или
  344.       //return res1;
  345.         return op1;
  346.     get();
  347.     space_skip();
  348.     //res2 = ProcE(); // считываем второе выражение
  349.     int op2 = ProcE();
  350.  
  351.     res1.value |= res2.value; // применяем поразрядное или
  352.     if(res1.digits < res2.digits)
  353.     res1.digits = res2.digits; // возвращаем количество цифр в полученном числе
  354.     //fprintf(out,"%d:\t|(^%d,^%d)\n", line, l + 1, line - 1);
  355.     fprintf(out,"%d:\t|(^%d,^%d)\n", line, op1, op2);
  356.     return line++;
  357.     //return res1;
  358. }
  359.  
  360. void ProcS(void)
  361. {
  362.     //int l = line - 1;
  363.     //number* var = ProcL(); // для хранения адреса на значение переменной
  364.     int op1 = ProcL();
  365.     space_skip();
  366.    
  367.     if(c != ':') /*согласно синтаксису присваивание
  368.                  происходит после считывания символов := */
  369.     {
  370.         error("Syntax error: Expected ':=' ");
  371.     }
  372.     get();
  373.     if(c != '=')
  374.     {
  375.         error("Syntax error: Expected ':=' ");
  376.     }
  377.     get();
  378.     space_skip();
  379.     //*var = ProcE();
  380.     int op2 = ProcE();
  381.     space_skip();
  382.     if(c != ';')
  383.     {
  384.         error("Syntax error: Expected ';' ");
  385.     }
  386.     get();
  387.     //fprintf(out,"%d:\t:=(^%d,^%d)\n",line, l + 1, line - 1);
  388.     fprintf(out,"%d:\t:=(^%d,^%d)\n",line, op1, op2);
  389.     line++;
  390. }
  391.  
  392. void Run(void)
  393. {
  394.     get();
  395.     int i = 0;
  396.     for(i = 1; ; i++)
  397.     {
  398.         space_skip();
  399.         if(c == EOF)
  400.             break;
  401.         //printf("Operator %2d: ", i);
  402.         ProcS();                      
  403.         //print_var(last_assigned);
  404.     }
  405.     print_all();
  406. }
  407.  
  408. int _tmain(int argc, _TCHAR* argv[])
  409. {  
  410.     //char filename[100], output[100];
  411.     //cout<<"Input filename for parse: ";
  412.     //cin>>filename;
  413.     //f = fopen("err.txt","rb");
  414.     f = fopen("in.txt","rb");
  415.     out = fopen("out.txt","wb");
  416.     if(!f)
  417.     {
  418.         cout<<"Input File Error!"<<endl;
  419.         return -1;
  420.     }
  421.     if(!out)
  422.     {
  423.         cout<<"Output File Error!"<<endl;
  424.         return -1;
  425.     }
  426.     Run();
  427.     fclose(f);
  428.     fclose(out);
  429.     return 0;
  430. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement