英语法语西班牙语

Ad


OnWorks 网站图标

yaccposix - 云端在线

在 OnWorks 免费托管服务提供商中通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器运行 yaccposix

这是 yaccposix 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


yacc — 又一个编译器编译器(发展)

概要


雅克 [-dltv] [-b 文件前缀] [-p 符号前缀] 语法

商品描述


雅克 实用程序应读取上下文无关文法的描述 语法 并写 C
符合 ISO C 标准的源代码、代码文件和可选的标头
信息放入当前目录下的头文件中。 生成的源代码应
不依赖于任何未定义、未指定或实现定义的行为,除非在
直接从提供的语法中复制的情况,或者
由实施记录。 C 代码应定义一个函数和相关例程
和自动机的宏,该自动机执行满足以下要求的解析算法
算法.

扩展描述部分描述了语法的形式和含义。

C 源代码和头文件应以适合作为 C 输入的形式生成
编译器(见 c99).

配置


雅克 实用程序应符合 POSIX.1-2008 的基本定义卷, 部分
12.2, 公用事业 句法 指南, 准则 9 除外。

应支持以下选项:

-b 文件前缀
使用 文件前缀 而不是 y 作为所有输出文件名的前缀。 编码
文件 y.tab.c, 头文件 y.tab.h (创建时 -d 被指定),并且
描述文件 y.输出 (创建时 -v 指定),应改为
文件前缀.tab.c, 文件前缀.tab.h文件前缀。输出

-d 写入头文件; 默认情况下只写入代码文件。 这 #定义
语句关联由分配的令牌代码 雅克 与用户声明的
令牌名称。 这允许源文件以外的 y.tab.c 访问令牌
码。

-l 生成一个不包含任何代码文件 #线 结构体。 如果这个选项
不存在,未指定代码文件或头文件是否包含
#线 指令。 这应该只在语法和相关联之后使用
动作被完全调试。

-p 符号前缀
使用 符号前缀 而不是 yy 作为由产生的所有外部名称的前缀
雅克. 受影响的名称应包括功能 yy解析() 伊莱克斯(), 和
yy错误() 和变量 伊尔瓦尔, yychar调试. (在剩余的
本节,引用的六个符号使用它们的默认名称引用
仅作为符号方便。)本地名称也可能受 -p
选项; 然而 -p 选项不影响 #定义 生成的符号
雅克.

-t 修改条件编译指令以允许编译调试
代码文件中的代码。 运行时调试语句应始终包含在
代码文件,但默认情况下,条件编译指令会阻止它们
汇编。

-v 编写一个包含解析器描述和冲突报告的文件
由语法中的歧义产生。

操作数


需要以下操作数:

语法 包含指令的文件的路径名,以下称为 语法,为
要创建哪个解析器。 语法格式在
扩展说明部分。

标准输入


不曾用过。

INPUT FILES


该文件 语法 应该是按照扩展描述中指定的格式的文本文件
部分。

环境 变数


以下环境变量会影响执行 雅克:

为未设置或未设置的国际化变量提供默认值
空值。 (参见 POSIX.1-2008 的基本定义卷, 部分 8.2,
国际化 变量 为国际化优先
用于确定语言环境类别值的变量。)

LC_ALL 如果设置为非空字符串值,则覆盖所有其他字符串的值
国际化变量。

LC_CTYPE 确定用于解释文本数据字节序列的语言环境
作为字符(例如,单字节而不是多字节字符
参数和输入文件)。

LC_消息
确定应该用于影响格式和内容的语言环境
写入标准错误的诊断消息。

路径 确定用于处理的消息目录的位置 LC_消息.

LC_* 变量影响执行 雅克 效用如所述。 这 ()
函数定义在 Yacc 自学资料库 应调用:

设置区域设置(LC_ALL, “”)

因此生成的程序 雅克 也将受到这些内容的影响
运行时的变量。

异步 新闻


默认。

标准输出


不曾用过。

斯特德


如果在 语法, 雅克 应该写一个
以未指定的格式向标准错误报告这些冲突。

标准错误也应用于诊断消息。

OUTPUT FILES


代码文件、头文件和描述文件应为文本文件。 全部是
在以下各节中描述。

代码 文件
该文件应包含 C 源代码 yy解析() 功能。 它应包含
对它们执行宏替换的各种语义动作的代码为
在扩展描述部分中进行了描述。 它还应包含一份 #定义
头文件中的语句。 如果一个 %联盟 使用声明,声明为
YYSTYPE 也应包含在此文件中。

标题 文件
头文件应包含 #定义 将令牌编号与
令牌名称。 这允许代码文件以外的源文件访问令牌代码。
如果一个 %联盟 使用声明,YYSTYPE 的声明和 外部 YYS型 伊尔瓦尔
声明也应包含在此文件中。

产品描述 文件
描述文件应是包含状态机描述的文本文件
对应于解析器,使用未指定的格式。 内部表的限制(请参阅
极限) 还应以实现定义的方式进行报告。 (一些实现
可以使用动态分配技术并且没有要报告的特定限值。)

