===== Page 6 =====
Q1. Design a LEX Code to count the number of lines, space, tab-meta character, and rest of characters in each Input pattern.
Solution:
% {
#include<stdio.h>
int line = 0 , space = 0 , tab = 0 , meta = 0 , other = 0;
% }
%%
"\n" {line++;}
" " {space++;}
"\t" {tab++;}
[\^\$\%\*\+\^\&\()\{}\}[]\v\"] {meta++;}
. {other++;}
%%
int main(){
yylex();
printf("Line:%d\n",line);
printf("Space:%d\n",space);
printf("Tab:%d\n",tab);
printf("Meta:%d\n",meta);
printf("Other:%d\n",other);
return 0;
}
int yywrap(){
return 1;
}
Output:
int main(){
cout << "hello";
}
Line:3
Space:3
Tab:1
Meta:7
Other:18
===== Page 7 =====
Q2. Design a LEX Code to identify and print valid Identifier of C/C++ in given Input pattern.
Solution:
% {
#include<stdio.h>
% }
%%
int|float|return|void|if|else { }
[a-zA-Z_]+[a-zA-Z_0-9]* { printf("Identifier:%s\n",yytext);}
[0-9]+[a-zA-Z_]*
. { }
%%
int main(){
yylex();
return 0;
}
int yywrap(){
return 1;
}
Output:
var_43
Identifier:var_43
num
Identifier:num
temp
Identifier:temp
6
===== Page 8 =====
Q3. Design a LEX Code to identify and print integer and float value in given Input pattern.
Solution:
% {
#include<stdio.h>
% }
%%
[-]?[0-9]+"."[0-9]+ {printf("Float:%s\n",yytext);}
[-]?[0-9]+ {printf("Int:%s\n",yytext);}
[0-9]*[a-zA-z]*[0-9]* {printf("Nothing");}
. {}
%%
int main(){
yylex();
return 0;
}
int yywrap(){
return 1;
}
Output:
1234
Int:1234
123.54
Float:123.54
45_frr
Nothing
===== Page 9 =====
Q4. Design a LEX Code for Tokenizing (Identify and print OPERATORS, SEPERATORS, KEYWORDS, IDENTIFERS) in the C-fragment:
Solution:
% {
#include<stdio.h>
}
% }
KEYWORDS "int"|"float"|"return"|"if"|"else"|"for"|"while"
OPERATORS [+|\-|*|/|^|<|>|&|!|%]
SEPERATORS [;|\\|(|)|\\|\\|']
%%
{ KEYWORDS } {printf("Keyword: %s\n", yytext); }
{ OPERATORS } {printf("Operators: %s\n", yytext); }
{ SEPERATORS } {printf("Seperators: %s\n", yytext); }
[a-zA-Z_]+[a-zA-Z0-9_]* {printf("Id: %s\n", yytext); }
. {}
%%
int main(){
yylex();
return 0;
}
int yywrap(){
return 1;
}
OR
%{
#include <stdio.h>
%}
%option noyywrap
KEYWORDS "int"|"float"|"return"|"if"|"else"|"for"|"while"
OPERATORS [+\-*/^<>=&|!%]=?|&&|\|\||==|!=
SEPARATORS [;,(){}"\[\]]
IDENTIFIER [a-zA-Z_][a-zA-Z0-9_]*
%%
{KEYWORDS} { printf("Keyword: %s\n", yytext); }
{OPERATORS} { printf("Operator: %s\n", yytext); }
{SEPARATORS} { printf("Separator: %s\n", yytext); }
{IDENTIFIER} { printf("Identifier: %s\n", yytext); }
[ \t\n] ; // Ignore whitespace
. ; // Ignore any other character
%%
int main() {
yylex();
return 0;
}
Output:
int
Keyword: int
+
Operators: +
;
Seperators: ;
var_23
Id: var_23
===== Page 10 =====
Q5. Design a LEX Code to count and print the number of total characters, words, white spaces in given ‘Input.txt’ file.
Solution:
% {
#include<stdio.h>
int word =0, char_len=0, space = 0;
% }
%%
[a-zA-Z0-9]+ {
word++;
char_len += yyleng;}
[ \n\t] {space++;}
%%
int main(){
FILE *file = fopen("z-5-6.txt", "r");
if(!file) {printf("no file"); return 1;}
}
yyin = file;
yylex();
printf("word:%d\n",word);
printf("char:%d\n",char_len);
printf("space:%d\n",space);
fclose(file);
return 0;
}
int yywrap() {
return 1;
}
Output:
word:7
char:46
space:48
===== Page 11 =====
Q6. Design a LEX Code to replace white spaces of ‘Input.txt’ file by a single blank character into ‘Output.txt’ file
Solution:
% {
#include <stdio.h>
#include <stdlib.h>
FILE *out;
% }
%%
[ \n\t]+ { fprintf(out, " ");
// Replace multiple spaces, tabs, or newlines with a single space
}
. { fprintf(out, "%s", yytext); } // Write other characters as they are
%%
int main() {
// Open input and output files
yyin = fopen("z-5-6.txt", "r");
if (!yyin) {
perror("Error opening input.txt");
return 1;
}
out = fopen("output.txt", "w");
if (!out) {
perror("Error creating output.txt");
fclose(yyin);
return 1;
}
yylex();
fclose(yyin);
fclose(out);
printf("Whitespace replaced successfully. Check output.txt\n");
return 0;
}
int yywrap(){
return 1;
}
Output:
input : hello my name is justin
jhdfhejdjjdejdjehd ehidhehdhd
output :
hello my name is justin jhdfhejdjjdejdjehd ehidhehdhd
10
===== Page 12 =====
Q7. Design a LEX Code to remove the comments from any C-Program given at run-time and store into ‘out.c’ file.
Solution:
% {
#include <stdio.h>
#include <stdlib.h>
FILE *out;
% }
%%
"//".* { }
"/\\*([^*]|\\*+[^*/])*\\*+\\/" { }
. { fprintf(out, "%s", yytext); }
\n { fprintf(out, "\n"); }
int main() {
char input_file[100];
printf("Enter the C program filename (e.g., program.c): ");
scanf("%s", input_file);
yyin = fopen(input_file, "r");
if (!yyin) {
perror("Error opening input file");
return 1;
}
out = fopen("out.c", "w");
if (!out) {
perror("Error opening out.c");
fclose(yyin);
return 1;
}
yylex();
fclose(yyin);
fclose(out);
printf("Comments removed successfully. Check out.c\n");
return 0;
}
int yywrap(){
return 1;
}
Output:
input :
#include <stdio.h> // header file
===== Page 13 =====
int main()
{
// program start
printf("Hello"); // print strnt
}
// exit
output :
#include <stdio.h>
int main()
{
printf("Hello");
}
12
===== Page 14 =====
Q8. Design a LEX Code to extract all html tags in the given HTML file at run time and store into Text file given at run time.
Solution:
% {
#include <stdio.h>
#include <stdlib.h>
FILE *out;
% }
%%
\<!--([^-|n]|(-[^-])|(|n))*--> { }
\<[a-zA-Z/1][^>]*> { fprintf(out, "%s\n", yytext); }
. { }
\n { fprintf(out, "\n"); }
%%
int main() {
char input_file[100], output_file[100];
printf("Enter the HTML file name (e.g., index.html): ");
scanf("%s", input_file);
printf("Enter the output file name (e.g., tags.txt): ");
scanf("%s", output_file);
yyin = fopen(input_file, "r");
if (!yyin) {
perror("Error opening input file");
return 1;
}
out = fopen(output_file, "w");
if (!out) {
perror("Error opening output file");
fclose(yyin);
return 1;
}
yylex();
fclose(yyin);
fclose(out);
printf("HTML tags extracted successfully. Check %s\n", output_file);
return 0;
}
int yywrap(){
return 1;
}
===== Page 15 =====
Q9. Design a DFA in LEX Code which accepts string containing even number of ‘a’ and even number of ‘b’ over input alphabet (a, b).
Solution:
% {
#include <stdio.h>
#include <ctype.h>
int state = 0;
int invalid_input = 0;
% }
%%
a {
if (state == 0) state = 1;
else if (state == 1) state = 0;
else if (state == 2) state = 3;
else if (state == 3) state = 2;
}
b {
if (state == 0) state = 2;
else if (state == 1) state = 3;
else if (state == 2) state = 0;
else if (state == 3) state = 1;
}
[c-zC-Z0-9]+ {
invalid_input = 1;
}
\n {
if (invalid_input == 1) {
printf("Rejected (Invalid characters found)\n");
} else if (state == 0) {
printf("Accepted\n");
} else {
printf("Rejected\n");
}
state = 0;
invalid_input = 0;
}
. { /* Ignore spaces or special characters */ }
%%
int main() {
char input[100];
while (1) {
===== Page 16 =====
printf("Enter a string of a's and b's (end with Enter, type 'exit' to quit): ");
fgets(input, sizeof(input), stdin);
if (input[0] == 'e' && input[1] == 'x' && input[2] == 'i' && input[3] == 't') {
break;
}
yylex();
}
return 0;
}
int yywrap(){
return 1;
}
Output:
Enter a string of a's and b's (end with Enter, type 'exit' to quit):
aabb
Accepted
abab
Accepted
bbaab
Rejected
15
===== Page 17 =====
Q10. Design a DFA in LEX Code which accepts string containing third last element ‘a’ over input alphabet (a, b).
Solution:
% {
#include <stdio.h>
#include <string.h>
char window[4] = " ";
% }
%%
[a|b] {
window[0] = window[1];
window[1] = window[2];
window[2] = yytext[0];
}
\n {
if (strlen(window) >= 3 && window[0] == 'a') {
printf("Accepted\n");
} else {
printf("Rejected\n");
}
strcpy(window, " ");
}
. { }
%%
int main() {
char input[100];
while (1) {
printf("Enter a string of a's and b's (end with Enter, type 'exit' to quit): ");
fgets(input, sizeof(input), stdin);
if (strncmp(input, "exit", 4) == 0) {
break;
}
yylex();
}
return 0;
}
int yywrap(){
return 1;
}
}
Output:
aabb
Accepted
aaabbb
Rejected
aaaaab
Accepted
===== Page 18 =====
Q11. Design a DFA in LEX Code to Identify and print Integer & Float Constants and Identifier.
Solution:
% {
#include <stdio.h>
% }
%%
([0-9]+) {printf("Integer: %s\n", yytext);}
([0-9]+\.[0-9]+) | (\.[0-9]+) | ([0-9]+\.) {printf("Float: %s\n", yytext); }
[a-zA-Z_]+[a-zA-Z_0-9]* {printf("Identifier: %s\n", yytext); }
[\n\t ]+ { }
. {printf("Unrecognized token: %s\n", yytext);}
%%
int main() {
printf("Enter your input (type 'exit' to quit):\n");
yylex();
return 0;
}
int yywrap(){
return 1;
}
Output:
Enter your input (type 'exit' to quit):
1234567
Integer: 1234567
123456.34567
Float: 123456.34567
dfgh
Identifier: dfgh
23456.21
Float: 23456.21
17
===== Page 19 =====
Q12. Design YACC/LEX code to recognize valid arithmetic expression with operators +,-, * and /.
Solution:
Yaac:
% {
#include <stdio.h>
#include <stdlib.h>
void yyerror(const char *msg);
int yylex();
% }
%token NUMBER
%token PLUS MINUS MUL DIV LPAREN RPAREN EOL
%%
input:
expression EOL { printf("Valid Expression\n"); }
| error EOL { printf("Invalid Expression\n"); yyerrok; }
;
expression:
expression PLUS term
| expression MINUS term
| term
;
term:
term MUL factor
| term DIV factor
| factor
;
factor:
NUMBER
| LPAREN expression RPAREN
;
%%
void yyerror(const char *msg) {
fprintf(stderr, "Error: %s\n", msg);
}
int main() {
printf("Enter an arithmetic expression (end with Enter):\n");
yyparse();
return 0;
}
18
===== Page 20 =====
**Lex:**
% {
#include "12.tab.h"
#include <ctype.h>
% }
%%
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
[ \t] ; // Ignore spaces and tabs
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return MUL; }
"/" { return DIV; }
"(" { return LPAREN; }
")" { return RPAREN; }
\n { return EOL; }
. { return yytext[0]; } // Catch all for any other character
%%
int yywrap() {
return 1;
}
19
===== Page 21 =====
Q13. Design YACC/LEX code to evaluate arithmetic expression involving operators +, -* and / without operator precedence grammar & with operator precedence grammar.
Solution:
Yaac:
%{
#include <stdio.h>
#include <stdlib.h>
int yylex();
void yyerror(const char *s) {
printf("Error: %s\n", s);
}
%}
%token NUMBER
%token PLUS MINUS MULTIPLY DIVIDE
%left PLUS MINUS
%left MULTIPLY DIVIDE
%%
expression:
expression PLUS expression { $$ = $1 + $3; }
expression MINUS expression { $$ = $1 - $3; }
expression MULTIPLY expression { $$ = $1 * $3; }
expression DIVIDE expression { $$ = $1 / $3; }
'('expression')' { $$ = $2; }
NUMBER { $$ = $1; }
%%
int main() {
printf("Enter an arithmetic expression (with precedence): ");
yyparse();
return 0;
}
20
===== Page 22 =====
Lex:
%{
#include "13.tab.h"
%}
%%
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
[\\n ] { /* Ignore whitespace */ }
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return MULTIPLY; }
"/" { return DIVIDE; }
. { return yytext[0]; }
%%
int yywrap() {
return 1;
}
Comments
Post a Comment