天天看点

Lex学习笔记配置环境备注

配置环境

安装指令

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后面还在缓冲池中的字符拿一个出来。

例题

Lex学习笔记配置环境备注
%{
#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();
}
           
Lex学习笔记配置环境备注
%{
#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);
}