EXTENDED 商品描述


雅克 命令接受用于为目标语言定义语法的语言
由生成的表和代码解析 雅克. 接受的语言 雅克 作为一个
目标语言的语法在下面使用 雅克 输入语言本身。

输入 语法 包括描述目标语言输入结构的规则和
当这些规则被识别以提供相关语义时要调用的代码
行动。 要执行的代码应显示为旨在成为 C-的文本正文
语言代码。 这些文本正文不应包含 C 语言三合字母。 C语言
内含物被假定为在处理时形成正确的功能 雅克 进入它的输出
文件。 这种方式包含的代码在识别过程中会被执行
目标语言。

给定一个语法, 雅克 实用程序生成输出文件中描述的文件
部分。 可以使用编译和链接代码文件 c99. 如果声明和
语法文件的程序部分不包括 () 伊莱克斯(), 和
yy错误(),编译后的输出需要与外部提供的那些版本链接
职能。 默认版本 ()和 yy错误() 提供在 雅克 图书馆和
可以通过使用链接 -l y 操作数 c99。 该 雅克 库接口不需要
支持非默认接口 yy 符号前缀。 该应用程序提供
词法分析器功能, 伊莱克斯(); 这 实用程序专门设计用于
生成这样的例程。

输入 语言
应用程序应确保每个规范文件由三个部分组成
订购: 声明, 语法 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。程式, 由双
人物 (“%%”)。 声明和程序部分可以为空。 如果后者是
空的,前面的 “%%” 可以省略将其与规则部分分开的标记。

输入是遵循下面定义的语法结构的自由格式文本。

词法 结构 of 语法
这, , 和字符将被忽略,除了
应用程序应确保它们不会出现在名称或多字符保留中
符号。 评论应附在 "/* ... */", 并且可以出现在任何有名字的地方
有效。

名称具有任意长度,由字母、句点 ('。'), 下划线 ('_'),
非首字母数字。 大写和小写字母是不同的。 符合应用程序
不得使用以 yy or YY雅克 解析器使用这样的名称。 许多
名称出现在最终输出中 雅克,因此应该选择它们以符合
使用由 C 编译器创建的任何附加规则。 特别是他们出现
in #定义 声明。

文字应由包含在单引号字符中的单个字符组成。 所有的
ISO C 标准支持的字符常量转义序列应为
通过支持 雅克.

下面详细讨论与词法分析器的关系。

应用程序应确保语法规则中不使用 NUL 字符或
文字。

声明 部分
声明部分用于定义用于定义目标语言的符号
以及他们之间的关系。 特别是,许多附加信息
解决目标语言的上下文无关语法中的歧义所需的是
在这里提供。

平时 雅克 分配它生成的符号名称和它们之间的关系
基础数值。 声明部分可以控制
这些值的分配。

还可以保留与当前标记相关联的语义信息
用户定义的 C 语言中的解析堆栈 工会, 如果工会成员是
与语法中的各种名称相关联。 声明部分规定
这也是。

下面的第一组声明符都将名称列表作为参数。 那个名单可以
可选地前面是 C 联合成员的名称(称为 行李牌 下面)出现
'<''>'. (作为本文其余部分的排版约定的一个例外
POSIX.1-2008 的卷,在这种情况下行李牌> 不代表元变量,但
符号周围的字面尖括号字符。)的使用 行李牌 指定
在这一行命名的标记应与引用的联合成员具有相同的 C 类型
行李牌. 这将在下面更详细地讨论。

对于用于定义标记的列表,给定标记的第一次出现之后可以跟
一个正整数(作为一串十进制数字)。 如果这样做,基础价值
为词汇目的分配给它的应视为该数字。

以下声明 姓名 成为令牌:

%令牌 [<行李牌>] 姓名 [] [姓名 []]...

If 行李牌 存在,该行上所有标记的 C 类型应声明为类型
引用者 行李牌. 如果是正整数, , 遵循一个 姓名,该值应为
分配给令牌。

以下声明 姓名 成为一个标记,并为其分配优先级:

%剩下 [<行李牌>] 姓名 [] [姓名 []]...
%对 [<行李牌>] 姓名 [] [姓名 []]...

此部分可以出现一行或多行,每行以这些符号之一开头。
同一行上的所有标记具有相同的优先级和关联性; 线条
按优先级或绑定强度的增加顺序排列。 %剩下 表示
该行上的运算符是左关联的,并且 %对 同样表示对
关联运算符。 如果 行李牌 存在,它应声明一个 C 类型 姓名s 如所述
%令牌.

以下声明 姓名 是一个令牌,并表示不能使用
联想地:

%非关联 [<行李牌>] 姓名 [] [姓名 []]...

如果解析器遇到此标记的关联使用,它会报告错误。 如果 行李牌 is
目前,它应该声明一个 C 类型 姓名s 描述为 %令牌.

以下声明工会成员 姓名s 是非终结符,因此需要
有一个 行李牌 字段在其开头:

