我正在研究用于交互式小说游戏的自定义编程语言。这种语言不是要编译的,它更像是一种像Python这样的解释语言。我正在用C#构建解析器。在构建这个解释器时,我遇到了关于如何在内存中表示范围的问题。我将每个变量存储在一个特殊的变量类中。
public class variable
{
public string str;
public DataType datatype; //an enum with all datatypes supported by the language
public int id;
private static int increment;
public variable(string str, DataType datatype)
{
this.str = str;
this.datatype = datatype;
this.id = increment;
increment++;
}
}
另外,我有一个特殊的范围类来保存特定范围内的变量:
public class scope
{
public List<variable> variables;
public scope()
{
variables = new List<variable>();
}
}
问题是,我可以使用什么样的数据结构来轻松存储这些范围,并快速遍历可从特定范围访问的所有范围(以及这些范围中的变量)?我需要一种像树一样的东西。
答案 0 :(得分:1)
传统上,范围由Stack
数据结构表示。它与大括号语法特别有效,因为你基本上可以在遇到{
时弹出新的并弹出}
。
就确定可用变量而言,一种非常简单(尽管是暴力)的方法是使用SelectMany
:
bool variableExists = currentScopes.SelectMany(s => s.Variables).Any(v => v.Value.Name == variableName);
另外,您实际上是在为解释语言编写解释器。解析所有编程语言。