目录1. lex/yacc概述1.1. lex/yacc与flex/bison的关系1.2. lex/yacc的优势1.3 .程序示例下载地址1.4 .学习资料2. flex语法(分为三部分)2.1.3部分按%%划分2.2 .第一部分2.3 .第二部分:单词匹配后进行某些动作(核心部分句法分析ex是将lex代码编译成词法分析器的编译理论基础2.3.3 .单词匹配)2.3.4.匹配单词后的动作2.3.5 .内置lex
lex/yacc是思想,flex/bison是其gnu实现
lex/yacc的好处可以轻松构建c/c编译器
程序示例下载地址FTP ://FTP.iecc.com/pub/file/flex bison.zip
学习资料Bison 3.0.4: Top
flex语法(分为三个部分)的三个部分用%%分割第一部分的lex代码
%%
第二部分lex代码
%%
第三部分lex代码
第1部分:声明和选项设置(直接复制到生成的lex.yy.c ) ) ) )。
变量是复制到操作中可用的lex.yy.c的c语言变量
%}
第二部分:单词匹配后进行某些动作(核心部分语法分析器,yylex );在lex.yy.c中生成函数)语法正则表达式1动作1
正则表达式2操作2
正则表达式3操作3
要按照正则表达式语法编写正则表达式,lex作为词法分析代码编译的动作是c语言语句,动作c语言语句直接复制到lex.yy.c的是两者加起来的是yylex ) )函数,yylex ) )函数是yacc
单词匹配(正则表达式)基本用法
最长匹配原则:词法分析器匹配输入时,如果匹配尽可能多的字符串的两种模式一致,则匹配程序中更早出现的模式
如果在两个字符之间使用连字符,则表示字符的范围。 抑扬号用于开始位置时,意味着将后面的公式颠倒。 如果两个正则表达式匹配同一字符串,则使用匹配长度最长的正则表达式。 如果两者一致的长度相同,则选择第一个列举的范例。
单词匹配示例
完整的Lex/Yacc示例(c可用)- huyansoft专栏-博客频道- CSDN.NET
n与非字符匹配
水平。
n匹配字符
n
忽略空白字符
[t ] *忽略空白*;
wc中定义的无空白字符
[^ tnrfv]
匹配的单词
非数字由大小写字母、下划线组成
nondigit([_a-za-z] )。
一致的数字
一位数字,可以是0到9
数字([0-9] ) )。
匹配整数
整数由1至多位数字组成
integer (数字) )
匹配的标识符
非数字由大小写字母、下划线组成
nondigit([_a-za-z] )一位数字,可以是0到9
数字([0-9] ) )。
标识符,以非数字开头,后跟0至多个数字或非数字
identifier(nondigit ) non digit (|digit ) * )
要在语法规则中使用这些变量,必须注意带括号的{indentifier}
匹配连续的空白字符串
一个或一段连续的空白符
blank_chars([frtv] )
匹配单词后的动作语法
{1个或多个c语言句子}
动作中使用的变量
使用在lex代码的第一个部分声明中定义的变量lex的默认定义的内部变量
变量名yytext指向此次匹配的输入文本的角色y.tab.h使用yacc中定义的变量
打印一致的数据
如果不写动作,默认动作为打印。 所以宏观{ECHO; }不用写。
{ECHO; }
ECHO是一个c语言宏
(defineechofwrite(yytext,yyleng,1,yyout ) ) )。
向语法分析器传递符号信息
传递字符串值-使用函数strdup(yytext )
passingvalues(yylval ) otherthanstringfromflextobison
lex内置变量名称功能char *yytext指针。 与匹配字符串yyleng匹配的字符串的长度yylval标记对应的值FILE *yyout输出文件FILE *yyin输入文件INITIAL初始化开始环境BEGIN在条件转换开始环境ECHO中输出一致字符串的lex内置函数名称功能intylex(void )调用扫描仪,返回标签intyywrap (void )约束,返回1则扫描否则,如果每次返回0分析器时调用yylex ) )的分析器需要以下令牌,则它将再次调用yylex (),词法分析器将协同工作。 每次返回时,yylex ) )都会记录读取的文件的位置,分析器再次调用yylex ) )时,会继续从该位置开始读取。
第3部分:直接复制到生成的lex.yy.c的int main ()
{
yylex (;
}
flex程序编译flex代码. l//生成lex.yy.c
cc lex.yy.c -lfl //链接flex库文件