%类型 <行李牌> 姓名...

因为它只处理非终结符,分配一个标记号或使用文字是
也被禁止。 如果存在此构造, 雅克 应进行类型检查; 如果这
构造不存在,解析堆栈应只保存 INT 类型。

中使用的每个名称 语法 不是由 a 定义的 %令牌, %剩下, %对%非关联
声明被假定为代表一个非终结符。 这 雅克 公用事业公司应报告
任何未出现在至少一个的左侧的非终结符的错误
语法规则。

一旦指定了名称的类型、优先级或标记号,就不得
改变了。 如果令牌的第一个声明没有分配令牌编号, 雅克
分配一个令牌号。 一旦完成此分配,令牌编号不得更改
通过显式赋值。

以下声明符不遵循先前的模式。

以下声明非终端 姓名 是的 开始 符号, 代表
语法规则描述的最大、最通用的结构:

%开始 姓名

默认情况下,它是第一个语法规则的左侧; 这个默认值可以是
被此声明覆盖。

以下声明 雅克 值堆栈是各种类型值的联合
想要的。

%联盟 { 身体 of 工会 (in C)}

联合体不应包含不平衡的花括号预处理标记。

默认情况下,动作(见下文)和词法分析器返回的值应为
类型 INT。 该 雅克 实用程序跟踪类型,并插入相应的
联合成员名称,以便对结果解析器执行严格的类型检查。

或者,鉴于至少有一个行李牌> 使用构造,可以声明联合
在头文件中(应通过使用 的#include
构建在 %{%})和一个 类型定义 用来定义符号 YYSTYPE 来表示
这个联盟。 的效果 %联盟 是直接从提供YYSTYPE的声明
雅克 输入。

C 语言声明和定义可以出现在声明部分,附上
通过以下标记:

%{ ... %}

这些语句应复制到代码文件中,并在其中具有全局作用域,因此
它们可以用于规则和程序部分。 声明不得包含
“%}” 在注释、字符串文字或多字符常量之外。

应用程序应确保声明部分由令牌终止 %%.

语法 规则 in 雅克
规则部分定义了函数接受的上下文无关文法 雅克
生成并与这些规则相关联 C 语言操作和附加优先级
信息。 下面描述了语法,然后是正式的定义。

规则部分由一个或多个语法规则组成。 语法规则具有以下形式:

A : 机构 ;

符号 A 代表一个非终端名称,和 机构 表示一个零序列或
更多 姓名s, 文字s,并且 语义 行动s 然后可以跟可选
优先权 排除s。 只有名称和文字参与形成
语法; 语义动作和优先规则以其他方式使用。 这和
这是 雅克 标点。 如果有几个连续的语法规则
相同的左侧, ('|') 可用于避免重写
左手边; 在这种情况下仅在最后一条规则之后出现。 身体
部分可以为空(或名称和文字为空)以指示非终结符
符号匹配空字符串。

雅克 实用程序为每个规则分配一个唯一编号。 使用竖线的规则
符号是不同的规则。 分配给规则的编号出现在说明中
文件中。

构成 BODY 的元素是:

姓名, 文字
这些构成了语法规则: 姓名 是一个 象征 或者 非终端;
文字 代表自身(减去词汇所需的引号)。

语义 行动
每个语法规则,用户可以关联每次要执行的动作
规则在输入过程中被识别。 (注意“动作”这个词可以
也指解析器的动作——shift、reduce 等。)

这些动作可以返回值,可以获取上一个返回的值
行动。 这些值保存在 YYSTYPE 类型的对象中(请参阅 %联盟)。 该
操作的结果值应保留在左侧的解析堆栈中
规则的一部分,其他归约可以访问,作为他们右手的一部分
边。 通过使用行李牌> 声明部分提供的信息,
生成的代码 雅克 可以严格类型检查并包含任意
信息。 此外,词法分析器可以提供相同种类的
如果需要,令牌的值。

动作是任意的 C 语句,因此可以进行输入或输出,调用
子程序,并改变外部变量。 一个动作是一个或多个 C 语句
括在花括号中 '{''}'. 声明不得包含
不平衡的花括号预处理标记。

在动作中可以使用某些伪变量。 这些是用于访问的宏
内部已知的数据结构 雅克.

$$ 可以通过将其分配给 $$ 来设置操作的值。 如果输入
检查已启用,并且要分配的值的类型不能为
确定,可以生成诊断消息。

$ 这是指由指定的组件返回的值
象征 在规则的右侧,从左到右阅读;
可以为零或负数。 如果 为零或负数,它
指的是与解析器堆栈上的名称相关联的数据
在当前规则最左边的符号之前。 (那是, “ $ 0”
指紧接在最左边的名字之前的名字
要在解析器的堆栈中找到的当前规则和 “$−1” 指的是
符号到 它的 离开。)如果 指超过当前的元素
指向规则中,或超出堆栈底部,结果为
不明确的。 如果启用了类型检查并且要检查的值的类型
无法确定分配,则可能会生成诊断消息。

