gpt4 book ai didi

c - 编译器/解释器中的符号前瞻

转载 作者:行者123 更新时间:2023-11-30 19:59:29 24 4
gpt4 key购买 nike

在为简单的编程语言构建某种解释器时,我偶然发现了一个有趣的问题。我称之为“符号前瞻”问题。

我这是什么意思?例如,在 C/C++ 编译器中,您将要使用的符号必须始终已在代码上方的某处声明。像这样:

struct int_pair;

struct rectangle {
int_pair position;
int_pair size;
};

struct int_pair {
int x, y;
};

而不是这样:

struct rectangle {
int_pair position;
int_pair size;
};

struct int_pair {
int x, y;
};

在 C# 或 Java 中,可以在文件中的任意位置使用任何符号:

public class Rectangle {
private IntPair position, size; // using IntPair before declaring it
}

public class IntPair {
public int Sum() { // using x and y before declaring it
return x + y;
}

public int x, y;
}

那么我的问题是什么?

我发现,在构建 AST 时,了解代码中的符号是否引用函数、变量或其他东西很有用,这样解释器就可以决定以下代码应该是什么样子,哪个改善了很多事情。这要求这个符号已经在我的程序中的某个地方声明,但我真的不喜欢这种“C”风格的编程。我想要的是像 Java 或 C# 那样的编程风格:声明可以位于代码中的任何位置,不受特定顺序的限制 - 并且解释器在构建 AST 时可以依赖于符号含义。

解决这个问题的一种方法可能是构建某种先行算法,该算法会飞越程序并捕获所有相关符号,而不是其他任何东西。但对我来说,这看起来相当困惑并且类似于解决方法。

所以我的问题是,需要使用 C# 和 Java 方式来声明内容(请参阅上面的代码片段),但我自己弄清楚如何在解释器中实现此功能。 所以我要求一个想法/代码片段/算法/策略,让我可以预见符号及其含义。

非常感谢您的帮助。 :)

最佳答案

Java 和 C# 的语法设计方式使得即使您不知道子表达式(包括标识符)的类型,表达式(例如函数调用)也是明确的。 C 不是这样设计的。

明确语法的优点之一是您可以在不进行任何类型分析的情况下创建 AST,这意味着不需要预先声明。一旦你有了 AST,你就可以做任何你想做的分析,比如通过遍历解析树来检查函数原型(prototype)和调用点。

并且无需同时进行所有分析;您可以根据需要多次行走这棵树。这使得组织代码变得更加容易,并且不会造成任何重大开销。

关于c - 编译器/解释器中的符号前瞻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58903689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com