Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- // Examples in comments for (var1+(var2*(a-b)))
- char lexemes[256][256]; // {"(", "var1", "(", "var2", "*", "(", "a", "-", "b", ")", ")", ")"}
- char expression[256]; // "(var1+(var2*(a-b)))"
- int indexesOfIdenteficators[256]; // Indexes of lexemes: {1, 3, 6, 8}. lexemes[1] = "var1", lexemes[3] = "var2", lexemes[6] = "a", lexemes[8] = "b"
- int lenLexemes = 0, lenExpression, lenIndexesOfIdenteficators = 0; // Sizes
- int is_alpha(char c) { return ('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z'); }
- int is_digit(char c) { return ('0' <= c && c <= '9'); }
- int is_sign(char c) { return (c == '+' || c == '-' || c == '*' || c == '/'); }
- int find_right_by_identeficator(int l) { // Return int marked to right border if it can be identificator
- if (is_alpha(expression[l])) {
- for (int i = l + 1; i <= lenExpression; ++i) {
- if (i == lenExpression || !is_alpha(expression[i]) && !is_digit(expression[i]) && expression[i] != '_') // If i`s symbol incorrect for identeficator
- return i - 1;
- }
- } return -1;
- }
- int find_right_by_number(int l) { // Return int marked to right border if it can be number
- if (is_digit(expression[l])) {
- for (int i = l + 1; i <= lenExpression; ++i) {
- if (i == lenExpression || !is_digit(expression[i])) return i - 1;
- }
- } return -1;
- }
- int is_simple_exp(int l, int r) { // Is expression[l]...expression[r] a <simpleExp>?
- int ril = find_right_by_identeficator(l), rnl = find_right_by_number(l);
- if (expression[l] == '(' && expression[r] == ')') { // If simpleExp = (<simpleExp><sign><simpleExp>)
- int signIndex = -1;
- lexemes[lenLexemes][0] = '(';
- lexemes[lenLexemes++][1] = '\0';
- for (int i = l + 1; i < r; ++i) {
- if (is_sign(expression[i])) {
- signIndex = i;
- break;
- }
- }
- if (signIndex == -1) return 0;
- int res1 = is_simple_exp(l + 1, signIndex - 1); // Process first simpleExp
- lexemes[lenLexemes][0] = expression[signIndex];
- lexemes[lenLexemes++][1] = '\0';
- int res2 = is_simple_exp(signIndex + 1, r - 1); // Process second simpleExp
- lexemes[lenLexemes][0] = ')';
- lexemes[lenLexemes++][1] = '\0';
- return res1 && res2; // If res1 == 0 then res2 may be not run
- } if (ril == r) { // If simpleExp = <identeficator>
- for (int i = l; i <= ril; ++i) { // Add identeficator by index l to ril
- lexemes[lenLexemes][i - l] = expression[i];
- } lexemes[lenLexemes++][ril - l + 1] = '\0';
- indexesOfIdenteficators[lenIndexesOfIdenteficators++] = lenLexemes - 1;
- return 1;
- } if (rnl == r) { // If simpleExp = <numeric value>
- for (int i = l; i <= rnl; ++i) { // Add number by index l to rnl
- lexemes[lenLexemes][i - l] = expression[i];
- } lexemes[lenLexemes++][rnl - l + 1] = '\0';
- return 1;
- }
- return 0;
- }
- void print_lexemes() { // Technical function
- for (int i = 0; i < lenLexemes; ++i) printf("%s", lexemes[i]);
- putchar('\n');
- }
- int main() {
- freopen("input.txt", "r", stdin);
- char identeficators[256][256], numericValues[256][256];
- int N;
- scanf("%d", &N);
- for (int i = 0; i < N; ++i) scanf("%s %s", identeficators[i], numericValues[i]);
- scanf("%s", expression);
- lenExpression = strlen(expression);
- if (!is_simple_exp(0, lenExpression - 1)) {
- printf("INCORRECT\n");
- return 0;
- }
- for (int i = 0; i < lenIndexesOfIdenteficators; ++i) {
- for (int j = 0; j < N; ++j) {
- if (!strcmp(lexemes[indexesOfIdenteficators[i]], identeficators[j])) { // If need replace (names equal)
- for (int q = 0; q < strlen(numericValues[j]); ++q) // Replace character by character
- lexemes[indexesOfIdenteficators[i]][q] = numericValues[j][q];
- lexemes[indexesOfIdenteficators[i]][strlen(numericValues[j])] = '\0';
- }
- }
- }
- print_lexemes(); // Print current replaced expression
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement