c - C 中 JavaScript 非递归解析器的设计(高度内存受限)

标签 c parsing recursion

我们需要在 C 中实现 JavaScript 解析器,并且我们的目标是内存非常受限的平台;最受限制的部分是堆栈。

目前,我们有下降递归解析器,C 堆栈很容易被相当复杂的表达式溢出。因此,我们的目标是使 C 堆栈消耗不会随着表达式嵌套的增长而增长。

我能想到的唯一方法是维护我们自己的堆栈,而我们的解析器将只是一个带有大量标签和 goto 的巨大函数。它相当凌乱且不易维护;我们可以通过宏隐藏一些乱七八糟的东西,但无论如何,它会比通常的函数调用更乱。

然后:

  • 我们可以以更有效的方式实现堆栈(嵌入式编译器通常...不是很好)
  • 我们甚至可以使用分段堆栈(因为这里巨大的连续内存块非常昂贵)

没有其他方法可以实现它,我说得对吗?我的意思是,除了带有大量标签和 goto 的单一函数,以及我们自己手工制作的堆栈。

如果我错了,我很乐意听取您的建议。

最佳答案

当你写一个递归函数的时候,你必须要有栈。如果你机器的物理栈不够深,你需要换一种方式实现栈。

正如您所说:“维护我们自己的堆栈,我们的解析器将只是一个带有大量标签和 goto 的巨大函数。它相当困惑且不太易于维护”。

好吧,如果您遵守规则,它可维护的。每个“函数”调用都是通过将下一个程序位置推送到您已实现的伪堆栈来实现的。如果您将所有推送逻辑隐藏在子例程或宏中,它的可读性将与真正的函数调用一样。

关于c - C 中 JavaScript 非递归解析器的设计(高度内存受限),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427151/

相关文章:

iphone - 我应该避免 iPhone 上的递归吗?

sql - 如何将递归 CTE 转换为可在 SQL Server 2000 中使用

c++ - 在什么情况下应该使用匿名枚举?

c - 数字时钟 C 代码不会显示正确的时间

c - C 初学者 : Getting frustrated on a simple program

javascript - 将字符串转换为 JSON

c - 在 makefile 执行期间不创建可执行文件

python - 用 Python 解析 Java 源文件

java - 无法解析的日期异常,找不到 2014-11-28T13 :46:23-08:00 的模式

C-修复递归中的堆栈溢出