2010-08-21 36 views
0

我正在试图编写一个编程语言的解析器。我现在是练习的一部分,我们需要确保解析器的输出是输入的C中的一个转换。添加缩进

所以像...

STARTMAIN a=b+2; return a ENDMAIN 

...必须成为......

int main() { a=b+2; return a; } 

到目前为止好,差不多。这个练习还要求,在我们转换的同一时间,我们必须添加适当的缩进和(因为去年我必须学习辛苦的方式)换行符。

显而易见的部分是,每当{打开,你增加一个计数器,然后在每一个新行添加适当的选项卡。然而,右括号('}')是一个不同的故事,因为您无法在手边检测它们,并且一旦您解析了它们,您就不能通过删除最后打印的选项卡来将它们放在左侧的选项卡上。

有没有解决方案,和/或一致的方式来检查和添加缩进?

回答

2

那么,你现在已经发现了一个原因,人们并不总是懒得格式化生成的输出;这样做相对困难。

事实上,解决这个问题的一种方法是提供一种官方格式的语言。 Google的Go编程语言附带'gofmt'程序以鼓励官方格式。 C没有这样的标准,因此对于大括号的安置发生了宗教战争,但它确实有程序,如indent,它实际上可以为你整齐地编码。

诀窍是不输出任何行上的任何东西,直到你知道有多少标签输出。因此,在一个紧箍括号的行上,您将缩进计数器递减(确保它永远不会变为负数),然后才会输出前导制表符和下一个大括号。请注意,C的某些部分需要在大括号后面使用分号(或逗号)(请考虑初始值和结构定义);别人不(认为语句块)。

+0

这是一个练习的所有部分,所以没有任何有关C转换的严格规则。我知道我必须找到一种方法来确保在结束大括号之前不打印任何东西,但我无法找到一个很好的组合来完成我们被要求的所有事情,添加适当的缩进和换行符。 为了添加适当的换行符,我在分析的每个分号中添加了“换行符和制表符”代码,但这意味着如果接下来遇到右大括号,则会过早打印这些制表符。一种解决方案可能是让右大括号获得另一个换行符,并在那里打印。 – 2010-08-22 06:33:59

+0

@Leftos:对'麻烦'的一种解释是,你混合了两种不应该混合的操作 - 所以你会遇到麻烦。输出一个换行符并不意味着你也可以输出下一批空白;你必须等到你知道发生了什么事情后再输出。在文件结尾处,您可能会输出一个空白行 - 不好。在一组声明之后,你想要一个空行,你可能会输出一个带有制表符的行。不好。输出换行符(前一行的结尾)与前导空格分开。 – 2010-08-22 07:39:25

+0

@Leftos:另外,有些地方你不想在分号之后换行 - 特别是在for循环中。所以规则“在分号后打印换行符”太简单了。 – 2010-08-22 07:41:24