$<行李牌>
这些完全对应于相应的符号,没有 行李牌
包含,但允许严格的类型检查(并排除不需要的
类型转换)。 效果是宏展开使用 行李牌
从 YYSTYPE 联合中选择一个元素(使用 数据名.tag).
这在以下情况下特别有用 不积极。

$<行李牌>$ 这将引用的联合成员的类型强加给引用
by 行李牌. 这种结构适用于对左的引用
上下文值出现在语法中,并提供 雅克 有手段
用于选择类型。

动作可以发生在规则的任何地方(不仅仅是在最后); 一个动作可以访问
由其左侧的动作返回的值,反过来它返回的值可以是
通过其右侧的操作访问。 出现在规则中间的动作
应等价于用新的非终结符替换动作并且
在左侧添加一个带有非终结符的空规则。 这
与新规则相关的语义动作应等同于原始规则
行动。 在规则中使用动作可能会引入不会
否则存在。

默认情况下,规则的值应为其中第一个元素的值。
如果第一个元素没有类型(特别是在 a
文字)和类型检查被打开 %类型,将产生错误消息。

优先权
关键字 %精确 可用于更改与关联的优先级
特定的语法规则。 这方面的例子是在一元和二进制的情况下
运算符具有相同的符号表示,但需要赋予不同的
优先级,或者处理不明确的 if-else 结构的地方
必要的。 保留符号 %精确 可以在 body 后立即出现
语法规则,后面可以跟一个标记名称或文字。 它应
导致语法规则的优先级成为以下标记的优先级
名称或文字。 整个规则的动作可以遵循 %精确.

如果后面有程序部分,应用程序应确保语法规则是
终止于 %%.

训练课程 部分
程式 部分可以包括词法分析器的定义 伊莱克斯() 和任何
其他功能; 例如,在语法规则中指定的动作中使用的那些。 它
未指定程序部分是在 中的语义操作之前还是之后
输出文件; 因此,如果应用程序包含任何宏定义并且
意在应用于语义动作中的代码的声明,它应将它们放在
"%{ ... %}" 在声明部分。

输入 语法
以下输入 雅克 为输入产生一个解析器 雅克. 这个正式的语法
优先于前面的文本语法描述。

词汇结构的定义不太准确; 词法 结构 of 语法 定义
大多数条款。 前面的术语和下面的标记之间的对应关系是
如下。

识别码 这对应于概念 姓名,之前给出。 它还包括
前面定义的文字。

C_标识符
这是一个名字,另外已知它后面跟着一个. 一种
文字不能产生这个标记。

NUMBER 一串数字(非负十进制整数)。

, , 标记, 网址, 网址
这些直接对应 %类型, %剩下, %%, %{%}.

{ ... } 这表示 C 语言源代码,可能包含 '$'
之前讨论过的宏。

/* 语法 输入 雅克。 */
/* 基础 条目。 */
/* 以下 ,那恭喜你, 确认 by 词法 分析器。 */

%token IDENTIFIER /* 包括标识符和文字 */
%token C_IDENTIFIER /* 标识符(但不是文字)
后跟一个 :. */
%令牌编号 /* [0-9][0-9]* */

/* 保留字:%type=>TYPE %left=>LEFT,依此类推 */

%token LEFT RIGHT NONASSOC 令牌 PREC 类型起始联合

%token MARK /* %% 标记。 */
%token LCURL /* %{ 标记。 */
%token RCURL /* %} 标记。 */

/* 8 位字符文字代表它们自己; */
/* 必须为多字节字符定义标记。 */

%开始规范

%%

规格:defs MARK 规则尾部
;
尾巴:马克
{
/* 在这个动作中,设置文件的其余部分。 */
}
| /* 空的; 第二个 MARK 是可选的。 */
;
defs : /* 空。 */
| 定义
;
def : 开始标识符
| 联盟
{
/* 将联合定义复制到输出。 */
}
| 网址
{
/* 将 C 代码复制到输出文件。 */
}
网址
| rword 标签 nlist
;
rword : 令牌
| 剩下
| 对
| 非国家安全委员会
| 类型
;
标签:/* 空:联合标签 ID 可选。 */
| '<' 标识符 '>'
;
列表:nmno
| 列表 nmno
;
nmno : IDENTIFIER /* 注意:文字对 % 类型无效。 */
| IDENTIFIER NUMBER /* 注意:% 类型无效。 */
;

/* 规则部分 */

规则:C_IDENTIFIER rbody prec
| 规则规则
;
规则:C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody : /* 空 */
| rbody 标识符
| 身体行为
;
行为 : '{'
{
/* 复制动作,翻译 $$,等等。 */
}
'}'
;
prec : /* 空 */
| 精确标识符
| PREC标识符法
| 预';'
;

冲突
为输入语法生成的解析器可能包含发生冲突的状态。 这
发生冲突是因为语法不是 拉尔比(1). 歧义文法总是包含
最后一个 拉尔比(1) 冲突。 这 雅克 实用程序应解决所有冲突,使用任一
默认规则或用户指定的优先规则。

