lex全称lexical analyzar
英文描述是 a scanner generator简单的来说,他讲一串字符串,拆分成单独的单词,并根据指定的正则来调用相应的宏,换句话说就是我们常说的保留字,lex就是去扫描里面有没有符合保留字的词,所以说是scanner,这个最中生成的c程序.
根据正则规则,将输入的语法进行分割
yylex():
lex文件的结构
# 第一部分
definition 初始化定义相关参数 选填
# 第二部分
%%
Rules 必填
#第三部分
%%
user subroutines 用户定义的子程序 选填
rule的规则: <reg.exp>
lex的正则表达式:
\ [ ] ? - ? . * | ( ) $ / { } % < >
.
点匹配所有字符串,除了换行-
表示一个范围^
表示否定,[^0-9]
表示开始不能以数字开头\
\n
, \t
代表换行, 缩进()
表示一组数据|
表示或关系*
表示0个或更多+
表示一个或者更多?
表示0个或一个在匹配的结果中有多个结果符合筛选条件时,lex会优先选择匹配字符最长的
在匹配结果有多个并且字符数量一致的情况下,第一个出现的优先
与自定义程序间进行通讯:
yytext
这是一个字符串数组,里面装着匹配好的数据
[a-z][a-z0-9_]* printf("ident: %s\n", yytext);
yyleng
匹配到的字符长度
//Counting the number of words in a file and their total size:
[a-zA-Z]+ {nwords += 1; size += yyleng;}
lex中关于资源的处理:
lex中内置的变量和函数:
变量
yyin | FILE* 类型。 它指向 lexer 正在解析的当前文件。 |
---|---|
yyout | FILE* 类型。 它指向记录 lexer 输出的位置。 缺省情况下,yyin 和 yyout 都指向标准输入和输出。 |
yytext | 匹配模式的文本存储在这一变量中(char*)。 |
yyleng | 给出匹配模式的长度。 |
yylineno | 提供当前的行数信息。 (lexer不一定支持。) |
函数:
yylex() | 这一函数开始分析。 它由 Lex 自动生成。 |
---|---|
yywrap() | 这一函数在文件(或输入)的末尾调用。 如果函数的返回值是1,就停止解析。 因此它可以用来解析多个文件。 代码可以写在第三段,这就能够解析多个文件。 方法是使用 yyin 文件指针(见上表)指向不同的文件,直到所有的文件都被解析。 最后,yywrap() 可以返回 1 来表示解析的结束。 |
yyless(int n) | 这一函数可以用来送回除了前n? 个字符外的所有读出标记。 |
yymore() | 这一函数告诉 Lexer 将下一个标记附加到当前标记后。 |
原文:https://www.cnblogs.com/callmelx/p/14051013.html