我正在试图编写一个编程语言的解析器。我现在是练习的一部分,我们需要确保解析器的输出是输入的C中的一个转换。添加缩进
所以像...
STARTMAIN a=b+2; return a ENDMAIN
...必须成为......
int main() { a=b+2; return a; }
到目前为止好,差不多。这个练习还要求,在我们转换的同一时间,我们必须添加适当的缩进和(因为去年我必须学习辛苦的方式)换行符。
显而易见的部分是,每当{打开,你增加一个计数器,然后在每一个新行添加适当的选项卡。然而,右括号('}')是一个不同的故事,因为您无法在手边检测它们,并且一旦您解析了它们,您就不能通过删除最后打印的选项卡来将它们放在左侧的选项卡上。
有没有解决方案,和/或一致的方式来检查和添加缩进?
这是一个练习的所有部分,所以没有任何有关C转换的严格规则。我知道我必须找到一种方法来确保在结束大括号之前不打印任何东西,但我无法找到一个很好的组合来完成我们被要求的所有事情,添加适当的缩进和换行符。 为了添加适当的换行符,我在分析的每个分号中添加了“换行符和制表符”代码,但这意味着如果接下来遇到右大括号,则会过早打印这些制表符。一种解决方案可能是让右大括号获得另一个换行符,并在那里打印。 – 2010-08-22 06:33:59
@Leftos:对'麻烦'的一种解释是,你混合了两种不应该混合的操作 - 所以你会遇到麻烦。输出一个换行符并不意味着你也可以输出下一批空白;你必须等到你知道发生了什么事情后再输出。在文件结尾处,您可能会输出一个空白行 - 不好。在一组声明之后,你想要一个空行,你可能会输出一个带有制表符的行。不好。输出换行符(前一行的结尾)与前导空格分开。 – 2010-08-22 07:39:25
@Leftos:另外,有些地方你不想在分号之后换行 - 特别是在for循环中。所以规则“在分号后打印换行符”太简单了。 – 2010-08-22 07:41:24