冲突是转移/减少冲突或减少/减少冲突。 移位/减少
冲突是,对于给定的状态和前瞻符号,移位动作和
减少行动是可能的。 减少/减少冲突是,对于给定的状态和
前瞻符号,可以通过两种不同的规则进行缩减。

下面的规则描述了如何指定发生冲突时要采取的操作。 不是
所有 shift/reduce 冲突都可以通过这种方式成功解决,因为冲突可能
是由于歧义以外的原因,因此不谨慎地使用这些设施可能会导致
解析器接受的语言与预期的语言大不相同。 这
描述文件应包含足够的信息以了解导致
冲突。 歧义是默认规则或显式规则的原因
足以产生一个工作解析器。

声明的优先级和关联性(参见 声明 部分) 用于
解决解析冲突如下:

1. 优先级和结合性与每个语法规则相关联; 它是
规则主体中最后一个标记或文字的优先级和关联性。 如果
%精确 关键字被使用,它会覆盖这个默认值。 一些语法规则可能不会
具有优先级和结合性。

2.如果有shift/reduce冲突,语法规则和输入符号
具有与它们相关联的优先级和关联性,那么冲突就解决了
支持与更高优先级相关的操作(移位或减少)。 如果
优先级相同,则使用结合性; 左联想暗示
减少,右结合意味着转移,非结合意味着错误
正在解析的字符串。

3. 当存在规则 2 无法解决的 shift/reduce 冲突时,shift 为
完毕。 以这种方式解决的冲突被计入描述的诊断输出中
误差 处理.

4.当存在reduce/reduce冲突时,通过语法规则进行reduce
出现在输入序列的较早位置。 以这种方式解决的冲突计入
中描述的诊断输出 误差 处理.

通过优先级或关联性解决的冲突不应计入移位/减少
并减少/减少报告的冲突 雅克 在标准错误或
描述文件。

误差 处理
代币 错误 应保留用于错误处理。 名字 错误 可用于
语法规则。 它指示解析器可以从语法错误中恢复的位置。 这
默认值 错误 应为 256。它的值可以使用 %令牌 宣言。
词法分析器不应返回值 错误.

当解析器处于与动作相关联的状态时,它应检测到语法错误
前瞻符号是 错误. 语义操作可以导致解析器启动
通过执行宏 YYERROR 进行错误处理。 当 YYERROR 被执行时,语义
action 将控制权交还给解析器。 YYERROR 不能在语义之外使用
动作。

当解析器检测到语法错误时,它通常会调用 yy错误() 与字符
绳子 “句法 错误” 作为其论据。 如果解析器仍然存在,则不应进行调用
当检测到错误时从先前的错误中恢复。 解析器被认为是
从先前的错误中恢复,直到解析器移动了至少三个
自检测到最后一个错误或已执行语义操作以来的正常输入符号
耶罗克. 解析器不应调用 yy错误() 执行 YYERROR 时。

如果检测到语法错误,则宏函数 YYRECOVERING 应返回 1
解析器尚未完全从中恢复。 否则,将返回零。

当解析器检测到语法错误时,解析器应检查先前的语法是否
已检测到错误。 如果检测到先前的错误,并且没有正常的输入符号
自从检测到前面的错误后已经被转移,解析器检查是否
前瞻符号是一个终结符(见 接口 词法 分析仪)。 如果是,则
解析器应返回一个非零值。 否则,前瞻符号应为
丢弃并恢复正常解析。

当 YYERROR 被执行或解析器检测到语法错误并且没有之前的错误时
已被检测到,或至少一个正常输入符号自前一
检测到错误,解析器应一次弹出一个状态,直到解析堆栈
空或当前状态允许转移 错误. 如果解析器清空解析
堆栈,它将返回一个非零值。 否则,将转移 错误
然后恢复正常解析。 如果解析器在错误发生之前读取了一个先行符号
检测到,当解析恢复时,该符号仍应为先行符号。

耶罗克 在语义动作中将导致解析器表现得好像它已经完全
从任何先前的错误中恢复。 宏 清蛋白 将导致解析器丢弃
当前的前瞻标记。 如果当前的前瞻标记还没有被读取,
清蛋白 将无效。

宏 YYACCEPT 将使解析器返回零值。 宏 YYABORT
将导致解析器返回一个非零值。

接口 词法 分析仪
伊莱克斯() 函数是一个整数值函数,它返回一个 象征
代表读取的令牌类型。 如果存在与令牌关联的值
由...返回 伊莱克斯()(见讨论 行李牌 以上),它应分配给
外部变量 伊尔瓦尔.

如果解析器和 伊莱克斯() 不同意这些令牌号,可靠通信
它们之间不能发生。 对于(单字节字符)文字,标记只是
当前字符集中字符的数值。 其他代币的数字
可以选择 雅克,或由用户选择。 在任何一种情况下, #定义 建设
的 C 用于允许 伊莱克斯() 象征性地返回这些数字。 这 #定义 声明
被放入代码文件和头文件(如果该文件被请求)。 一套
允许的字符 雅克 在标识符中大于 C. Token 允许的
发现包含此类字符的名称不应包含在 #定义 声明。

