配置环境
安装指令
apt-get install flex
编译&运行指令
flex code.l
cc -o paser lex.yy.c ll
./paser < input.txt
备注
蓝色为一般情况下的固定格式 %{
#include "stdio.h"
%} word [a-zA-Z]+ //这里定义正则表达式,之后的调用需要加花括号,ex: {word} w1 ... w2 ... %%
{word} {putchar('~'');} //这里表示读到某个正则表达式后调用的c代码 {w1} {...} {w2} {...} . {...} //这里的. 并不代表任意字符,而表示不满足上面的几种情况的任意字符 %%
void main()
{
yylex(); //开始词法分析
}
扫描输入文件时,将所有输入加入缓冲池,依次匹配word, w1, w2,匹配中了就把匹配中的字符串(yytext)拿出缓冲池,然后执行后面的c代码,这时候如果ECHO会输出匹配中的yytext,如果c=input(),会把yytext后面还在缓冲池中的字符拿一个出来。
例题
%{
#include "stdio.h"
%}
%%
"/*" {
char c;
int done = 0;
ECHO;
do
{
while((c=input())!='*')
if(c<='z' && c>='a')
putchar(toupper(c));
else
putchar(c);
putchar(c);
while((c=input())=='*')
putchar(c);
putchar(c);
if(c=='/')
done = 1;
}while(!done);
}
%%
void main()
{
yylex();
}
%{
#include "stdio.h"
#include "string.h"
int wordsCount=0;
int charsCount=0;
int linesCount=0;
%}
t_line \n
t_word [a-zA-Z]+
%%
{t_word} {
wordsCount++;
charsCount+=strlen(yytext);
}
{t_line} {linesCount++;}
. {charsCount++;}
%%
void main()
{
yylex();
printf("count of chars: %d\n", charsCount);
printf("count of words: %d\n", wordsCount);
printf("count of lines: %d\n", linesCount);
}