cd

PHOTO EMBED

Fri Apr 25 2025 00:10:43 GMT+0000 (Coordinated Universal Time)

Saved by @sem

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

bool is_valid_string(const char *s) {
    int count_a = 0; // To count the number of 'a's
    int count_b = 0; // To count the number of 'b's
    
    // We need to first check that the string has no other characters than 'a' and 'b'
    // and that all 'a's appear before any 'b'.
    bool found_b = false; // Flag to check if we've started encountering 'b's
    
    for (int i = 0; s[i] != '\0'; i++) {
        if (s[i] == 'a') {
            if (found_b) {
                return false; // If 'b' is encountered before 'a', invalid string
            }
            count_a++;
        }
        else if (s[i] == 'b') {
            found_b = true;
            count_b++;
        }
        else {
            return false; // If any character other than 'a' or 'b', invalid string
        }
    }
    
    // For the string to be valid, the number of 'a's must be equal to the number of 'b's
    return count_a == count_b;
}

int main() {
    char input[100];  // Array to hold user input (up to 99 characters)

    // Prompt the user for input
    printf("Enter a string (only 'a' and 'b' characters are allowed): ");
    scanf("%s", input);

    // Check and print the result
    if (is_valid_string(input)) {
        printf("The string '%s' is valid (a^n b^n).\n", input);
    } else {
        printf("The string '%s' is invalid.\n", input);
    }
    
    return 0;
}



#include <stdio.h>
#include <string.h>

int isValidString(char *str) {
    int count_a = 0, count_b = 0;
    int state = 0; // q0

    printf("\nTransition Table\n");
    printf("Current State | Input | Next State\n");
    printf("-------------------------------\n");

    for (int i = 0; str[i] != '\0'; i++) {
        char ch = str[i];

        printf("q%d | %c | ", state, ch);

        if (state == 0) {
            if (ch == 'a') {
                count_a++;
                printf("q0\n");
            } else if (ch == 'b') {
                state = 1;
                count_b++;
                printf("q1\n");
            } else {
                printf("Reject (Invalid character)\n");
                return 0;
            }
        } else if (state == 1) {
            if (ch == 'b') {
                count_b++;
                printf("q1\n");
            } else if (ch == 'a') {
                printf("Reject (a after b)\n");
                return 0;
            } else {
                printf("Reject (Invalid character)\n");
                return 0;
            }
        }
    }

    // Final validation
    if (state == 1 && count_a == count_b && count_a > 0) {
        printf("\nThe string is valid (a^n b^n)\n");
        return 1;
    } else {
        printf("\nThe string is invalid (a^n b^n)\n");
        return 0;
    }
}

int main() {
    char input[100];
    printf("Enter the string: ");
    scanf("%99s", input); // Prevent buffer overflow
    isValidString(input);
    return 0;
}




#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>

bool is_identifier(const char *token) {
    if (!isalpha(token[0]) && token[0] != '_')
        return false;
    for (int i = 1; token[i] != '\0'; i++) {
        if (!isalnum(token[i]) && token[i] != '_')
            return false;
    }
    return true;
}

bool is_constant(const char *token) {
    int i = 0, dot_count = 0;
    if (token[i] == '-' || token[i] == '+') i++;

    if (token[i] == '\0') return false;

    for (; token[i] != '\0'; i++) {
        if (token[i] == '.') {
            if (++dot_count > 1) return false;
        } else if (!isdigit(token[i])) {
            return false;
        }
    }
    return true;
}

bool is_operator(const char *token) {
    const char *operators[] = {"+", "-", "*", "/", "=", "==", "!=", "<", ">", "<=", ">="};
    for (int i = 0; i < sizeof(operators) / sizeof(operators[0]); i++) {
        if (strcmp(token, operators[i]) == 0)
            return true;
    }
    return false;
}

int main() {
    char token[100];
    printf("Enter a token: ");
    scanf("%s", token);

    if (is_operator(token))
        printf("Operator\n");
    else if (is_constant(token))
        printf("Constant\n");
    else if (is_identifier(token))
        printf("Identifier\n");
    else
        printf("Unknown\n");

    return 0;
}



#include <stdio.h>
#include <ctype.h>
#include <string.h>

char keywords[10][10] = {"int", "float", "char", "if", "else", "while", "do", "return", "for", "void"};