如果令牌编号由 雅克, 应分配除文字以外的标记
大于 256 的数字,尽管没有暗示顺序。 可以显式分配令牌
一个数字,在它第一次出现在声明部分后带有一个数字。
未以这种方式定义的名称和文字保留其默认定义。 所有代币号
分配人 雅克 应该是唯一的,并且区别于用于文字和
用户分配的令牌。 如果重复的令牌号导致解析器生成冲突,
雅克 会报错; 否则,未指定令牌分配是否为
接受或报告错误。

输入的结尾由一个特殊的标记标记,称为 终结者,它有一个令牌
为零或负数的数字。 (这些值对于任何其他令牌都是无效的。)所有
词法分析器在到达结束时应返回零或负数作为标记数
他们的输入。 如果令牌最多但不包括结束标记形成一个结构
匹配开始符号,解析器应接受输入。 如果在
任何其他上下文,都应视为错误。

完成 曲目
此外 yy解析()和 伊莱克斯()、函数 yy错误()和 () 必须
做一个完整的程序。 该应用程序可以提供 ()和 yy错误() 或那些
例程可以从 雅克 图书馆。

Yacc 自学资料库
以下功能只出现在 雅克 图书馆可通过 -l y
操作数 c99; 因此,它们可以通过符合要求的应用程序重新定义:

INT (无效)
此函数应调用 yy解析() 并以未指定的值退出。 其他行为
在这个函数中是未指定的。

INT yy错误(常量 坦克 *s)
此函数应将 NUL 终止的参数写入标准错误,然后是
一种.

的顺序 -l y-l l 给定的操作数 c99 意义重大; 申请须
要么提供自己的 () 函数或确保 -l y 先于 -l l.

调试 分析器
生成的解析器 雅克 应该有诊断设施,可以选择
在编译时或运行时启用(如果在编译时启用)。 这
运行时调试代码的编译在预处理器 YYDEBUG 的控制下
象征。 如果 YYDEBUG 具有非零值,则应包括调试代码。 如果它是
值为零,则不应包含代码。

在包含调试代码的解析器中,外部 INT 调试
用于在运行时打开(使用非零值)和关闭(零值)调试。 这
的初始值 调试 应为零。

什么时候 -t 指定,代码文件应构建为,如果 YYDEBUG 尚未
在编译时定义(使用 c99 -D YYDEBUG 选项,例如),YYDEBUG 应
明确设置为 1。当 -t 未指定,代码文件应构建为,
如果 YYDEBUG 尚未定义,则应将其明确设置为零。

调试输出的格式未指定,但至少包含足够的信息
确定移位和减少动作,以及输入符号。 它还提供
有关错误恢复的信息。

算法
构造的解析器 雅克 实施一个 拉尔比(1) 中记载的解析算法
文献。 未指定解析器是表驱动的还是直接编码的。

生成的解析器 雅克 绝不能请求输入符号 伊莱克斯() 而在
状态除了错误操作之外的唯一操作是通过单个规则减少的状态。

解析理论的文献定义了这些概念。

极限
雅克 实用程序可能有几个内部表。 这些表的最小最大值
如下表所示。 这些值的确切含义是实现-
定义。 实现应定义这些值之间的关系以及
它们以及实现可能会生成的任何错误消息,如果它用完
任何内部结构的空间。 一个实现可以组合这些资源的组
只要用户可用的总数不低于总和
本节规定的尺寸。

工作台: 内部 极限 in 雅克

┌────────────┬────────────┬────────────────────────────── ──────┐
│ │ 最低限度 │ │
限制最大产品描述
├────────────┼───────────┼──────────────────────────── ──────┤
│{NTERMS} │ 126 │ 令牌数。 │
│{NNOTERM} │ 200 │ 非终结符的数量。 │
│{NPROD} │ 300 │ 规则数。 │
│{NSTATES} │ 600 │ 状态数。 │
│{MEMSIZE} │ 5200 │ 规则长度。 总│
│ │ │ 长度,以名称(记号和 │
│ │ │ 非终结符),所有的 │
│ │ │ 语法规则。 │
│ │ │ 左侧为 │
│ │ │ 每条规则,即使不是│
│ │ │ 明确重复,如 │
│ │ │ 指定于 语法 规则 in
│ │ │ 雅克。 │
│{ACTSIZE} │ 4000 │ 动作次数。 《行动》│
│ │ │ 这里(和描述中 │
│ │ │ file) 参考解析器动作 │
│ │ │(移位、减少等)不是 │
│ │ │ 到 │ 中定义​​的语义动作
│ │ │ 语法 规则 in 雅克。 │
└────────────┴────────────┴────────────────────────────── ──────┘

退出 状态


应返回以下退出值:

0 成功完成。

