0% found this document useful (0 votes)
117 views5 pages

Experiment - 1: Aim: Write A C Program To Design Lexical Analyzer Which Will Identify Keywords, Identifiers, Source Code

The document describes three experiments related to lexical analysis: 1) Designing a lexical analyzer in C to identify tokens in code such as keywords, identifiers, operators, and number of lines. 2) Writing a program to construct a DFA to check the acceptance of an identifier by analyzing character sequences. 3) Writing a lexical analyzer program using flex to recognize keywords and identifiers based on patterns. The program outputs the recognized token.

Uploaded by

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

Experiment - 1: Aim: Write A C Program To Design Lexical Analyzer Which Will Identify Keywords, Identifiers, Source Code

The document describes three experiments related to lexical analysis: 1) Designing a lexical analyzer in C to identify tokens in code such as keywords, identifiers, operators, and number of lines. 2) Writing a program to construct a DFA to check the acceptance of an identifier by analyzing character sequences. 3) Writing a lexical analyzer program using flex to recognize keywords and identifiers based on patterns. The program outputs the recognized token.

Uploaded by

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

Experiment – 1

Aim: Write a C Program to Design Lexical Analyzer which will identify keywords, identifiers,
sentinels, special characters, operators, number of lines in code.
Source Code:
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// Returns 'true' if the character is a DELIMITER.
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);
}
// Returns 'true' if the character is an OPERATOR.
bool isOperator(char ch){
if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '>' || ch == '<' || ch == '=')
return (true);
return (false);
}
// Returns 'true' if the string is a 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);
}
// Returns 'true' if the string is a 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);
}
// Returns 'true' if the string is an 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] !=

1 SAKSHI SINGH
200384
'5'&& str[i] != '6' && str[i] != '7' && str[i] != '8'&& str[i] != '9' || (str[i] == '-' && i > 0))
return (false);
}
return (true);
}
// Returns 'true' if the string is a 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);
}
// Extracts the SUBSTRING.
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);
}
// Parsing the input STRING.
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);
2 SAKSHI SINGH
200384
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;
}
// DRIVER FUNCTION
int main(){
// maximum length of string is 100 here
char str[100] = "int a = 5; ";
parse(str); // calling the parse function
return (0);
}

Output:

3 SAKSHI SINGH
200384
Experiment – 2

Aim: Write a program to construct a DFA to check the acceptance of an identifier.

Source Code:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
int main(){
int initial_state = 1,len,current_state = 1;
char a,b,str[10];
printf("Enter IDENTIFIER : ");
scanf("%s",str);
len = strlen(str);
if(str[0]>= 97 && str[0]<= 122 || str[0] >= 65 && str[0] <= 90){
if (initial_state == 1){
current_state = 2;
}
for (int i=1;i<=len;i++){
if(current_state==2 &&(str[i]>=97 && str[i]<=122 || str[i]>=65 &&
str[i]<=90) || (str[i]>=0
&& str[i]<=9) || (str[i]=='_')){
current_state = 2;
}
}
}
else{
printf("\n String is Rejected.");
}
if( current_state == 2 )
printf("\n The Identifier entered is correct and the final state is: %d",current_state);
}

Output:

4 SAKSHI SINGH
200384
Experiment – 3

Aim: Write a program to construct a DFA to check the acceptance of an identifier.

Source Code:
%{ #include<stdio.h>
%}
LETTER [_a-zA-Z]
DIGIT [0-9]
%%
for|while|int {printf("Recognized keyword is %s\n",yytext);
}
{LETTER}({LETTER}|{DIGIT})* {printf("Recognized identifier is %s\n",yytext);
}
%%
main()
{
printf("Enter any string:");
yylex();
}

yywrap()
{
return 0;
}

Output:

5 SAKSHI SINGH
200384

You might also like