Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct vector{
- int size;
- int max_size;
- int* a;
- } vector_t;
- vector_t* create_vector(){
- vector_t* res = (vector_t*)malloc(sizeof(vector_t));
- res->size=0;
- res->max_size=2;
- res->a = (int*)malloc(res->max_size*sizeof(int));
- return res;
- }
- void free_vector(vector_t* v){
- free(v->a);
- free(v);
- }
- void vector_push(vector_t* v, int x){
- if(v->size==v->max_size){
- v->max_size*=2;
- v->a = realloc(v->a, v->max_size*sizeof(int));
- }
- v->a[v->size] = x;
- v->size++;
- }
- vector_t* vector_mull(vector_t* v1, vector_t* v2){
- vector_t* res = create_vector();
- int i, j;
- for(i=0; i<v1->size; i++)
- for(j=0; j<v2->size; j++){
- vector_push(res, v1->a[i]*v2->a[j]);
- }
- return res;
- }
- void vector_mullby(vector_t* v1, vector_t* v2){
- vector_t* res = vector_mull(v1, v2);
- free(v1->a);
- v1->a = res->a;
- v1->size = res->size;
- v1->max_size = res->max_size;
- free(res);
- }
- void vector_addto(vector_t* v1, vector_t* v2){
- int i;
- for(i=0; i<v2->size; i++){
- if(i<v1->size)
- v1->a[i] += v2->a[i];
- else vector_push(v1, v2->a[i]);
- }
- }
- void vector_subto(vector_t* v1, vector_t* v2){
- int i;
- for(i=0; i<v2->size; i++){
- if(i<v1->size)
- v1->a[i] -= v2->a[i];
- else vector_push(v1, -v2->a[i]);
- }
- }
- void print_vector(vector_t* v){
- int i;
- printf("[");
- for(i=0; i<v->size-1; i++)
- printf("%d, ", v->a[i]);
- printf("%d]\n", v->a[v->size-1]);
- }
- int is_digit(char c){
- return c>='0' && c<='9';
- }
- char* pars_number(char* s, int* x){
- char a[101];
- int i=0;
- while(i<100 && is_digit(s[i])){
- //printf("%c", s[i]);
- a[i] = s[i];
- i++;
- }
- if(i){
- a[i] = '\0';
- *x = atoi(a);
- return s+i;
- }
- return NULL;
- }
- char* pars_vector(char* s, vector_t** result){
- if(*s!='[')
- return NULL;
- s++;
- vector_t* v = create_vector();
- *result = v;
- int x;
- while(s = pars_number(s, &x)){
- //printf("%s\n", s);
- vector_push(v, x);
- if(*s==']')
- return s+1;
- if(*s==',')
- s++;
- else break;
- }
- free_vector(v);
- return NULL;
- }
- char* pars_entity(char* s, vector_t** res){
- printf("ENTITY:%s\n", s);
- if(s[0]=='[')
- return pars_vector(s, res);
- int x;
- s = pars_number(s, &x);
- if(s){
- vector_t* v = create_vector();
- vector_push(v, x);
- *res = v;
- return s;
- }
- return NULL;
- }
- char* pars_add(char* s, vector_t** result);
- char* pars_bracket(char* s, vector_t** v){
- printf("BRACKET:%s\n", s);
- if(*s=='('){
- s = pars_add(s+1, v);
- if(s && *s==')') return s+1;
- return NULL;
- }
- return pars_entity(s, v);
- }
- char* pars_mul(char* s, vector_t** result){
- printf("MUL:%s\n", s);
- vector_t* v;
- s = pars_bracket(s, &v);
- if(s==NULL) return NULL;
- while(*s=='*'){
- s++;
- vector_t* v2;
- s = pars_bracket(s, &v2);
- if(s==NULL){
- free_vector(v);
- return NULL;
- }
- vector_mullby(v, v2);
- free_vector(v2);
- }
- *result = v;
- return s;
- }
- char* pars_add(char* s, vector_t** result){
- printf("ADD:%s\n", s);
- vector_t* v;
- s = pars_mul(s, &v);
- if(s==NULL) return NULL;
- while(*s=='+' || *s=='-'){
- char op = *s;
- s++;
- vector_t* v2;
- s = pars_mul(s, &v2);
- if(s==NULL){
- free_vector(v);
- return NULL;
- }
- if(op=='+')
- vector_addto(v, v2);
- else vector_subto(v, v2);
- free_vector(v2);
- }
- *result = v;
- return s;
- }
- void remove_spaces(char* s){
- char* a = s;
- if(*s!='\0')
- while(1){
- while(*s==' ')
- s++;
- *a = *s;
- if(*s=='\0') return;
- a++;
- s++;
- }
- }
- int main(){
- char s[100];
- strcpy(s, "(1+7)*(2+(3-2)*3)*([1, 2, 3] + [1, 1, 1])");
- remove_spaces(s);
- vector_t* v;
- char* s_left = pars_add(s, &v);
- if(s_left){
- printf("%s\n", s_left);
- print_vector(v);
- free_vector(v);
- } else printf("no pars\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment