Compilers/Interpreters 中的符号前瞻
Symbol Lookahead in Compilers/Interpreters
在为一种简单的编程语言构建某种解释器时,我偶然发现了一个有趣的问题。我称之为 "Symbol Lookahead" 问题。
这是什么意思?例如,在 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 时,了解代码中的 Symbol 是指函数还是变量或其他东西很有用,这样解释器就可以决定下面的代码应该是什么样子,这改善了很多事情。这要求这个符号已经在我的程序中的某处声明,但我真的不喜欢这种 "C" 风格的编程。我想要的是像 Java 或 C# 中的编程风格:声明可以在代码中的任何位置,您不受特定顺序的约束——解释器在构建 AST 时可以依赖于符号含义。
解决此问题的一种方法可能是构建某种先行算法,该算法会飞过程序并捕获所有相关符号,仅此而已。但对我来说,这似乎很混乱并且类似解决方法。
所以我的问题是,这需要 c# 和 Java 声明内容的方式(参见上面的代码片段),但我自己想出了如何在解释器中实现此功能。 所以我要求一个 idea/code snippet/algorithm/strategy 让我先看符号及其含义。
非常感谢您的帮助。 :)
Java 和 C# 的语法设计为即使您不知道子表达式(包括标识符)的类型,表达式(例如函数调用)也是明确的。 C不是那样设计的。
明确语法的优点之一是您可以在不进行任何类型分析的情况下创建 AST,这意味着不需要预先声明。一旦你有了 AST,你就可以做任何你想做的分析,比如通过遍历解析树检查函数原型和调用点。
并且不需要同时进行所有分析;您可以根据需要多次在树上行走。这使得组织代码变得更加容易,并且不会造成任何重大开销。
在为一种简单的编程语言构建某种解释器时,我偶然发现了一个有趣的问题。我称之为 "Symbol Lookahead" 问题。
这是什么意思?例如,在 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 时,了解代码中的 Symbol 是指函数还是变量或其他东西很有用,这样解释器就可以决定下面的代码应该是什么样子,这改善了很多事情。这要求这个符号已经在我的程序中的某处声明,但我真的不喜欢这种 "C" 风格的编程。我想要的是像 Java 或 C# 中的编程风格:声明可以在代码中的任何位置,您不受特定顺序的约束——解释器在构建 AST 时可以依赖于符号含义。
解决此问题的一种方法可能是构建某种先行算法,该算法会飞过程序并捕获所有相关符号,仅此而已。但对我来说,这似乎很混乱并且类似解决方法。
所以我的问题是,这需要 c# 和 Java 声明内容的方式(参见上面的代码片段),但我自己想出了如何在解释器中实现此功能。 所以我要求一个 idea/code snippet/algorithm/strategy 让我先看符号及其含义。
非常感谢您的帮助。 :)
Java 和 C# 的语法设计为即使您不知道子表达式(包括标识符)的类型,表达式(例如函数调用)也是明确的。 C不是那样设计的。
明确语法的优点之一是您可以在不进行任何类型分析的情况下创建 AST,这意味着不需要预先声明。一旦你有了 AST,你就可以做任何你想做的分析,比如通过遍历解析树检查函数原型和调用点。
并且不需要同时进行所有分析;您可以根据需要多次在树上行走。这使得组织代码变得更加容易,并且不会造成任何重大开销。