使用 yacc 语法文件
yacc 语法文件由下面的部分组成:
- 声明
- 规则
- 程序
两个相邻%%(百分号,百分号) 分隔语法文件的每个部分。 要使文件更易于读取,请将%%自己排成一队 完整的语法文件看起来与以下内容类似:
declarations
%%
rules
%%
programs声明部分可能为空。 如果省略 "程序" 部分,请省略第二组%%. 因此,最小的 yacc 语法文件如下所示:
%%
rulesyacc 命令忽略语法文件中的空格、制表符和换行符。 因此,请使用这些字符使语法文件更容易读。 但是,请不要在名称或者保留符号中使用空格、制表符或者换行符。
使用注释
要说明程序在做什么,请在语法文件中进行注释。 您可以将注释加在可以放名称的语法文件中的任何地方。 但是,要使文件更加容易读,请将注释单独放在规则的功能块起始处的行中。 yacc 语法文件中的注释看起来与 C 语言程序中的注释相同。 注释包含在/*(反斜杠,星号) 和*/(星号,反斜杠)。 例如:
/* This is a comment on a line by itself. */使用文字串
文字串是括在其中的一个或多个字符''(单引号)。 和 C 语言一样,\(反斜杠) 是文字中的转义字符,所有 C 语言转义代码都被识别。 因此, yacc 命令接受下表中的符号:
| 符号 | 定义 |
|---|---|
| '\a' | 警告 |
| '\博' | 退格 |
| '\f' | 换页符 |
| '\n' | 换行 |
| '\R' | 回车 |
| '\t' | 制表符 |
| '\v' | 垂直制表键 |
| '\'' | 单引号 (') |
| '\"' | 双引号 (") |
| '\?' | 问号 (?) |
| '\\' | 反斜杠 (\) |
| '\数字' | 其编码由 Digits 字符串指定的一位、两位或者三位八进制整数表示的字符。 |
| '\x数字' | 其编码由 Digits 字符串指定的十六进制字符序列所表示的字符。 |
因为其 ASCII 码为零,所以空字符(\0 或者 0)不可用于语法规则中。 如果使用了空字符,那么 yylex 子例程返回 0,表示输入的末尾。
设置语法文件的格式
要使 yacc 语法文件的可读性更好,请使用下面的指南:
- 对标记名称使用大写字母,对非终止符号名称使用小写字母。
- 将语法规则和操作放在单独的行上,允许在更改一个时无需更改另一个。
- 将所有的规则一起放在相同的左侧。 进入左侧一次,并将竖线作为该左侧其余规则的起始位置。
- 对于相同左侧的每一个规则集,请在该左侧的最后一条规则后输入一个分号,并独立成行。 您可在以后方便地添加新的规则。
- 使用两个制表符停止位缩进规则主体,使用三个制表符停止位缩进操作体。
语法文件中的错误
yacc 命令无法为语法规范的所有集合生成解析器。 如果语法规则与其自身相抵触,或者需要与 yacc 命令所提供的不同的匹配技术,那么 yacc 命令不会产生解析器。 在大多数情况下,yacc 命令提供消息指出错误。 要改正这些错误,请在语法文件中重新设计规则,或者提供词法分析器(输入程序给解析器)以识别 yacc 命令无法识别的模式。