我正在开发一个项目来制作超级基本编程语言以获得乐趣。我正在处理打印命令,它有2个不同的选项,直接打印或从堆栈打印。程序已经有了堆栈中的项目,但是只要它运行从堆栈打印的打印命令,它就会跳过它。这是我的代码:
if (String.Equals(cmds[pos], "print"))
{
if (cmds[pos + 1].StartsWith("\""))
{
Console.Write(cmds[pos + 1].Replace("\"", "").Replace(@"\q", "\"").Replace(@"\n", "\n"));
outPos = pos + 2;
}
else if (string.Equals(cmds[pos + 1], "stack"))
{
Console.WriteLine(strStack.Pop());
outPos = pos + 2;
}
else
{
//Console.WriteLine("HelloKreeKraw");
outPos = pos + 1;
}
}
以下是命令:
push "Hi\n"
throw stack
push "Hello"
print stack
print "World!\n"
end
push命令推送到堆栈,end命令结束程序。程序无缘无故地跳过打印堆栈。除非我错过了一些东西,否则我测试了它可以做的一切?
编辑: string.replace和cmds [pos + 1] .StartsWith(" \"")工作正常,但是当它检查第二个字是堆栈时,它会随机出现故障。我已经发现了这种情况。
答案 0 :(得分:0)
如果你想学习,你需要拿一本关于Lex和YACC / Bison的书。基本上标准编译器理论在这里没有使用。你需要建立你的语法,(命令 - >变量 - >新行),然后创建你的词法分析器来识别你的标记。解析令牌以发出代码/选项是一个更好的方法。
顺便说一下,如果你正在使用C#,你可以通过在代码中首先构建表达式树然后只在结束时执行它来获得一些真正的乐趣。更接近于构建真正的编译器:)。
然后最简单的方法是在您的实现上使用递归下降(而不是嵌套ifs ...)来执行您要执行的操作。我们可以与您一起修复您的字符串处理,但这是一个解决的问题,有一些更好的工具可以帮助您。