问题标签 [symbol-tables]

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.

0 投票
10 回答
87329 浏览

algorithm - 二叉树 vs. 链表 vs. 哈希表

我正在为我正在处理的项目构建符号表。我想知道人们对存储和创建符号表的各种方法的优缺点有何看法。

我进行了相当多的搜索,最常见的推荐是二叉树或链表或哈希表。以上所有的优点和缺点是什么?(在 C++ 中工作)

0 投票
3 回答
1059 浏览

ruby - Ruby 中的符号表与其他语言中的符号表有什么不同

符号表上的维基百科条目是一个很好的参考:

http://en.wikipedia.org/wiki/Symbol_table

但是当我尝试理解 Ruby 中的符号以及它们在符号数组中的表示方式(由Symbol.all_symbols方法返回)时,

我想知道 Ruby 的符号表方法与其他语言是否有任何重要区别?

0 投票
5 回答
3218 浏览

go - Go中没有符号表?

谷歌的新语言“Go”在其网站上说:

该语言的设计易于分析,无需符号表即可解析

我当然不是这些问题的专家,但我认为符号表是所有使用变量的语言的编译器通用的基本结构,而 Go 显然使用变量。我不明白什么?

0 投票
1 回答
968 浏览

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 减号程序,

范围:

最基本的方法具有全局范围和声明的每个函数的范围。该语言允许在任何复合语句中声明,即范围嵌套。实现这一点需要某种范围编号或堆叠方案。(堆叠最适合一次性编译器,这是我们正在构建的。)

0 投票
3 回答
2313 浏览

c - 如何创建符号表?

我可以使用 malloc 添加符号表条目吗?如何遍历表以检查是否已经存在某些内容?

0 投票
4 回答
33941 浏览

gdb - 什么是符号表,它是如何集成到可执行文件中的?

当我尝试调试可执行文件时:

这到底是什么意思?

符号表是否附加到可执行文件中?

0 投票
2 回答
2442 浏览

scope - 符号表与静态链和作用域有何关系?

我现在正在学习编程语言原理课程,但我一生都无法弄清楚这一点。这不是作业,只是一个一般概念问题。

在我们的课程中,我们讨论了静态链和显示。我想我明白为什么我们需要这些。否则当我们有嵌套方法时,当我们有嵌套方法时,我们无法弄清楚我们在谈论什么变量。

我的教授还谈到了符号表。我的问题是符号表是做什么用的?它与静态链有什么关系?

我会提供一些背景信息(如果我错了,请纠正我)。


(我将定义一些东西只是为了使解释更容易)

假设我们有这样的代码:

而这个堆栈:


静态链的快速描述作为复习。

静态链用于查找在内部函数中重新定义变量时应该使用哪个变量。在上面显示的堆栈中,每个帧都有一个指向包含它的方法的指针。所以:

(假设静态范围,对于动态范围,我认为每个堆栈帧都将指向它下面的那个)

我认为当我们在方法print(<something>)内部执行时innerA会发生这种情况:


符号表快速复习

我不太确定符号表的用途。但这就是它的样子:

  • 链接到下一个 - 如果多个事物具有相同的哈希值,则这是一个链接
  • name - 元素的名称(例如:i、j、a、int)
  • 类型 - 事物是什么(例如:变量、函数、参数)
  • 范围级别 - 不是 100% 确定这是如何定义的。我觉得:
    • 0 将是内置的
    • 1 将是全局变量
    • 2 将是主要方法
    • 3 将是 a 和 b
    • 4将是innerA

只是为了重申我的问题:

  • 符号表是干什么用的?
  • 它与静态链有什么关系?
  • 为什么我们需要静态链,因为范围信息在符号表中。
0 投票
2 回答
781 浏览

lisp - 在 Common Lisp 中访问活动符号表

我听说活动符号表可以在 Common Lisp 运行时中访问。我误解了吗?

0 投票
2 回答
6875 浏览

perl - 为什么这个 Perl 会产生“Not a CODE reference”?

我需要在运行时从 Perl 符号表中删除一个方法。我尝试使用 来执行此操作undef &Square::area,它确实删除了该功能,但留下了一些痕迹。具体来说,当$square->area()被调用时,Perl 抱怨它是“不是代码引用”而不是“未定义的子例程 &Square::area called”,这是我所期望的。

你可能会问,“为什么重要?你删除了这个函数,你为什么要调用它?” 答案是我不叫它,Perl 是。Square 继承自 Rectangle,我希望继承链传递$square->area&Rectangle::area,但不是跳过该方法不存在的 Square 然后落入 Rectangle 的 area(),而是方法调用以“不是 CODE 引用”而终止。

奇怪的是,这似乎只发生在 &Square::area 由 typeglob 赋值定义时(例如*area = sub {...})。如果函数是使用标准sub area {}方法定义的,则代码将按预期工作。

同样有趣的是,取消定义整个 glob 按预期工作。只是不取消定义子程序本身。

这是一个简短的示例,说明了症状,并与正确的行为形成对比:

更新:我已经使用 Package::Stash 解决了这个问题(感谢@Ether),但我仍然对它首先发生的原因感到困惑。perldoc perlmod说:

package main;

sub Some_package::foo { ... } # &foo defined in Some_package

这只是编译时 typeglob 赋值的简写:

BEGIN { *Some_package::foo = sub { ... } }

但它似乎不仅仅是简写,因为两者在取消定义函数后会导致不同的行为。如果有人能告诉我这是(1)不正确的文档,(2)perl中的错误,还是(3)PEBCAK,我将不胜感激。

0 投票
2 回答
851 浏览

c - 如何为不同的词汇级别构建符号表?

我正在为类 C 语言构建编译器。我已经完成了词法分析器和解析器。现在,我正在尝试进行语义分析并尝试构建符号表。现在,根据规范,在同一词汇级别中不允许重复声明。这需要为每个词汇级别构建不同的符号表,对吗?我该怎么做呢?到目前为止,我拥有的一个符号表是二叉树的形式,其中每个节点如下所示:

如何将特定节点指向另一棵树的“根”节点?

任何帮助都会很棒!非常感谢。