>0 发生错误。

后果 OF 错误


如果遇到任何错误,运行将中止并 雅克 以非零状态退出。
可能会产生部分代码文件和头文件。 中的摘要信息
如果出现以下情况,则应始终生成描述文件 -v 标志存在。

以下 部分 ,那恭喜你, 内容丰富。

申请须知 用法


历史实现在名称上遇到名称冲突 yacc.tmp文件, yacc.acts,
yacc调试, y.tab.c, y.tab.hy.输出 如果多于一份 雅克 正在运行
一次一个目录。 这 -b 添加了选项以解决此问题。 这
允许多个的相关问题 雅克 要放置在同一文件中的解析器是
通过添加一个 -p 覆盖先前硬编码的选项 yy 变量前缀。

的描述 -p 选项指定最小的函数和变量名称集
当多个解析器链接在一起时会导致冲突。 YYSTYPE 不需要
改变了。 相反,程序员可以使用 -b 为不同的解析器提供头文件
不同的名称,然后是带有 伊莱克斯() 对于给定的解析器可以包括
该解析器的标头。 名称如 清除错误 不需要更改,因为它们
仅在动作中使用; 他们没有联系。 有可能是一个
实现有其他名称,要么是用于实现事物的内部名称,例如
清除错误,或提供它想要改变的非标准功能 -p.

与二元运算符具有相同标记的一元运算符通常需要它们
调整了优先级。 这是由 %精确 与相关的咨询符号
定义该一元运算符的特定语法规则。 (看 语法 规则 in 雅克.)
应用程序不需要将此运算符用于一元运算符,但语法
不需要它的很少见。

示例


访问 雅克 库是通过库搜索操作数获得的 c99. 要使用
雅克 图书馆 ():

c99 y.tab.c -l y

两个 图书馆和 雅克 库包含 (). 要访问 雅克 ():

c99 y.tab.c 词法.yy.c -l y -l l

这确保了 雅克 首先搜索库,以便它的 () 用来。

历史 雅克 库包含两个通常编码的简单函数
由应用程序员。 这些函数类似于以下代码:

的#include
INT 主要(无效)
{
外部 INT yyparse();

设置区域设置(LC_ALL,“”);

/* 如果下面的解析器是由 lex 创建的,则
应用程序必须小心确保 LC_CTYPE
和 LC_COLLATE 设置为 POSIX 语言环境。 */
(无效)yyparse();
返回(0);
}

#包括

int yyerror(const char *msg)
{
(void) fprintf(stderr, "%s\n", msg);
返回(0);
}

基本原理


中的参考 被引用 文件 可能有助于构建解析器
发电机。 引用的 DeRemer 和 Pennello 文章(连同它的作品)
参考文献)描述了一种生成符合此卷的解析器的技术
POSIX.1-2008。 这方面的工作仍在继续进行,因此实施者应咨询
在进行任何新的实现之前,先了解当前的文献。 原始的 Knuth 文章是
这种解析器的理论基础,但它生成的表是不切实际的
large 用于合理的语法,不应使用。 “相当于”的说法是
有意确保最好的表 拉尔比(1) 可以生成。

语法类别之间存在混淆,生成所需的算法
解析器,以及解析语言所需的算法。 他们都是有道理的
正交。 特别是,一个接受全范围的解析器生成器 LR(1)
语法不需要生成比接受表更复杂的表 单反相机(1) (一
LR 文法的相对较弱的类别)对于恰好是的文法 单反相机(1). 这样一个
实施也不需要承认这种情况; 表压缩可以产生 单反相机(1)
表(或比那个更小的表)而没有意识到语法是 单反相机(1)。 该
速度 LR(1) 任何类的解析器更多地依赖于表表示和
压缩(或代码生成,如果生成直接解析器)而不是类
表生成器处理的语法。

解析器生成器的速度在某种程度上取决于它的语法类别
处理。 然而,用于构建 LR 解析器的原始 Knuth 文章算法是
其作者认为当时速度慢得不切实际。 虽然满LR更多
拉尔比(1),随着计算机速度和算法的提高,差异(就
可接受的挂钟执行时间)变得不那么重要了。

潜在作者被警告引用的 DeRemer 和 Pennello 文章
之前引用的识别错误(对计算的过度简化) 拉尔比(1)
前瞻集)在一些 拉尔比(1) 之前的算法语句
出版物。 他们应该花时间去寻找那篇论文,以及当前相关的
工作,尤其是 Aho 的。

-b 添加了选项以提供一种可移植的许可方法 雅克 继续努力
同一目录中的多个单独的解析器。 如果一个目录包含多个
雅克 文法,并且两个文法是同时构造的(例如,通过
并行 使 程序),冲突结果。 虽然解决方案不是历史实践,
它纠正了历史实现中的一个已知缺陷。 相应的变化是
对引用文件名的所有部分进行 y.tab.c (现在是“代码文件”),
y.tab.h (现在是“头文件”),以及 y.输出 (现在是“描述文件”)。

