添加缩进

时间:2010-08-21 22:42:41

标签: indentation bison flex-lexer

我正在尝试为一个简化的编程语言创建一个解析器。我现在正处于练习的一部分,我们需要确保解析器的输出是输入C的转换。

所以像......

STARTMAIN a=b+2; return a ENDMAIN

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

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

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

显而易见的是,每次{打开时,您都会增加一个计数器,然后在每个新行上添加相应的选项卡。但是,关闭括号('}')是一个不同的故事,因为您无法事先检测到它们,一旦解析它们,您不能通过删除最后打印的标签将它们放在左侧。

是否有解决方案,和/或检查和添加缩进的一致方法?

1 个答案:

答案 0 :(得分:2)

嗯,你现在已经发现了一个原因,人们并不总是懒得整齐地格式化生成的输出;这样做比较困难。

实际上,解决问题的一种方法是为该语言提供官方格式化程序。谷歌的Go编程语言附带'gofmt'计划,以鼓励官方格式。 C没有这样的标准,因此有关于括号放置的宗教战争,但它确实有indent这样的程序,实际上可以为你整齐地格式化代码。

技巧是在你知道要输出多少个标签之前不输出任何内容。因此,在一个带有闭括号的行上,你递减缩进计数器(确保它永远不会变为负数),然后才输出前导标签和后面的括号。

请注意,C的某些部分在close括号后需要使用分号(或逗号)(想想初始化器和结构定义);其他人不这样做(想想声明块)。