int isKeyword(char *word) {
    for (int i = 0; i < 10; i++) {
        if (strcmp(keywords[i], word) == 0)
            return 1;
    }
    return 0;
}

void lexer(char *code) {
    int i = 0;
    char ch, buffer[20];
    int bufferIndex = 0;

    while ((ch = code[i++]) != '\0') {
        if (isalnum(ch)) {
            buffer[bufferIndex++] = ch;
        } else {
            if (bufferIndex != 0) {
                buffer[bufferIndex] = '\0';
                bufferIndex = 0;

                if (isKeyword(buffer))
                    printf("[KEYWORD => %s]\n", buffer);
                else if (isdigit(buffer[0]))
                    printf("[NUMBER => %s]\n", buffer);
                else
                    printf("[IDENTIFIER => %s]\n", buffer);
            }

            if (ch == ' ' || ch == '\n' || ch == '\t')
                continue;

            if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '=')
                printf("[OPERATOR => %c]\n", ch);

            if (ch == '(' || ch == ')' || ch == ';' || ch == '{' || ch == '}')
                printf("[SEPARATOR => %c]\n", ch);
        }
    }
}

int main() {
    char code[1000];
    printf("Enter code (e.g., int a = 10;):\n");
    fgets(code, sizeof(code), stdin);

    printf("\n--- Lexical Tokens ---\n");
    lexer(code);
    return 0;
}



#include <stdio.h>
#include <string.h>

char prod[2][10] = { "S->aA", "A->b" };
char nonTerminals[2][10] = { "S", "A" };
char terminals[3][10] = { "a", "b", "$" };

char table[3][4][15]; // 3 rows (S, A + header), 4 columns (a, b, $, + header)

int getRow(char nt) {
    switch (nt) {
        case 'S': return 1;
        case 'A': return 2;
    }
    return 0;
}

int getCol(char t) {
    switch (t) {
        case 'a': return 1;
        case 'b': return 2;
        case '$': return 3;
    }
    return 0;
}

int main() {
    // Initialize table with empty strings
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 4; j++)
            strcpy(table[i][j], " ");

    // Fill headers
    strcpy(table[0][0], " ");
    strcpy(table[0][1], "a");
    strcpy(table[0][2], "b");
    strcpy(table[0][3], "$");

    strcpy(table[1][0], "S");
    strcpy(table[2][0], "A");

    // Fill table using FIRST sets
    strcpy(table[getRow('S')][getCol('a')], "S->aA");
    strcpy(table[getRow('A')][getCol('b')], "A->b");

    // Print the table
    printf("Predictive Parsing Table:\n");
    printf("-----------------------------------------\n");

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%-12s", table[i][j]);
        }
        printf("\n-----------------------------------------\n");
    }

    return 0;
}




#include <stdio.h>
#define SUCCESS 1
#define FAILED 0

const char *cursor;
char input[64];

int E(), Edash(), T(), Tdash(), F();

int main() {
    printf("Enter the string: ");
    scanf("%s", input);
    cursor = input;

    printf("\nInput Action\n");
    printf("-------------------------------\n");

    if (E() && *cursor == '\0') {
        printf("-------------------------------\n");
        printf("String is successfully parsed\n");
    } else {
        printf("-------------------------------\n");
        printf("Error in parsing String\n");
    }
    return 0;
}

int E() {
    printf("%-15s E -> T E'\n", cursor);
    return T() && Edash();
}

int Edash() {
    if (*cursor == '+') {
        printf("%-15s E' -> + T E'\n", cursor);
        cursor++;
        return T() && Edash();
    }
    printf("%-15s E' -> ε\n", cursor);
    return SUCCESS;
}

int T() {
    printf("%-15s T -> F T'\n", cursor);
    return F() && Tdash();
}

int Tdash() {
    if (*cursor == '*') {
        printf("%-15s T' -> * F T'\n", cursor);
        cursor++;
        return F() && Tdash();
    }
    printf("%-15s T' -> ε\n", cursor);
    return SUCCESS;
}

int F() {
    if (*cursor == '(') {
        printf("%-15s F -> ( E )\n", cursor);
        cursor++;
        if (E() && *cursor == ')') {
            cursor++;
            return SUCCESS;
        }
        return FAILED;
    } else if (*cursor == 'i') {
        printf("%-15s F -> i\n", cursor);
        cursor++;
        return SUCCESS;
    }
    return FAILED;
}





