Рубрики

C-программа для обнаружения токенов в C-программе

Как известно, Lexical Analysis — это первая фаза компилятора, также известная как сканер. Он преобразует входную программу в последовательность токенов.
Программа AC состоит из различных токенов, и токен является ключевым словом, идентификатором, константой, строковым литералом или символом.

Например:

1) Keywords: 
Examples- for, while, if etc.

2) Identifier
Examples- Variable name, function name etc.

3) Operators:
Examples- '+', '++', '-' etc.

4) Separators:
Examples- ', ' ';' etc

Ниже приведена программа на C для печати всех ключевых слов, литералов, допустимых идентификаторов, недействительных идентификаторов, целых чисел, действительных чисел в данной программе на C:

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

  
// Возвращает true, если символ - РАЗДЕЛИТЕЛЬ.

bool isDelimiter(char ch)

{

    if (ch == ' ' || ch == '+' || ch == '-' || ch == '*' || 

        ch == '/' || ch == ',' || ch == ';' || ch == '>' || 

        ch == '<' || ch == '=' || ch == '(' || ch == ')' || 

        ch == '[' || ch == ']' || ch == '{' || ch == '}')

        return (true);

    return (false);

}

  
// Возвращает true, если символ является ОПЕРАТОРОМ.

bool isOperator(char ch)

{

    if (ch == '+' || ch == '-' || ch == '*' || 

        ch == '/' || ch == '>' || ch == '<' || 

        ch == '=')

        return (true);

    return (false);

}

  
// Возвращает true, если строка является VALID IDENTIFIER.

bool validIdentifier(char* str)

{

    if (str[0] == '0' || str[0] == '1' || str[0] == '2' ||

        str[0] == '3' || str[0] == '4' || str[0] == '5' || 

        str[0] == '6' || str[0] == '7' || str[0] == '8' || 

        str[0] == '9' || isDelimiter(str[0]) == true)

        return (false);

    return (true);

}

  
// Возвращает true, если строка является KEYWORD.

bool isKeyword(char* str)

{

    if (!strcmp(str, "if") || !strcmp(str, "else") ||

        !strcmp(str, "while") || !strcmp(str, "do") || 

        !strcmp(str, "break") || 

         !strcmp(str, "continue") || !strcmp(str, "int")

        || !strcmp(str, "double") || !strcmp(str, "float")

        || !strcmp(str, "return") || !strcmp(str, "char")

        || !strcmp(str, "case") || !strcmp(str, "char")

        || !strcmp(str, "sizeof") || !strcmp(str, "long")

        || !strcmp(str, "short") || !strcmp(str, "typedef")

        || !strcmp(str, "switch") || !strcmp(str, "unsigned")

        || !strcmp(str, "void") || !strcmp(str, "static")

        || !strcmp(str, "struct") || !strcmp(str, "goto"))

        return (true);

    return (false);

}

  
// Возвращает true, если строка является INTEGER.

bool isInteger(char* str)

{

    int i, len = strlen(str);

  

    if (len == 0)

        return (false);

    for (i = 0; i < len; i++) {

        if (str[i] != '0' && str[i] != '1' && str[i] != '2'

            && str[i] != '3' && str[i] != '4' && str[i] != '5'

            && str[i] != '6' && str[i] != '7' && str[i] != '8'

            && str[i] != '9' || (str[i] == '-' && i > 0))

            return (false);

    }

    return (true);

}

  
// Возвращает true, если строка имеет значение REAL NUMBER.

bool isRealNumber(char* str)

{

    int i, len = strlen(str);

    bool hasDecimal = false;

  

    if (len == 0)

        return (false);

    for (i = 0; i < len; i++) {

        if (str[i] != '0' && str[i] != '1' && str[i] != '2'

            && str[i] != '3' && str[i] != '4' && str[i] != '5'

            && str[i] != '6' && str[i] != '7' && str[i] != '8'

            && str[i] != '9' && str[i] != '.' || 

            (str[i] == '-' && i > 0))

            return (false);

        if (str[i] == '.')

            hasDecimal = true;

    }

    return (hasDecimal);

}

  
// Извлекает СУБСТРИНГ.

char* subString(char* str, int left, int right)

{

    int i;

    char* subStr = (char*)malloc(

                  sizeof(char) * (right - left + 2));

  

    for (i = left; i <= right; i++)

        subStr[i - left] = str[i];

    subStr[right - left + 1] = '\0';

    return (subStr);

}

  
// Разбор входной строки.

void parse(char* str)

{

    int left = 0, right = 0;

    int len = strlen(str);

  

    while (right <= len && left <= right) {

        if (isDelimiter(str[right]) == false)

            right++;

  

        if (isDelimiter(str[right]) == true && left == right) {

            if (isOperator(str[right]) == true)

                printf("'%c' IS AN OPERATOR\n", str[right]);

  

            right++;

            left = right;

        } else if (isDelimiter(str[right]) == true && left != right

                   || (right == len && left != right)) {

            char* subStr = subString(str, left, right - 1);

  

            if (isKeyword(subStr) == true)

                printf("'%s' IS A KEYWORD\n", subStr);

  

            else if (isInteger(subStr) == true)

                printf("'%s' IS AN INTEGER\n", subStr);

  

            else if (isRealNumber(subStr) == true)

                printf("'%s' IS A REAL NUMBER\n", subStr);

  

            else if (validIdentifier(subStr) == true

                     && isDelimiter(str[right - 1]) == false)

                printf("'%s' IS A VALID IDENTIFIER\n", subStr);

  

            else if (validIdentifier(subStr) == false

                     && isDelimiter(str[right - 1]) == false)

                printf("'%s' IS NOT A VALID IDENTIFIER\n", subStr);

            left = right;

        }

    }

    return;

}

  
// ФУНКЦИЯ ВОДИТЕЛЯ

int main()

{

     // максимальная длина строки здесь 100

    char str[100] = "int a = b + 1c; ";

  

    parse(str); // вызов функции разбора

  

    return (0);

}

Выход:

'int' IS A KEYWORD
'a' IS A VALID IDENTIFIER
'=' IS AN OPERATOR
'b' IS A VALID IDENTIFIER
'+' IS AN OPERATOR
'1c' IS NOT A VALID IDENTIFIER

Эта статья предоставлена МАЖАР ИМАМ ХАН . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

C-программа для обнаружения токенов в C-программе

0.00 (0%) 0 votes