Advertisement
AlKharkov

Laboratory task 2

Apr 16th, 2024
591
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. // Examples in comments for (var1+(var2*(a-b)))
  5. char lexemes[256][256];  // {"(", "var1", "(", "var2", "*", "(", "a", "-", "b", ")", ")", ")"}
  6. char expression[256]; // "(var1+(var2*(a-b)))"
  7. int indexesOfIdenteficators[256];  // Indexes of lexemes: {1, 3, 6, 8}. lexemes[1] = "var1", lexemes[3] = "var2", lexemes[6] = "a", lexemes[8] = "b"
  8. int lenLexemes = 0, lenExpression, lenIndexesOfIdenteficators = 0;  // Sizes
  9.  
  10.  
  11. int is_alpha(char c) { return ('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z'); }
  12.  
  13.  
  14. int is_digit(char c) { return ('0' <= c && c <= '9'); }
  15.  
  16.  
  17. int is_sign(char c) { return (c == '+' || c == '-' || c == '*' || c == '/'); }
  18.  
  19.  
  20. int find_right_by_identeficator(int l) {  // Return int marked to right border if it can be identificator
  21.     if (is_alpha(expression[l])) {
  22.         for (int i = l + 1; i <= lenExpression; ++i) {
  23.             if (i == lenExpression || !is_alpha(expression[i]) && !is_digit(expression[i]) && expression[i] != '_')  // If i`s symbol incorrect for identeficator
  24.                 return i - 1;
  25.         }
  26.     } return -1;
  27. }
  28.  
  29.  
  30. int find_right_by_number(int l) {  // Return int marked to right border if it can be number
  31.     if (is_digit(expression[l])) {
  32.         for (int i = l + 1; i <= lenExpression; ++i) {
  33.             if (i == lenExpression || !is_digit(expression[i])) return i - 1;
  34.         }
  35.     } return -1;
  36. }
  37.  
  38.  
  39. int is_simple_exp(int l, int r) {  // Is expression[l]...expression[r] a <simpleExp>?
  40.     int ril = find_right_by_identeficator(l), rnl = find_right_by_number(l);
  41.     if (expression[l] == '(' && expression[r] == ')') {  // If simpleExp = (<simpleExp><sign><simpleExp>)
  42.         int signIndex = -1;
  43.         lexemes[lenLexemes][0] = '(';
  44.         lexemes[lenLexemes++][1] = '\0';
  45.         for (int i = l + 1; i < r; ++i) {
  46.             if (is_sign(expression[i])) {
  47.                 signIndex = i;
  48.                 break;
  49.             }
  50.         }
  51.         if (signIndex == -1) return 0;
  52.         int res1 = is_simple_exp(l + 1, signIndex - 1);  // Process first simpleExp
  53.         lexemes[lenLexemes][0] = expression[signIndex];
  54.         lexemes[lenLexemes++][1] = '\0';
  55.         int res2 = is_simple_exp(signIndex + 1, r - 1);  // Process second simpleExp
  56.         lexemes[lenLexemes][0] = ')';
  57.         lexemes[lenLexemes++][1] = '\0';
  58.         return res1 && res2;  // If res1 == 0 then res2 may be not run
  59.     } if (ril == r) {  // If simpleExp = <identeficator>
  60.         for (int i = l; i <= ril; ++i) {  // Add identeficator by index l to ril
  61.             lexemes[lenLexemes][i - l] = expression[i];
  62.         } lexemes[lenLexemes++][ril - l + 1] = '\0';
  63.         indexesOfIdenteficators[lenIndexesOfIdenteficators++] = lenLexemes - 1;
  64.         return 1;
  65.     } if (rnl == r) { // If simpleExp = <numeric value>
  66.         for (int i = l; i <= rnl; ++i) {  // Add number by index l to rnl
  67.             lexemes[lenLexemes][i - l] = expression[i];
  68.         } lexemes[lenLexemes++][rnl - l + 1] = '\0';
  69.         return 1;
  70.     }
  71.     return 0;
  72. }
  73.  
  74.  
  75. void print_lexemes() {  // Technical function
  76.     for (int i = 0; i < lenLexemes; ++i) printf("%s", lexemes[i]);
  77.     putchar('\n');
  78. }
  79.  
  80.  
  81. int main() {
  82.     freopen("input.txt", "r", stdin);
  83.     char identeficators[256][256], numericValues[256][256];
  84.     int N;
  85.     scanf("%d", &N);
  86.     for (int i = 0; i < N; ++i) scanf("%s %s", identeficators[i], numericValues[i]);
  87.     scanf("%s", expression);
  88.     lenExpression = strlen(expression);
  89.  
  90.     if (!is_simple_exp(0, lenExpression - 1)) {
  91.         printf("INCORRECT\n");
  92.         return 0;
  93.     }
  94.     for (int i = 0; i < lenIndexesOfIdenteficators; ++i) {
  95.         for (int j = 0; j < N; ++j) {
  96.             if (!strcmp(lexemes[indexesOfIdenteficators[i]], identeficators[j])) {  // If need replace (names equal)
  97.                 for (int q = 0; q < strlen(numericValues[j]); ++q)  // Replace character by character
  98.                     lexemes[indexesOfIdenteficators[i]][q] = numericValues[j][q];
  99.                 lexemes[indexesOfIdenteficators[i]][strlen(numericValues[j])] = '\0';
  100.             }
  101.         }
  102.     }
  103.  
  104.     print_lexemes();  // Print current replaced expression
  105.     return 0;
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement