Compiler Design Programs Collection

Even Binary Number DFA

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

int main() {
    char input[100];
    int state = 0;

    printf("Enter a binary number: ");
    scanf("%s", input);

    int len = strlen(input);
    for (int i = 0; i < len; i++) {
        char symbol = input[i];
        if (symbol != '0' && symbol != '1') {
            printf("Invalid input! Only binary digits allowed.\n");
            return 1;
        }

        if (symbol == '0')
            state = 1;
        else
            state = 2;
    }

    if (state == 1)
        printf("Accepted: Even binary number.\n");
    else
        printf("Rejected: Not an even binary number.\n");

    return 0;
}
Sample Input/Output:
Enter a binary number: 1010
Accepted: Even binary number.
Enter a binary number: 111
Rejected: Not an even binary number.

Odd Binary Number DFA

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

int main() {
    char input[100];
    int state = 0;

    printf("Enter a binary number: ");
    scanf("%s", input);

    int len = strlen(input);
    for (int i = 0; i < len; i++) {
        char symbol = input[i];
        if (symbol != '0' && symbol != '1') {
            printf("Invalid input! Only binary digits allowed.\n");
            return 1;
        }

        if (symbol == '0')
            state = 1;
        else
            state = 2;
    }

    if (state == 2)
        printf("Accepted: Odd binary number.\n");
    else
        printf("Rejected: Not an odd binary number.\n");

    return 0;
}
Sample Input/Output:
Enter a binary number: 101
Accepted: Odd binary number.
Enter a binary number: 10010
Rejected: Not an odd binary number.

Divisible by 5 DFA

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

int main() {
    char input[100];
    int state = 0;

    printf("Enter a binary number: ");
    scanf("%s", input);

    int len = strlen(input);
    for (int i = 0; i < len; i++) {
        char symbol = input[i];

        if (symbol != '0' && symbol != '1') {
            printf("Invalid input! Only binary digits allowed.\n");
            return 1;
        }

        switch(state) {
            case 0:
                state = (symbol == '0') ? 0 : 1;
                break;
            case 1:
                state = (symbol == '0') ? 2 : 3;
                break;
            case 2:
                state = (symbol == '0') ? 4 : 0;
                break;
            case 3:
                state = (symbol == '0') ? 1 : 2;
                break;
            case 4:
                state = (symbol == '0') ? 3 : 4;
                break;
        }
    }

    if (state == 0)
        printf("Accepted: Binary number divisible by 5.\n");
    else
        printf("Rejected: Not divisible by 5.\n");

    return 0;
}

Divisible by 3 DFA

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

int main() {
    char input[100];
    int state = 0;

    printf("Enter a binary number: ");
    scanf("%s", input);

    int len = strlen(input);

    for (int i = 0; i < len; i++) {
        char symbol = input[i];

        if (symbol != '0' && symbol != '1') {
            printf("Invalid input! Only binary digits allowed.\n");
            return 1;
        }

        switch(state) {
            case 0:
                state = (symbol == '0') ? 0 : 1;
                break;
            case 1:
                state = (symbol == '0') ? 2 : 0;
                break;
            case 2:
                state = (symbol == '0') ? 1 : 2;
                break;
        }
    }

    if (state == 0)
        printf("Accepted: Binary number divisible by 3.\n");
    else
        printf("Rejected: Not divisible by 3.\n");

    return 0;
}

String Ending with '00' DFA

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

int main() {
    char input[100];
    int state = 0;

    printf("Enter a binary string: ");
    scanf("%s", input);

    int len = strlen(input);
    for (int i = 0; i < len; i++) {
        char symbol = input[i];

        if (symbol != '0' && symbol != '1') {
            printf("Invalid input! Only binary digits allowed.\n");
            return 1;
        }

        switch(state) {
            case 0:
                state = (symbol == '0') ? 1 : 2;
                break;
            case 1:
                state = (symbol == '0') ? 3 : 2;
                break;
            case 2:
                state = (symbol == '0') ? 1 : 2;
                break;
            case 3:
                state = (symbol == '0') ? 3 : 2;
                break;
        }
    }

    if (state == 3)
        printf("Accepted: String ends with '00'.\n");
    else
        printf("Rejected: String does not end with '00'.\n");

    return 0;
}

String Ending with '11' DFA

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

int main() {
    char input[100];
    int state = 0;

    printf("Enter a binary string: ");
    scanf("%s", input);

    int len = strlen(input);
    for (int i = 0; i < len; i++) {
        char symbol = input[i];

        if (symbol != '0' && symbol != '1') {
            printf("Invalid input! Only binary digits allowed.\n");
            return 1;
        }

        switch(state) {
            case 0:
                state = (symbol == '0') ? 2 : 1;
                break;
            case 1:
                state = (symbol == '0') ? 2 : 3;
                break;
            case 2:
                state = (symbol == '0') ? 2 : 1;
                break;
            case 3:
                state = (symbol == '0') ? 2 : 3;
                break;
        }
    }

    if (state == 3)
        printf("Accepted: String ends with '11'.\n");
    else
        printf("Rejected: String does not end with '11'.\n");

    return 0;
}

Lexical Analyzer

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

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

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

