使用 yacc 和 lex 编写文本分析器
2008-11-13 08:32:06 来源:WEB开发网清单 5. 返回标记
%{
#include <stdio.h>
#include <y.tab.h>
%}
%%
begin return BEGIN;
hello return HELLO;
thanks return THANKS;
end return END;
%%
现在,当识别了 'hello' 标记时,不再是打印一个字符串,而是返回标记的名称。在 yacc 中,将使用这个名称来建立相应的语法。
在这个示例中,没有显式地定义这些标记名称。实际上是在 y.tab.h 文件中指定了这些标记名称,而在分析 yacc 语法文件时由 yacc 自动生成该文件。
提取变量数据
如果要提取一个值(例如,需要能够读取一个数值或字符串),那么您必须指定如何将输入转换为所需的类型。通常由于 lex 中的各种限制,这种做法并不是很有价值,但是当使用 yacc 工具来构建一个完整的分析器时,这是至关重要的。
通常可以使用两个变量来交换信息,yytext 变量包含了在分析过程中由 lex 读取的原始数据,而 yylval 则用于在两个系统之间交换实际的值。在本教程后面的内容中,将更详细地介绍这种结合是如何进行的,但是出于识别信息的目的,您可能使用类似下面的 lex 定义:
[0-9] yylval=atoi(yytext); return NUMBER;
在上面的代码行中,使用了标准的 atoi() 函数将匹配正则表达式(并保存于 yytext 中)的输入字符串片段转换为一个整数,并将 yylval 的值设置为该整数。请注意,尽管对值进行了转换,但您仍然需要返回值的类型,以便 yacc 知道究竟是什么类型并可以根据自己的定义来使用这个标记。
让我们通过查看 yacc 如何定义语法结构,以此来了解这项工作是如何进行的。
使用 yacc 进行语法分析
更多精彩
赞助商链接