0% found this document useful (0 votes)
19 views4 pages

Praneet 43 Spccexp 1

This C program defines several functions to classify tokens in a string as operators, keywords, integers, real numbers, or valid/invalid identifiers. It takes a user-input string, counts the number of digits, and uses a parsing function to identify each token, print the classification, and count the total tokens.

Uploaded by

Ganesh Panigrahi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as ODT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
19 views4 pages

Praneet 43 Spccexp 1

This C program defines several functions to classify tokens in a string as operators, keywords, integers, real numbers, or valid/invalid identifiers. It takes a user-input string, counts the number of digits, and uses a parsing function to identify each token, print the classification, and count the total tokens.

Uploaded by

Ganesh Panigrahi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as ODT, PDF, TXT or read online on Scribd
You are on page 1/ 4

SPCC EXP 1

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

#define true 1
#define false 0
typedef int bool;

bool isDelimiter(char ch) {


if (ch == ' ' || ch == '+' || ch == '-' || ch == '*' ||
ch == '/' || ch == ';' || ch == '=' || ch == '(' ||
ch == ')' || ch == '{' || ch == '}')
return (true);
return (false);
}

bool isOperator(char ch) {


if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '=')
return (true);
return (false);
}

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);
}

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, "long") || !strcmp(str, "short") ||
!strcmp(str, "switch") || !strcmp(str, "void"))
return (true);
return (false);
}

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);
}

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);
int tokenCount = 0; // Moved declaration here
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]);
tokenCount++;
}
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);
tokenCount++;
} else if (isInteger(subStr) == true) {
printf("'%s' IS AN INTEGER\n", subStr);
tokenCount++;
} else if (isRealNumber(subStr) == true) {
printf("'%s' IS A REAL NUMBER\n", subStr);
tokenCount++;
} else if (validIdentifier(subStr) == true &&
isDelimiter(str[right - 1]) == false) {
printf("'%s' IS A VALID IDENTIFIER\n", subStr);
tokenCount++;
} else if (validIdentifier(subStr) == false &&
isDelimiter(str[right - 1]) == false) {
printf("'%s' IS NOT A VALID IDENTIFIER\n", subStr);
}
left = right;
}
}

printf("Total number of tokens: %d\n", tokenCount);


return;
}

int main() {
char str[1000];
printf("Enter the String: \n");
gets(str);
int c = 0, i;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] >= '0' && str[i] <= '9')
c++;
}printf("\nNumber of digits in string = %d", c);
parse(str);
return (0);}
OUTPUT:

You might also like