#include <stdio.h>
#include <string.h>

int tempVar = 1;

void newTemp(char *temp) {
    sprintf(temp, "t%d", tempVar++);
}
void replace(char expr[][10], int *n, int i, char *temp) {
    strcpy(expr[i - 1], temp);
    for (int j = i + 2; j < *n; j++)
        strcpy(expr[j - 2], expr[j]);
    *n -= 2;
}
void generateTAC(char input[]) {
    char lhs[10], rhs[100];
    int n = 0;
    // Split into lhs and rhs
    sscanf(input, "%[^=]=%s", lhs, rhs);
    char expr[50][10], temp[10];
    // Tokenize RHS
    for (int i = 0; rhs[i]; i++) {
        char t[2] = {rhs[i], '\0'};
        strcpy(expr[n++], t);
    }
    // First handle * and /
    for (int i = 0; i < n; i++)
        if (!strcmp(expr[i], "*") || !strcmp(expr[i], "/")) {
            newTemp(temp);
            printf("%s = %s %s %s\n", temp, expr[i - 1], expr[i], expr[i + 1]);
            replace(expr, &n, i, temp);
            i = -1;
        }
    // Then handle + and -
    for (int i = 0; i < n; i++)
        if (!strcmp(expr[i], "+") || !strcmp(expr[i], "-")) {
            newTemp(temp);
            printf("%s = %s %s %s\n", temp, expr[i - 1], expr[i], expr[i + 1]);
            replace(expr, &n, i, temp);
            i = -1;
        }
    // Final assignment
    printf("%s = %s\n", lhs, expr[0]);
}
int main() {
    char expr[100];
    printf("Enter expression (e.g., a=b+c*d): ");
    scanf("%s", expr);
    generateTAC(expr);
    return 0;
}





#include <stdio.h>
#include <string.h>
 
char prol[7][10] = { "S", "A", "A", "B", "B", "C", "C" };
char pror[7][10] = { "A", "Bb", "Cd", "aB", "@", "Cc", "@" };
char prod[7][10] = { "S->A", "A->Bb", "A->Cd", "B->aB", "B->@", "C->Cc", "C->@" };
char first[7][10] = { "abcd", "ab", "cd", "a@", "@", "c@", "@" };
char follow[7][10] = { "$", "$", "$", "a$", "b$", "c$", "d$" };
char table[5][6][10];
 
int numr(char c)
{
   switch (c)
   {
      case 'S':
         return 0;
 
      case 'A':
         return 1;
 
      case 'B':
         return 2;
 
      case 'C':
         return 3;
 
      case 'a':
         return 0;
 
      case 'b':
         return 1;
 
      case 'c':
         return 2;
 
      case 'd':
         return 3;
 
      case '$':
         return 4;
   }
 
   return (2);
}
 
int main()
{
   int i, j, k;
 
   for (i = 0; i < 5; i++)
      for (j = 0; j < 6; j++)
         strcpy(table[i][j], " ");
 
   printf("The following grammar is used for Parsing Table:\n");
 
   for (i = 0; i < 7; i++)
      printf("%s\n", prod[i]);
 
   printf("\nPredictive parsing table:\n");
 
   fflush(stdin);
 
   for (i = 0; i < 7; i++)
   {
      k = strlen(first[i]);
      for (j = 0; j < 10; j++)
         if (first[i][j] != '@')
            strcpy(table[numr(prol[i][0]) + 1][numr(first[i][j]) + 1], prod[i]);
   }
 
   for (i = 0; i < 7; i++)
   {
      if (strlen(pror[i]) == 1)
      {
         if (pror[i][0] == '@')
         {
            k = strlen(follow[i]);
            for (j = 0; j < k; j++)
               strcpy(table[numr(prol[i][0]) + 1][numr(follow[i][j]) + 1], prod[i]);
         }
      }
   }
 
   strcpy(table[0][0], " ");
 
   strcpy(table[0][1], "a");
 
   strcpy(table[0][2], "b");
 
   strcpy(table[0][3], "c");
 
   strcpy(table[0][4], "d");
 
   strcpy(table[0][5], "$");
 
   strcpy(table[1][0], "S");
 
   strcpy(table[2][0], "A");
 
   strcpy(table[3][0], "B");
 
   strcpy(table[4][0], "C");
 
   printf("\n--------------------------------------------------------\n");
 
   for (i = 0; i < 5; i++)
      for (j = 0; j < 6; j++)
      {
         printf("%-10s", table[i][j]);
         if (j == 5)
            printf("\n--------------------------------------------------------\n");
      }
}