语法为 雅克 输入基于 System V 文档。 文字说明
那里表明 ';' 在规则的末尾是必需的。 语法和
实现不需要这个。 (指某东西的用途 C_标识符 导致减少发生在
正确的地方。)

此外,在该实现中,诸如 %令牌 可以被终止
,但这在语法上是不允许的。 关键字如 %令牌 能够
也以大写形式出现,这里不再讨论。 在大多数地方 '%' 用来,
可以替换,并且某些符号有替代拼写
(例如, %剩下“%<” 甚至 “\<”).

从历史上看,行李牌> 可以包含任何字符,除了 '>',包括空白,在
执行。 然而,由于 行李牌 必须引用 ISO C 标准联合成员,在
实践一致的实现只需要支持 ISO C 的字符集
在这种情况下的标准标识符。

已知一些历史实现接受由
时期。 历史实现通常允许 '$' 在名称中。 一致的实现
不需要支持这两种行为中的任何一种。

决定何时使用 %精确 说明了指定行为的困难 雅克.
可能会出现以下情况 语法 严格来说并没有错误,但
雅克 无法清楚地解释它。 解决语法中的歧义可以
在许多情况下可以通过提供附加信息来解决,例如使用 %类型 or
%联盟 声明。 它通常更容易,并且通常会产生更小的解析器
在适当的时候这个替代方案。

没有运行时调试代码生成的程序的大小和执行时间是
在历史实现中通常更小且稍快。

来自多个历史实现的统计消息包括以下类型
信息:

n/512个终端, n/300 非终结符
n/600 语法规则, n/1500 个州
n 移位/减少, n 减少/减少报告的冲突
n/350 个工作组使用
记忆:状态等。 n/15000,解析器 n/ 15000
n/600 个不同的前瞻集
n 额外关闭
n 转移条目, n 例外
n 转到条目
n goto 默认保存的条目
使用的优化器空间:输入 n/15000, 输出 n/ 15000
n 表条目, n
最大点差: n, 最大偏移: n

描述文件中的内部表报告是由实现定义的
因为这些限制的所有方面也是实现定义的。 一些实现
可以使用动态分配技术并且没有要报告的特定限值。

的格式 y.输出 没有给出文件,因为没有指定格式
增强应用程序的可移植性。 该列表主要是为了帮助人类
用户理解和调试解析器; 用于 y.输出 通过符合要求的应用程序脚本
会不寻常。 此外,实现没有产生一致的输出,也没有
流行的格式是显而易见的。 实现选择的格式应该是human-
可读,除了要求它是一个文本文件。

标准错误报告没有具体描述,因为它们很少用于
符合应用程序,没有理由限制实现。

一些实现认识到 “={” 相当于 '{' 因为它出现在历史
文档。 这种结构早在很久以前就被认可和记录为过时
1978 年,在参考 雅克: 然而 另一个 编译器-编译器. 本卷 POSIX.1-2008
选择让它过时并省略它。

多字节字符应该被词法分析器识别并作为标记返回。
它们不应作为多字节字符文字返回。 令牌 错误 使用的
在历史实现中,错误恢复通常被赋予值 256。
因此,在许多多字节字符集中使用的令牌值 256 不是
可用作用户定义令牌的值。

未来 如何前往


没有。

使用 onworks.net 服务在线使用 yaccposix


免费服务器和工作站

下载 Windows 和 Linux 应用程序

  • 1
    itop - ITSM CMDB 开源
    itop - ITSM CMDB 开源
    IT 运营门户:完全开放
    源,ITIL,基于 Web 的服务
    管理工具,包括一个完全
    可定制的 CMDB、帮助台系统和
    一个文件人...
    下载 itop - ITSM CMDB OpenSource
  • 2
    克莱门汀
    克莱门汀
    Clementine 是一种多平台音乐
    玩家和图书馆组织者的灵感来自
    阿玛洛克 1.4。 它有一个快速和
    易于使用的界面,并允许您
    搜索和...
    下载克莱门汀
  • 3
    西马
    西马
    注意:累积更新 2.4.3 有
    被释放了!! 该更新适用于任何
    以前的 2.xx 版本。 如果升级
    从 v1.xx 版本开始,请下载并
    我...
    下载 XISMuS
  • 4
    黑脸
    黑脸
    模块化头部跟踪程序
    支持多种面部跟踪器、过滤器
    和游戏协议。 在跟踪器中
    是 SM FaceAPI,AIC 惯性头
    追踪器...
    下载 facetracknoir
  • 5
    PHP 二维码
    PHP 二维码
    PHP 二维码是开源的 (LGPL)
    用于生成二维码的库,
    二维条码。 基于
    libqrencode C 库,提供 API
    创建二维码条...
    下载 PHP 二维码
  • 6
    自由文明
    自由文明
    Freeciv 是一款免费的回合制游戏
    多人策略游戏,其中每个
    玩家成为领导者
    文明,争取获得
    最终目标:成为...
    下载免费文明
  • 更多 ”

Linux 命令

Ad