Guest User

Untitled

a guest
Jan 24th, 2015
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.40 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. typedef struct vector{
  7.     int size;
  8.     int max_size;
  9.     int* a;
  10. } vector_t;
  11.  
  12. vector_t* create_vector(){
  13.     vector_t* res = (vector_t*)malloc(sizeof(vector_t));
  14.     res->size=0;
  15.     res->max_size=2;
  16.     res->a = (int*)malloc(res->max_size*sizeof(int));
  17.     return res;
  18. }
  19.  
  20. void free_vector(vector_t* v){
  21.     free(v->a);
  22.     free(v);
  23. }
  24.  
  25. void vector_push(vector_t* v, int x){
  26.     if(v->size==v->max_size){
  27.         v->max_size*=2;
  28.         v->a = realloc(v->a, v->max_size*sizeof(int));
  29.     }
  30.     v->a[v->size] = x;
  31.     v->size++;
  32. }
  33.  
  34. vector_t* vector_mull(vector_t* v1, vector_t* v2){
  35.     vector_t* res = create_vector();
  36.     int i, j;
  37.     for(i=0; i<v1->size; i++)
  38.         for(j=0; j<v2->size; j++){
  39.             vector_push(res, v1->a[i]*v2->a[j]);
  40.         }
  41.     return res;
  42. }
  43.  
  44. void vector_mullby(vector_t* v1, vector_t* v2){
  45.     vector_t* res = vector_mull(v1, v2);
  46.     free(v1->a);
  47.     v1->a = res->a;
  48.     v1->size = res->size;
  49.     v1->max_size = res->max_size;
  50.     free(res);
  51. }
  52.  
  53. void vector_addto(vector_t* v1, vector_t* v2){
  54.     int i;
  55.     for(i=0; i<v2->size; i++){
  56.         if(i<v1->size)
  57.             v1->a[i] += v2->a[i];
  58.         else vector_push(v1, v2->a[i]);
  59.     }
  60. }
  61.  
  62. void vector_subto(vector_t* v1, vector_t* v2){
  63.     int i;
  64.     for(i=0; i<v2->size; i++){
  65.         if(i<v1->size)
  66.             v1->a[i] -= v2->a[i];
  67.         else vector_push(v1, -v2->a[i]);
  68.     }
  69. }
  70.  
  71. void print_vector(vector_t* v){
  72.     int i;
  73.     printf("[");
  74.     for(i=0; i<v->size-1; i++)
  75.         printf("%d, ", v->a[i]);
  76.     printf("%d]\n", v->a[v->size-1]);
  77. }
  78.  
  79. int is_digit(char c){
  80.     return c>='0' && c<='9';
  81. }
  82.  
  83. char* pars_number(char* s, int* x){
  84.     char a[101];
  85.     int i=0;
  86.     while(i<100 && is_digit(s[i])){
  87.         //printf("%c", s[i]);
  88.         a[i] = s[i];
  89.         i++;
  90.     }
  91.     if(i){
  92.         a[i] = '\0';
  93.         *x = atoi(a);
  94.         return s+i;
  95.     }
  96.     return NULL;
  97. }
  98.  
  99. char* pars_vector(char* s, vector_t** result){
  100.     if(*s!='[')
  101.         return NULL;
  102.     s++;
  103.     vector_t* v = create_vector();
  104.     *result = v;
  105.     int x;
  106.     while(s = pars_number(s, &x)){
  107.         //printf("%s\n", s);
  108.         vector_push(v, x);
  109.         if(*s==']')
  110.             return s+1;
  111.         if(*s==',')
  112.             s++;
  113.         else break;
  114.     }
  115.     free_vector(v);
  116.     return NULL;
  117. }
  118.  
  119. char* pars_entity(char* s, vector_t** res){
  120.     printf("ENTITY:%s\n", s);
  121.     if(s[0]=='[')
  122.         return pars_vector(s, res);
  123.     int x;
  124.     s = pars_number(s, &x);
  125.     if(s){
  126.         vector_t* v = create_vector();
  127.         vector_push(v, x);
  128.         *res = v;
  129.         return s;
  130.     }
  131.     return NULL;
  132. }
  133.  
  134. char* pars_add(char* s, vector_t** result);
  135. char* pars_bracket(char* s, vector_t** v){
  136.     printf("BRACKET:%s\n", s);
  137.     if(*s=='('){
  138.         s = pars_add(s+1, v);
  139.         if(s && *s==')') return s+1;
  140.         return NULL;
  141.     }
  142.     return pars_entity(s, v);
  143. }
  144.  
  145. char* pars_mul(char* s, vector_t** result){
  146.     printf("MUL:%s\n", s);
  147.     vector_t* v;
  148.     s = pars_bracket(s, &v);
  149.     if(s==NULL) return NULL;
  150.     while(*s=='*'){
  151.         s++;
  152.         vector_t* v2;
  153.         s = pars_bracket(s, &v2);
  154.         if(s==NULL){
  155.             free_vector(v);
  156.             return NULL;
  157.         }
  158.         vector_mullby(v, v2);
  159.         free_vector(v2);
  160.     }
  161.     *result = v;
  162.     return s;
  163. }
  164.  
  165.  
  166. char* pars_add(char* s, vector_t** result){
  167.     printf("ADD:%s\n", s);
  168.     vector_t* v;
  169.     s = pars_mul(s, &v);
  170.     if(s==NULL) return NULL;
  171.     while(*s=='+' || *s=='-'){
  172.         char op = *s;
  173.         s++;
  174.         vector_t* v2;
  175.         s = pars_mul(s, &v2);
  176.         if(s==NULL){
  177.             free_vector(v);
  178.             return NULL;
  179.         }
  180.         if(op=='+')
  181.             vector_addto(v, v2);
  182.         else vector_subto(v, v2);
  183.         free_vector(v2);
  184.     }
  185.     *result = v;
  186.     return s;
  187. }
  188.  
  189.  
  190. void remove_spaces(char* s){
  191.     char* a = s;
  192.     if(*s!='\0')
  193.     while(1){
  194.         while(*s==' ')
  195.             s++;
  196.         *a = *s;
  197.         if(*s=='\0') return;
  198.         a++;
  199.         s++;
  200.     }
  201. }
  202.  
  203. int main(){
  204.     char s[100];
  205.     strcpy(s, "(1+7)*(2+(3-2)*3)*([1, 2, 3] + [1, 1, 1])");
  206.     remove_spaces(s);
  207.     vector_t* v;
  208.     char* s_left = pars_add(s, &v);
  209.     if(s_left){
  210.         printf("%s\n", s_left);
  211.         print_vector(v);
  212.         free_vector(v);
  213.     } else printf("no pars\n");
  214. }
Advertisement
Add Comment
Please, Sign In to add comment