将 lex 程序与 yacc 程序一起使用
您也能使用带有解析器生成器的 lex 程序,例如 yacc 命令。 yacc 命令生成称为解析器的程序,它能够分析输入不止一个字的构造。
此解析器程序能够和 lex 命令生成的词法分析器很好地一起运作。 解析器识别很多类型的语法,而不管其上下文。 这些解析器需要预处理器来识别输入标记,例如:lex 命令产生的预处理器。
lex 程序只能识别扩展的正则表达式并将它们格式化为称为标记的字符包(如输入文件所指定)。 使用 lex 程序为解析器生成词法分析器时,词法分析器(从 lex 命令创建)将输入流分区。 解析器(从 yacc 命令)为产生的段指定结构。 您还可将其他程序与 lex 或者 yacc 命令生成的程序一起使用。
标记是解析器或者词法分析器定义的最小独立含义单元。 标记可包含数据、语言关键字、标识或者语言语法的其他部分。
yacc 程序寻找名为 yylex 的词法分析器子例程,它由 lex 命令生成。 通常,lex 库中的缺省主程序调用 yylex
子例程。 但是,如果安装了 yacc 命令并使用其主程序,yacc 程序则调用 yylex 子例程。 在这种情况下,在适当情况下token返回值,每个 lex 程序规则应以以下内容结尾:
return(token);yacc 命令通过 #define 预处理器语句将整数值赋给 yacc 语法文件中定义的每一个标记。 词法分析器必须访问这些宏来将标记返回给解析器。 请使用 yacc -d 选项创建 y.tab.h 文件,通过将下面的行添加到 lex 说明文件中的定义部分来将 y.tab.h 文件包含到 lex 说明文件中:
%{
#include "y.tab.h"
%}或者,可以在 yacc 输出文件中包含 lex.yy.c 文件,方法是在第二行之后添加以下行%%yacc 语法文件中的 (百分号,百分号) 定界符:
#include "lex.yy.c"yacc 库应该在 lex 库之前装入,以获得调用 yacc 解析器的主程序。 您可以任何顺序生成 lex 和 yacc 程序。