问题标签 [yacc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parsing - 如何从 yacc 文件中创建解析器?
我得到了以下 yacc 文件。我如何用它制作解析器?我必须先制作扫描仪吗?
yacc - 这个 yacc 文件有什么问题?
当我在以下文件上运行 yacc -d parser.y 时,我收到以下错误:
我特别关心如何摆脱致命错误。
yacc - 这个程序的符号表是什么时候建立的
当我在以下 Makefile 上运行 make 时,符号表是什么时候构建的,如果它甚至是?
yacc - 完成此编程作业需要执行哪些步骤?
我很难理解我应该做什么。我唯一想到的是我需要在 cminus.y 文件上使用 yacc。我对之后的一切都感到困惑。有人可以以不同的方式向我解释这一点,以便我了解我需要做什么吗?
介绍:
我们将使用 lex/flex 和 yacc/Bison 来生成 LALR 解析器。我会给你一个名为 cminus.y 的文件。这是一个 yacc 格式的语法文件,用于一种名为 C-minus 的简单的类 C 语言,来自 Kenneth C. Louden 的 Compiler Construction 一书。我认为语法应该是相当明显的。雅虎组有几个关于如何使用 yacc 的描述的链接。既然您知道了 flex,那么学习 yacc 应该是相当容易的。唯一的基本类型是 int。一个 int 是 4 个字节。布尔值作为整数处理,就像在 C 中一样。(实际上,语法允许您将变量声明为 void 类型,但我们不要这样做。)您可以拥有一维数组。没有指针,但对数组元素的引用应被视为指针(如在 C 中)。该语言提供赋值、IF-ELSE、WHILE 以及函数调用和返回。我们希望我们的编译器输出 MIPS 汇编代码,然后我们将能够在 SPIM 上运行它。对于像这样没有优化的简单编译器,IR 应该不是必需的。我们可以一次直接输出汇编代码。然而,我们的第一步是生成一个符号表。
符号表:
我喜欢 Barrett 博士在这里的方法,它使用大量指针来处理不同类型的对象。本质上,符号表的元素是标识符、类型和指向属性对象的指针。属性对象的结构会根据类型而有所不同。我们只有少数类型需要处理。我建议至少在开始时使用线性搜索来查找表中的符号。如果您想要更好的性能,您可以稍后将其更改为散列。(如果你想保留在 C 中,你可以使用 malloc 动态分配对象。)首先你需要列出所有不同类型的符号 - 数量不多 - 以及哪些属性是必要的每个。确保允许添加新属性,因为我们尚未涵盖所有问题。看语法,函数的参数列表问题是需要在设计中投入一些思考的地方。我建议更多的符号表条目和指针。
测试:
语法是正确的,因此采用现有语法并生成解析器,解析器将接受正确的 C 减号程序,但不会产生任何输出,因为没有与规则关联的代码片段。我们想添加代码片段来构建符号表并打印信息。声明标识符时,应打印输入符号表的信息。如果在同一范围内找到了相同符号的先前声明,则应打印错误消息。引用标识符时,您应该在表中查找它以确保它存在。如果尚未在当前范围内声明,则应打印错误消息。关闭范围时,应为未引用的标识符生成警告。您的测试输入应该是格式正确的 C 减号程序,
范围:
最基本的方法具有全局范围和声明的每个函数的范围。该语言允许在任何复合语句中声明,即范围嵌套。实现这一点需要某种范围编号或堆叠方案。(堆叠最适合一次性编译器,这是我们正在构建的。)
yacc - Bison/Yacc,让文字标记返回自己的值?
以下是我的规则,当我用 '=' 替换 $2 时,我的代码有效。我知道默认情况下所有文字标记都使用它们的 ascii 值(因此为什么多字符标记需要定义)
以下不起作用。该函数使用 0 而不是我期望的'='调用。我可以设置一个选项吗?(通过手册页并没有这样显示)
在另一段代码中,我有MathOp: '=' | '+' | '%' ...
因此我感兴趣的原因。
compiler-construction - 这个程序语法是否只识别名称为“ID”的变量?
我需要在 lex/flex 中创建一个扫描仪来查找令牌,并在 yacc/bison 中创建一个解析器来根据以下语法处理这些令牌。当我在制作扫描仪的过程中,在我看来,这种语言中的变量、函数和数组只能有名称“ID”。我误读了这个 yacc 文件吗?
yacc - 如何判断 yacc 文件中是否按字面意思解释某些内容?
在下面的文件中,INT 是按字面意思理解的,而 ID 不是吗?你怎么知道?
yacc - 词法分析器如何返回解析器使用的语义值?
是否总是需要这样做?它是什么样子的?
parsing - 如何把它变成一个解析器
如果我只是添加到以下 yacc 文件中,它会变成解析器吗?
grammar - 为什么我在使用 flex 和 yacc 编写的程序中出现语法错误?
我制作了一个应该识别简单语法的程序。当我输入我认为应该是有效的陈述时,我得到一个错误。具体来说,如果我输入
诠释一个;
诠释 b;
它不起作用。在我输入 int a; 程序回响;由于某些原因。然后当我输入 int b; 我收到语法错误。
lex 文件:
yacc 文件: