YACC

2025年7月1日 | 阅读3分钟
YACC
  • YACC 代表 Yet Another Compiler Compiler(又一个编译器编译器)
  • YACC 提供了一个工具,用于为给定的语法生成解析器。
  • YACC 是一个设计用来编译 LALR (1) 语法的程序。
  • 它用于生成由 LALR (1) 语法产生的语言的语法分析器的源代码。
  • YACC 的输入是规则或语法,输出是 C 程序。

编译器设计中 YACC 程序的组成部分

现在让我们逐一详细解释每个部分

定义:这些部分包含头文件和语法中使用的任何标记信息。它位于输入文件的顶部。在这里,标记使用模数符号定义。

规则:这定义了扫描标记时要采取的操作。

辅助例程:它包含 main() 函数,其中始终调用 yyparse() 函数。yyparse() 函数在读取标记、执行操作,然后在执行后返回到 main() 中起着重要作用。

关于 YACC 的一些重要点

YACC

输入:一个 CFG- file.y

输出:一个解析器 y.tab.c (yacc)

  • 输出文件 "file.output" 包含解析表。
  • 文件 "file.tab.h" 包含声明。
  • 解析器调用 yyparse ()。
  • 解析器期望使用一个名为 yylex () 的函数来获取标记。

基本操作顺序如下

YACC

此文件包含 YACC 格式的所需语法。

YACC 1

它显示了 YACC 程序。

YACC 2

它是 YACC 创建的 C 源代码程序。

YACC 3

C 编译器

YACC 4

可执行文件,将解析 gram.Y 中给出的语法

YACC 程序的例子

YACC 文件 (demo.y)

Lex 文件 (demo.l)

说明:在上面的例子中,我们创建了 2 个文件,例如 YACC 文件 (demo.y) 和 Lex 文件 (demo.l)。在此,要编译一个程序,打开一个终端并转到您保存文件的目录。之后,运行命令以生成 C 源代码文件,例如 "yacc -d demo.y"。这将创建两个输出文件,例如 y.tab.c 和 y.tab.h。这两个文件用于编译生成的 C 源代码文件,并将其与 C 编译器(例如 GCC "gcc -o demo y.tab.c -ly")使用的 Yacc 运行时库链接。最后,通过键入其名称并按回车键来运行已编译的程序

bash

./demo

YACC 程序中的错误处理

以下是用于 YACC 程序中错误处理的技术列表

  • YACC 允许定义 error 标记,该标记可用于处理语法中的错误。当程序中发生错误时,error 标记用于拒绝输入并继续解析。
  • YACC 允许解析器通过拒绝输入并继续解析来从错误中恢复。这对于处理意外输入很有用。
  • 它用于指示当程序中发生错误时将显示的错误消息。这可以帮助用户了解问题是什么以及如何解决问题。

关于 YACC 的常见问题解答

1. 在编译器设计中,术语 yyerror 的含义是什么?

这是一个用户定义的函数,用于在解析过程中处理语法错误。它基本上用于显示错误消息以进行调试。

2. 在编译器设计中,YACC 的含义是什么?

它由 Stephen C. Johnson 于 1970 年代开发。它充当一个用于语法规范的机器,并将其转换为能够将输入标记结构化为逻辑语法树的可执行代码。