more on lex
DESCRIPTION
TRANSCRIPT
![Page 1: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/1.jpg)
More on LEX
![Page 2: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/2.jpg)
LEX
In addition to scanner development, Lex/Flex is also used for
some other applications in system administration where text
processing is needed.
![Page 3: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/3.jpg)
Patterns
r? zero or one occurrence of r
r{2,5} two to five occurrences of r
r{2,} two or more occurrences of r
r{4} exactly 4 occurrence of r
\0 a NUL character (ASCII code 0)
\123 the character with octal value 123
\x2a the character with hexadecimal value 2a
![Page 4: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/4.jpg)
<s>r an r, but only in start condition s
<s1,s2,s3>r same, but in any of start conditions s1,
s2, or s3
<*>r an r in any start condition, even an
exclusive one.
<<EOF>> an end-of-file
<s1,s2><<EOF>> an end-of-file when in start condition s1
or s2
Patterns
![Page 5: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/5.jpg)
Special Directives
ECHO copies yytext to the scanner's output.
BEGIN followed by the name of a start condition places the
scanner in the corresponding start condition.
REJECT directs the scanner to proceed on to the second best rule
which matched the input (or a prefix of the input). Multiple
REJECT's are allowed, each one finding the next best choice to
the currently active rule.
![Page 6: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/6.jpg)
%{ int s=0;
%}
%%
she {s++; REJECT;}
he {s++}
%%
main() { yylex();
printf(“%d\n",s);
return 0; }
Exam
ple
![Page 7: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/7.jpg)
Lex Variables
yyin Of the type FILE*. This points to the current file
being parsed by the lexer.
yyout Of the type FILE*. This points to the location where
the output of the lexer will be written. By default,
both yyin and yyout point to standard input and
output.
yytext The text of the matched pattern is stored in this
variable (char*).
yyleng Gives the length of the matched pattern.
yylineno Provides current line number
![Page 8: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/8.jpg)
Lex Functions
yylex() The function that starts the analysis.
yywrap() In the C program generated by the lex
specification file, when yylex() finished with the
first file, it calls yywrap(), which opens the next
file, and yylex() continues. When yywrap() has
exhausted all the command line arguments, it
returns 1, and yylex() returns with value 0.
unput(c) puts the character c back onto the input stream.
It will be the next character scanned.
input() reads the next character from the input stream
![Page 9: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/9.jpg)
Lex functions- yyless(n)
Returns all but the first n characters of the current token back
to the input stream, where they will be rescanned when the
scanner looks for the next match.
yytext and yyleng are adjusted appropriately
An argument of 0 to yyless will cause the entire current input
string to be scanned again.
![Page 10: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/10.jpg)
For example, on the input "foobar" the following will write out
"foobarbar“
%% foobar ECHO; yyless(3);
[a-z]+ ECHO;
![Page 11: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/11.jpg)
Lex functions- yymore()
yymore() tells the scanner that the next time it matches a
rule, the corresponding token should be appended onto the
current value of yytext rather than replacing it.
![Page 12: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/12.jpg)
For example, given the input "mega-kludge" the following
will write "mega-mega- kludge" to the output
%% mega- ECHO; yymore();
kludge ECHO;
First "mega-" is matched and echoed to the output. Then
"kludge" is matched, but the previous "mega-" is still
hanging around at the beginning of yytext so the ECHO
for the "kludge" rule will actually write "mega-kludge".
![Page 13: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/13.jpg)
Start Conditions
Flex provides a mechanism for conditionally activating rules.
Any rule whose pattern is prefixed with "<sc>" will only be active
when the scanner is in the start condition named "sc".
<STRING>[^"]* { /* eat up the string body ... */ ... }
will be active only when the scanner is in the "STRING" start
condition
<INITIAL,STRING,QUOTE>\. { /* handle an escape ... */ ... }
will be active only when the current start condition is either
"INITIAL", "STRING", or "QUOTE".
![Page 14: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/14.jpg)
A start condition is activated using the BEGIN action.
Until the next BEGIN action is executed, rules with the given start
condition will be active and others are inactive.
Start conditions declared using %s are inclusive, then rules with
no start conditions at all will also be active.
Start conditions declared using %x are inclusive, then only rules
qualified with the start condition will be active.
Exclusive start conditions make it easy to specify "mini-scanners"
which scan portions of the input that are syntactically different
from the rest (e.g., comments).
![Page 15: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/15.jpg)
Begin
BEGIN(0) returns to the original state where only the rules
with no start conditions are active.
BEGIN(INITIAL) is equivalent to BEGIN(0).
int enter_special;
%x SPECIAL
%%
if ( enter_special )
BEGIN(SPECIAL);
<SPECIAL>[a-z] {printf(“letter”);} %%
![Page 16: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/16.jpg)
Exam
ple %s TABL REC DATA
%%
<INITIAL>"<table>" BEGIN TABL;
<TABL>"<\/table>" BEGIN
INITIAL;
<TABL><tr> BEGIN REC;
<REC><\/tr> BEGIN TABL;
<REC><td> BEGIN DATA;
<DATA><\/td> BEGIN REC;
<DATA>. ECHO;
<DATA,REC,TABL>[ \t\n] ;
%%
main()
{
yylex();
}
![Page 17: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/17.jpg)
Line no in text file%{
/*
*/
int lineno=1;
%}
line .*\n
%%
{line} { printf("%5d %s",lineno++,yytext); }
%%
main(int argc, char*argv[])
{
extern FILE *yyin;
yyin=fopen(argv[1],"r");
yylex();
return 0;
}
![Page 18: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/18.jpg)
A Lex program that finds a word from the given file and replaces it
with other word.
![Page 19: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/19.jpg)
%{#include<stdio.h> #include<string.h> FILE *ff,*fr; char p[20],q[20],r[20],fname[20]; %} word [a-zA-Z]+%% {word} {
if(strcmp(p,yytext)==0) fprintf(fr,q); else fprintf(fr,yytext); }
{eol} {fprintf(fr,yytext);} . {fprintf(fr,yytext);} %% int main(int argc,char *argv[]) { strcpy(fname,argv[1]); strcpy(p,argv[2]); strcpy(q,argv[3]); ff=fopen(fname,"r+"); fr=fopen("rep.txt","w+"); yyin=ff; yylex(); return(0); }
![Page 20: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/20.jpg)
Replace Arabic Nos with Roman%{#include<stdio.h> #include<ctype.h> FILE *ff,*fr; char fname[20];int z;%}%%1 {fprintf(fr,"I ");}2|3|4 { z=atoi(yytext);
while(z!=0){
{fprintf(fr,"I "); z--;}
}
![Page 21: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/21.jpg)
5 {fprintf(fr,"V ");}6|7|8 { z=atoi(yytext);
{fprintf(fr,"V ");}while(z!=5){{fprintf(fr,"I "); z--;}
}9 {fprintf(fr,"IX ");}10 {fprintf(fr,"X ");}. {fprintf(fr,yytext);}%%int main(int argc,char *argv[]) { strcpy(fname,argv[1]); ff=fopen(fname,"r+"); fr=fopen("rep.txt","w+"); yyin=ff; yylex(); return(0); }
![Page 22: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/22.jpg)
Date Format Change%{#include<stdio.h> #include<string.h> FILE *ff,*fr; char fname[20];int z;%}digit [0-9]%%{digit}{digit}"\"{digit}{digit}"\" {yymore();}[5-9][1-9] {fprintf(fr,"19"); fprintf(fr,yytext);}[0-5]{digit} {fprintf(fr,"20"); fprintf(fr,yytext);}
![Page 23: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/23.jpg)
%%int main(int argc,char *argv[]) { strcpy(fname,argv[1]); ff=fopen(fname,"r+"); fr=fopen("rep.txt","w+"); yyin=ff; yylex(); return(0); }
![Page 24: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/24.jpg)
The following lex specification file is used to generate a C
program which is used to generate a html file from a data
file.
A0 = "Name"
B0 = "SSN"
C0 = "HW1"
D0 = "HW2”
…
Name SSN HW1 HW2
Scott Smith 123445678 82 44.2
Sam Sneed 999887777 92 84
![Page 25: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/25.jpg)
%%^A0 {printf("<table>\n<tr>\n");}^A[09]* {printf("</tr>\n<tr>\n");}^[BZ][09]* ;[09]* {printf("<td> "); ECHO; printf("</td>\n");}[09]*"."[09]* {printf("<td> "); ECHO; printf("</td>\n");}\"[^"]*\" {printf("<td> "); yytext[yyleng1]= ' ';
printf("%s </td>\n",yytext+1);}= ;[ \n] ;. ECHO;%%main() {printf("<html>\n");yylex();printf("</tr>\n</table>\n</html>\n");}
![Page 26: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/26.jpg)
This lex specification file is used to generate a C program
which counts how many times a given alphabet is next to
another alphabet in the given input
![Page 27: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/27.jpg)
%{#include<stdlib.h>int F[26][26];%}%%[AZaz][AZaz]{F[toupper(yytext[0])65][toupper(yytext[1])65]++;REJECT;}.|\n ;%%
![Page 28: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/28.jpg)
main(int argc, char*argv[]){extern FILE *yyin;int i,j;for(i=0;i<26;i++)for(j=0;j<26;j++)F[i][j]=0;yyin=fopen(argv[1],"r");yylex();for(i=0;i<26;i++){for(j=0;j<26;j++) printf("%d", F[i][j]);printf("\n");}return 0;}
![Page 29: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/29.jpg)
%{#include <stdio.h>#include <errno.h>int file_num;int file_num_max;char **files;extern int errno;%}%%(ftp|http):\/\/[^ \n<>"]* printf("%s\n",yytext);.|\n ;%%int main(int argc, char *argv[]) {file_num=1;file_num_max = argc;files = argv;if ( argc > 1 ) {if ( (yyin = fopen(argv[file_num],"r")) ==0 ) {perror(argv[file_num]);exit(1);
Yywrap() Example
![Page 30: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/30.jpg)
}}while( yylex() );return 0;}int yywrap() {fclose(yyin);if ( ++file_num < file_num_max ) {if ( (yyin = fopen(files[file_num],"r")) ==0 ) {perror(files[file_num]);exit(1);}return 0;} else {return 1;
![Page 31: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/31.jpg)
A lex-based squid redirector %x SKIP%x COPY%option always-interactive%%"http://www.debian.org/" |"http://www.yahoo.com/" {
yytext[yyleng-1] = '\0';printf("%s.au/",yytext);BEGIN COPY;}
"http://"(www.)?"altavista.digital.com/" {printf("http://www.altavista.yellowpages.com.au/");BEGIN COPY;}
"ftp://sunsite.anu.edu.au/pub/linux/" |"ftp://sunsite.unc.edu/pub/Linux/" |
![Page 32: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/32.jpg)
"ftp://ftp.funet.fi/pub/Linux/" {printf("ftp://ftp.monash.edu.au/pub/linux/");
BEGIN COPY;}
"http://weather/" {printf("http://www.bom.gov.au/");BEGIN COPY;}
"http://bypass." { printf("http://"); BEGIN COPY; }"ftp://bypass." { printf("ftp://"); BEGIN COPY; }<COPY>[^ \n] ECHO;<COPY>" " BEGIN SKIP;. BEGIN SKIP;<SKIP>. ;<*>\n { putchar('\n'); fflush(stdout); BEGIN 0; }%%
![Page 33: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/33.jpg)
Write a LEX program to count the number of palindrome string in a given file and write them into a separate file.
![Page 34: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/34.jpg)
Write a LEX program to read 3 Roman numbers and output its equivalent numbers and sum in decimal.
Ex: Input: VI IX L Output: 6 + 9 + 50 = 65
![Page 35: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/35.jpg)
Write a LEX program to read an expression in postfix form and evaluate the value of the expression
Ex: 342+* is 18
![Page 36: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/36.jpg)
Write a lex program to read a text file and reverse all words that begin with letter ‘a’ and end with letter ‘d’. Display the longest of such words.
![Page 37: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/37.jpg)
Write a LEX program to count number of even and odd numbers. Output the odd numbers to odd.txt and even numbers to even.txt files. Also display the largest odd and even numbers
![Page 38: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/38.jpg)
Write a lex program to read a text file and remove all words that begin with letter ‘a’ and end with letter‘d’. Write the remaining words to a separate file.
![Page 39: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/39.jpg)
Write a lex program to read a text file and do the following
Add 1 to all integers.Add 0.5 to all fractional numbers.Convert all words to uppercase
words Delete all alphanumeric wordsWrite resulting content to a
separate file.
![Page 40: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/40.jpg)
Encryption and decryption
![Page 41: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/41.jpg)
Write a Lex program that converts a file to "Pig latin."
Specifically, assume the file is a sequence of words (groups of letters) separated by whitespace. Every time you encounter a word:
1. If the first letter is a consonant, move it to the end of the word and then add ay.
2. If the first letter is a vowel, just add ay to the end of the word.
All nonletters are copied intact to the output.
![Page 42: More on Lex](https://reader033.vdocuments.us/reader033/viewer/2022061118/546945d9af795929318b67d1/html5/thumbnails/42.jpg)
April 8, 2023 42
Thank y u…!