int main() {
    char input[100];
    char token[100];
    int i = 0, j = 0;

    printf("Enter a line of code: ");
    fgets(input, sizeof(input), stdin);

    while (input[i] != '\0') {
        if (isalnum(input[i])) {
            token[j++] = input[i];
        } else {
            if (j != 0) {
                token[j] = '\0';
                j = 0;

                if (isKeyword(token))
                    printf("[Keyword: %s]\n", token);
                else if (isdigit(token[0]))
                    printf("[Number: %s]\n", token);
                else
                    printf("[Identifier: %s]\n", token);
            }

            if (input[i] == ' ' || input[i] == '\n') {
                // skip
            } else if (ispunct(input[i])) {
                printf("[Symbol: %c]\n", input[i]);
            }
        }
        i++;
    }

    return 0;
}

First Set Calculator

#include <stdio.h>

#define MAX 10

int main() {
    int i, nNT, nT;
    char NT[MAX], T[MAX], prod[MAX][MAX], first[MAX];

    printf("Number of non-terminals: ");
    scanf("%d", &nNT);
    printf("Non-terminals:\n");
    for (i = 0; i < nNT; i++)
        scanf(" %c", &NT[i]);

    printf("Number of terminals: ");
    scanf("%d", &nT);
    printf("Terminals:\n");
    for (i = 0; i < nT; i++)
        scanf(" %c", &T[i]);

    printf("Enter production for each non-terminal:\n");
    for (i = 0; i < nNT; i++) {
        printf("%c → ", NT[i]);
        scanf("%s", prod[i]);
    }

    for (i = 0; i < nNT; i++)
        first[i] = prod[i][1];

    printf("\nFirst Sets:\n");
    for (i = 0; i < nNT; i++)
        printf("First(%c) = { %c }\n", NT[i], first[i]);

    return 0;
}
Sample Input/Output:
Number of non-terminals: 2
Non-terminals:
S
A
Number of terminals: 3
Terminals:
a
b
{
Enter production for each non-terminal:
S → Aa$
A → b$

String Identifier Validator

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

void main() {
    char str[50];
    int i, flag = 1;

    printf("Enter the string: ");
    scanf("%s", str); 

    if (!(isalpha(str[0]) || str[0] == '_')) {
        flag = 0;
    } else {
        for (i = 1; str[i] != '\0'; i++) {
            if (!(isalnum(str[i]) || str[i] == '_')) {
                flag = 0;
                break;
            }
        }
    }

    if (flag)
        printf("Identifier\n");
    else
        printf("Not Identifier\n");
}

Keyword Checker

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

int main() {
    char keywords[5][10] = {"printf", "scanf", "if", "else", "break"};
    char str[10];
    int i, flag = 0;

    printf("Enter the string: ");
    scanf("%s", str);

    for (i = 0; i < 5; i++) {
        if (strcmp(str, keywords[i]) == 0) {
            flag = 1;
            break;
        }
    }

    if (flag)
        printf("Keyword\n");
    else
        printf("String\n");

    return 0;
}

Left Recursion Remover

#include <stdio.h>

int main() {
    char nt, p1[20], p2[20];
    int i;

    printf("Enter non-terminal: ");
    scanf(" %c", &nt);

    printf("Enter first production: ");
    scanf("%s", p1);

    printf("Enter second production: ");
    scanf("%s", p2);

    if (p1[0] == nt) {
        printf("\nLeft recursion exists!\n");
        printf("After removing left recursion:\n");
        printf("%c -> %s%c'\n", nt, p2, nt);
        printf("%c' -> ", nt);
        for (i = 1; p1[i]; i++) printf("%c", p1[i]);
        printf("%c' | ε\n", nt);
    }
    else if (p2[0] == nt) {
        printf("\nLeft recursion exists!\n");
        printf("After removing left recursion:\n");
        printf("%c -> %s%c'\n", nt, p1, nt);
        printf("%c' -> ", nt);
        for (i = 1; p2[i]; i++) printf("%c", p2[i]);
        printf("%c' | ε\n", nt);
    }
    else {
        printf("\nNo left recursion.\n");
        printf("Grammar remains same: %c -> %s | %s\n", nt, p1, p2);
    }

    return 0;
}
Sample Input/Output:
Enter non-terminal: A
Enter first production: Aa
Enter second production: b

Left recursion exists!
After removing left recursion:
A -> bA'
A' -> aA' | ε

Expression Parser with Reduction

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

int main() {
    char expr[100], tok[100];
    int i = 0, j = 0;

    printf("Enter expression: ");
    fgets(expr, sizeof(expr), stdin);

    while (expr[i] != '\0') {
        if (isdigit(expr[i])) {
            tok[j++] = '6';
            while (isdigit(expr[i])) i++;
            i--;
        }
        else if (expr[i] == '+' || expr[i] == '-') tok[j++] = '2';
        else if (expr[i] == '*') tok[j++] = '3';
        else if (expr[i] == '(') tok[j++] = '4';
        else if (expr[i] == ')') tok[j++] = '5';
        i++;
    }
    tok[j] = '\0';

    printf("\nTokenized: %s\n", tok);

    int changed;
    do {
        changed = 0;
        for (i = 0; tok[i + 2]; i++) {
            if ((tok[i] == '6' && (tok[i+1] == '2' || tok[i+1] == '3') && tok[i+2] == '6') ||
                (tok[i] == '4' && tok[i+1] == '6' && tok[i+2] == '5')) {
                tok[i] = '6';
                strcpy(&tok[i + 1], &tok[i + 3]);
                printf("Reduced:   %s\n", tok);
                changed = 1;
                break;
            }
        }
    } while (changed);

    if (strcmp(tok, "6") == 0)
        printf("\n✅ Valid Expression\n");
    else
        printf("\n❌ Invalid Expression\n");

    return 0;
}