#include <stdio.h>
#include <string.h>

#define NUM_NON_TERMINALS 5
#define NUM_TERMINALS 6
#define MAX_PRODUCTIONS 8
#define MAX_STRING_LENGTH 15

// Grammar productions
char prod[MAX_PRODUCTIONS][MAX_STRING_LENGTH] = { 
    "E->TE'", 
    "E'->+TE'", 
    "E'->@", 
    "T->FT'", 
    "T'->*FT'", 
    "T'->@", 
    "F->(E)", 
    "F->id" 
};

// Non-terminals and terminals
char nonTerminals[NUM_NON_TERMINALS][MAX_STRING_LENGTH] = { "E", "E'", "T", "T'", "F" };
char terminals[NUM_TERMINALS][MAX_STRING_LENGTH] = { "id", "+", "*", "(", ")", "$" };

// First and Follow sets
char first[MAX_PRODUCTIONS][MAX_STRING_LENGTH] = { "id(", "+", "@", "id(", "*", "@", "(", "id" };
char follow[NUM_NON_TERMINALS][MAX_STRING_LENGTH] = { "$)", "$)", "+$)", "+$)", "+*)$" };

// Parsing table
char table[NUM_NON_TERMINALS + 1][NUM_TERMINALS + 1][MAX_STRING_LENGTH];

int getRow(char c) {
    switch (c) {
        case 'E': return 1;
        case 'e': return 2; // treating E' as e
        case 'T': return 3;
        case 't': return 4; // T' as t
        case 'F': return 5;
        default: return 0;
    }
}

int getCol(char *sym) {
    for (int i = 0; i < NUM_TERMINALS; i++) {
        if (strcmp(terminals[i], sym) == 0)
            return i + 1;
    }
    return 0;
}

void fillParsingTable() {
    // Initialize table with empty strings
    for (int i = 0; i <= NUM_NON_TERMINALS; i++) {
        for (int j = 0; j <= NUM_TERMINALS; j++) {
            strcpy(table[i][j], "");
        }
    }

    // Header row
    strcpy(table[0][0], " ");
    for (int i = 0; i < NUM_TERMINALS; i++)
        strcpy(table[0][i + 1], terminals[i]);

    // Left column (non-terminals)
    for (int i = 0; i < NUM_NON_TERMINALS; i++)
        strcpy(table[i + 1][0], nonTerminals[i]);

    // Fill productions in the table
    for (int i = 0; i < MAX_PRODUCTIONS; i++) {
        char nt = prod[i][0];  // Non-terminal in production
        int row = getRow(nt);

        // Iterate through the first set of the production
        for (int j = 0; j < strlen(first[i]); j++) {
            char ch = first[i][j];
            if (ch == '@') {
                // Epsilon production, fill the table using the Follow set
                for (int k = 0; k < strlen(follow[row - 1]); k++) {
                    char fch = follow[row - 1][k];
                    char sym[2] = { fch, '\0' };
                    int col = getCol(sym);
                    if (strcmp(table[row][col], "") == 0)  // If cell is empty, fill it
                        strcpy(table[row][col], prod[i]);
                }
            } else {
                char sym[3] = { ch, '\0', '\0' };  // Increase size to 3 to hold 'i' and 'd' for "id"
                if (ch == 'i') strcpy(sym, "id"); // map 'i' to "id"
                int col = getCol(sym);
                if (strcmp(table[row][col], "") == 0)  // If cell is empty, fill it
                    strcpy(table[row][col], prod[i]);
            }
        }
    }
}

void printTable() {
    printf("-------------------------------------------------------------\n");
    printf("            id          +           *           (           )           $           \n");
    printf("-------------------------------------------------------------\n");

    for (int i = 0; i <= NUM_NON_TERMINALS; i++) {
        for (int j = 0; j <= NUM_TERMINALS; j++) {
            if (strcmp(table[i][j], "") != 0)  // Only print non-empty cells
                printf("%-12s", table[i][j]);
            else
                printf("%-12s", " ");  // Print space for empty cells
        }
        printf("\n-------------------------------------------------------------\n");
    }
}

int main() {
    fillParsingTable();
    printTable();

    return 0;
}


content_copyCOPY