使用 yacc 和 lex 编写文本分析器
2008-11-13 08:32:06 来源:WEB开发网对于单行输入 ('begin'),该应用程序根据您所提供的命令进行响应,在本示例中,将打印出单词 'Started'。对于包含多个识别单词的行,该应用程序分别运行多个命令,并以空格隔开。对于无法识别的标记(包括空白字符),仅对其进行回显。
这个示例介绍了该系统的基本操作,但是您仅仅使用了标准的单词。要使用其他的组合,如字符和元素,有各种不同的解决方案可供使用。
识别元素
可识别的元素可以不是前面介绍的固定字符串,标识符支持正则表达式和特殊(例如标点符号)字符,如清单 4 所示。
清单 4. 正则表达式和特殊字符
%{
#include <stdio.h>
%}
%%
[a-z] printf("Lowercase wordn");
[A-Z] printf("Uppercase wordn");
[a-ZA-Z] printf("Wordn");
[0-9] printf("Integern");
[0-9.] printf("Floatn");
";" printf("Semicolonn");
"(" printf("Open parenthesesn");
")" printf("Close parenthesesn");
%%
清单 4 中的示例应该是一目了然的,并且对于需要进行分析的任何正则表达式或特殊字符都可以使用相同的原则。
真正的标记化
前面的示例所构建的 C 源代码实质上是独立的。尽管使用这种方法没有什么问题,但是对于分析包含多个单词、短语或序列的给定指令中的文本或其他条目的情况,这种方法并不是很有价值。
使用这种方式分析序列需要一个语法分析器,而它将定义标记序列。但是语法分析器必须知道要分析的是什么标记。在 lex 定义中,当识别标记时所进行的操作是回显字符串,如果要返回一个识别标记,那么需要对该操作进行更改。例如,您可以如清单 5 所示对原始示例进行重写。
更多精彩
赞助商链接