使用 yacc 语法文件

yacc 语法文件由下面的部分组成:

  • 声明
  • 规则
  • 程序
两个相邻%%(百分号,百分号) 分隔语法文件的每个部分。 要使文件更易于读取,请将%%自己排成一队 完整的语法文件看起来与以下内容类似:
declarations
%%
rules
%%
programs
声明部分可能为空。 如果省略 "程序" 部分,请省略第二组%%. 因此,最小的 yacc 语法文件如下所示:
%%
rules

yacc 命令忽略语法文件中的空格、制表符和换行符。 因此,请使用这些字符使语法文件更容易读。 但是,请不要在名称或者保留符号中使用空格、制表符或者换行符。

使用注释

要说明程序在做什么,请在语法文件中进行注释。 您可以将注释加在可以放名称的语法文件中的任何地方。 但是,要使文件更加容易读,请将注释单独放在规则的功能块起始处的行中。 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 命令无法识别的模式。