【发布时间】:2019-11-26 17:19:49
【问题描述】:
所以基本上我正在尝试为一种玩具语言制作一个interperter,以便更多地了解它们的工作原理等等,我现在正忙于检索存储的变量。
起初我使用了一个字典,其中键和值都是string 类型。但是在遇到问题后,我做了很多尝试来解决它。我认为Dictionary 是问题所在,我自己上了课,但效果并没有好,所以我又回到了字典。
我有一个名为"Test.txt" 的文本文件,其中代码被写入其中,然后由词法分析器读取。词法分析器生成标记,然后将其传递给解析器等。
// '%' for declaring a variable
// that can be either a string and a number
// Code form "Test.txt"
%var = 100
print %var
//the assignment works fine, but the printing doesnt.
词法分析器从变量中生成一个string 标记,如下所示:VAR:%var 然后我将其发送到解析器。
然后我们有 DoPRINT 方法,它将打印从解析器给出的令牌,这不稳定。我将在变量检索工作后进行处理。然后我们有一个名为Symbols 的字典,其中包含用于添加和检索的对应方法
private void AssignVAR(String VarName, String VarValue)
{
Symbols[VarName] = VarValue;
}
private String GetVAR(String VarName)
{
if(Symbols.ContainsKey(VarName))
return Symbols[VarName];
else
return "Undefined Variable: " + VarName;
}
private void DoPRINT(String ToPrint)
{
if(ToPrint.Substring(0, 6) == "STRING")
// initially = 'STRING:"<text>"'
Console.WriteLine(ToPrint.Substring(8, ToPrint.Length - 9));
else if(ToPrint.Substring(0, 3) == "NUM")
// initially = 'NUM:<number>'
Console.WriteLine(ToPrint.Substring(4));
else if(ToPrint.Substring(0, 4) == "EXPR")
// initially = 'EXPR:<expression>'
Console.WriteLine(Core.EvaluateEXPR(ToPrint.Substring(5)).ToString());
else if(ToPrint.Substring(0, 3) == "VAR")
// initially = "VAR:%var"
// when the "Symbols" are printed out
// the name is "%var" which is the same
// as the substring below
Console.WriteLine(GetVAR(ToPrint.Substring(4)));
}
我希望输出是我将变量分配给"100" 但在执行时我只得到"Undefined Variable: %var" 即使我打印出符号的内容我得到%var 如果我打印出什么GetVAR()函数作为输入,也是%var为什么又返回"Undefined Variable: %var"
【问题讨论】:
-
听起来问题不在于您提供的代码,而在于调用它的代码。
-
当您在
GetVAR中设置断点并检查调试器中的值时会发生什么?字典是否包含键%var和值100?另外,我们在这里假设print调用GetVAR,对吗?也许你也应该发布。 -
另外,你真的应该做一些参数验证——你的方法对不一定有效的输入做出假设。如果
ToPrint.Length < 6,ToPrint.Substring(0, 6)将抛出ArgumentOutOfRangeException。 -
@RufusL 我没有得到
ArgumentException它只是覆盖了已经分配的值。然后到ToPrint.Substring(0, 6),长度永远不会小于6,因为词法分析器添加了标记STRING:"<text>",所以它只检查它是否是STRING标记,然后在没有STRING:和"引号的情况下打印它/跨度> -
根据您的 cmets,词法分析器也可能通过
"NUM:5",这将在第一个if条件下引发异常。
标签: c# parsing data-retrieval storing-data