WEB开发网
开发学院操作系统Linux/Unix 使用 yacc 和 lex 编写文本分析器 阅读

使用 yacc 和 lex 编写文本分析器

 2008-11-13 08:32:06 来源:WEB开发网   
核心提示: 清单 5. 返回标记%{#include <stdio.h>#include <y.tab.h>%}%%beginreturn BEGIN;helloreturn HELLO;thanks return THANKS;endreturn END;%%现在,当识别了

清单 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 进行语法分析

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:使用 yacc lex

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接