编译原理实验手册
第6页 总 32 页
Lex 变量
yyin FILE* 类型。 它指向 lexer 正在解析的当前文件。
yyout FILE* 类型。 它指向记录 lexer 输出的位置 .缺省情况下 ,yyin 和 yyout 都指向标准输入和
输出。
yytext 匹配模式的文本存储在这一变量中( char*)。
yyleng 给出匹配模式的长度。
yylineno 提供当前的行数信息。 (lexer 不一定支持。)
Lex 函数
yylex() 这一函数开始分析。 它由 Lex 自动生成。
yywrap() 这一函数在文件(或输入)的末尾调用。如果函数的返回值是 1,就停止解析。 因此
它可以用来解析多个文件。 代码可以写在第三段, 这就能够解析多个文件。 方法是使用 yyin 文
件指针(见上表)指向不同的文件,直到所有的文件都被解析。最后, yywrap() 可以返回 1 来
表示解析的结束。
对 Lex 的讨论就到这里。
Yacc快速入门 :
Yacc 代表 Yet Another Compiler Compiler。 Yacc 的 GNU 版叫做 Bison。它是一种工具,
将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc语法解析器。它用巴科斯范式 (BNF,
Backus Naur Form)来书写。按照惯例, Yacc 文件有 .y 后缀。编译行如下调用 Yacc 编译器:
Bison <options> <filename ending with .y>
在进一步阐述以前,让我们复习一下什么是语法。在上一节中,我们看到 Lex 从输入序列中识
别标记 (token)。如果你在查看标记序列,你可能想在这一序列出现时执行某一动作。这种情况
下有效序列的规范称为语法。 Yacc 语法文件包括这一语法规范。它还包含了序列匹配时你想要
做的事。
为了更加说清这一概念,让我们以英语为例。 这一套标记可能是:名词 , 动词 , 形容词等等。
为了使用这些标记造一个语法正确的句子,你的结构必须符合一定的规则。一个简单的句子可
能是名词 +动词或者名词 +动词+名词。 (如 I care. See spot run.)
所以在我们这里,标记本身来自语言( Lex),并且标记序列允许用 Yacc 来指定这些标记 (标记
序列也叫语法 )。
终端和非终端符号
终端符号 : 代表一类在语法结构上等效的标记。终端符号有三种类型:
命名标记 : 这些由 %token 标识符来定义。按照惯例,它们都是大写。
字符标记 : 字符常量的写法与 C 相同。例如 , ?? 就是一个字符标记。
字符串标记 : 写法与 C 的字符串常量相同。例如, "<<" 就是一个字符串标记。