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

C 编译器/解释器中的符号前瞻,c,compiler-construction,interpreter,C,Compiler Construction,Interpreter,在为一种简单的编程语言构建某种解释器时,我偶然发现了一个有趣的问题。我称之为“符号前瞻”问题 这是什么意思?例如,在C/C++编译器中,您将要使用的符号必须始终在代码上方的某个位置声明。像这样: struct int_pair; struct rectangle { int_pair position; int_pair size; }; struct int_pair { int x, y; }; 不是这样的: struct rectangle { int

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

这是什么意思?例如,在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时,了解代码中的符号是否引用函数、变量或其他东西是很有用的,这样解释器就可以决定下面的代码应该是什么样子,从而改进ALOTA。这要求这个符号已经在我的程序中声明了,但是我真的不喜欢这种“C”风格的编程。我想要的是Java或C#中的编程风格:声明可以在代码中的任何位置,不受特定顺序的约束,并且解释器可以在构建AST时依赖于符号的含义

解决这一问题的一种方法可能是构建某种前瞻算法,该算法在程序上飞行并捕获所有相关符号,而不是其他。但对我来说,这似乎是相当混乱和变通的

所以我的问题是,我想要用c#和Java的方式声明东西(参见上面的代码片段),但我自己想知道如何在解释器中实现这个特性因此,我要求提供一个想法/代码片段/算法/策略,让我能够预见符号及其含义。

非常感谢您的帮助。:)

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

明确语法的优点之一是,您可以创建一个AST,而无需进行任何类型分析,这意味着不需要预先声明。一旦有了AST,就可以通过遍历解析树进行任何分析,比如根据调用站点检查函数原型


没有必要同时进行所有的分析;你可以在树上行走任意次数。这样可以更容易地组织代码,并且不会造成任何重大开销。

垃圾发送无关的编程语言标记是让您的问题被否决和否决的最快方法之一,因此为了您自己的利益,不要这样做。为了帮助您,我为您删除了Java和C#标记。另外,如果你的问题是“语言不可知论”,那么就把它标记为语言不可知论,但同样,不要垃圾发送一堆语言标记,因为这会导致你的问题被迅速关闭。请使用正确的顺序。由于循环依赖性是不可能/禁止的(指针除外),因此始终会有正确的顺序。@气垫船谢谢,很高兴知道。谢谢!这帮了大忙。