#P1896. Code Formatting
Code Formatting
众所周知,当讨论代码的正确格式化问题时,程序员们总会展开“圣战”。当新的程序员团队开始参与项目时,常常会带来略有不同的代码格式化风格,并希望依照自己的风格重新格式化旧源代码。此外,缺乏经验的程序员往往忽视良好且一致的代码风格的重要性,这给他们的队友和自己的工作都带来了不便。这种状况为代码格式化工具创造了蓬勃发展的市场。
你正在参与一个名为Salvation的新代码格式化工具的概念验证项目。这只是一个试点项目,目标并非实际应用,而是展示你解析和格式化高级语言代码的能力。你的任务是为一种名为TRIVIAL(与竞争实现无关的语言)的编程语言编写代码格式化工具。该语言具有简单的词法和语法结构,没有任何关键字和控制结构,因为其所有语言构造都通过函数调用和闭包表示。
词法结构由标识符、圆括号、花括号、逗号和分号组成。标识符仅包含数字-和拉丁字母-、-。词法项之间可能由空白分隔,文件中的前导和 trailing 空白也被允许。空白可由空格、制表符(ASCII码)和行分隔符(ASCII、组成的对)构成。
有效TRIVIAL程序的结构由以下产生式定义:
Program ::= Block
- Block ::= '{' Statements '}'
- Statements ::= Statement | Statement Statements
- Statement ::= Expression
- Expression ::= identifier '(' Arguments Block
- Arguments ::= Expression | Expression Arguments
正确格式化的TRIVIAL程序还需满足以下规则:
- 无空行。
- 不使用制表符。
- 文件首字符为左花括号'{'(无前导空白),末字符为右花括号'}'(无 trailing 空白)。
- 每行以个空格字符开头,其中为缩进级别。
- 程序首行和末行的缩进级别为。
- 被花括号'{'...'}'包围的块体行,缩进级别比外层多。
- 行内不允许空白,除非以下两种情况必须有一个空格:左花括号'{'前,或逗号后。
- 除末行外,每行以分号或左花括号'{'结尾。这些字符不得出现在行中或行首(包括末行)。
- 右花括号'}'只能出现在缩进空格后的行首。
正确格式化的TRIVIAL程序示例见样例输出部分。
输入为有效的TRIVIAL程序,每个用例大小不超过字节。
向输出文件写入输入程序的正确格式化后的TRIVIAL代码。
输入数据
{class(Point)
{
member ( int ( x ) ) ; member ( int ( y ) ) ;
member ( fun ( Length )
{
return ( sqrt ( sum ( sqr ( x ),sqr ( y ) ) ) );
} ) ;
};
Main
{
repeat
{
set ( n,input ( int ) ) ;
for ( int ( i,0 ) , lt ( i,n ) , inc ( i ) )
{
print ( mult ( n,n ) ) ;
};
};
}; }
输出数据
{
class(Point) {
member(int(x));
member(int(y));
member(fun(Length) {
return(sqrt(sum(sqr(x), sqr(y))));
});
};
Main {
repeat {
set(n, input(int));
for(int(i, 0), lt(i, n), inc(i)) {
print(mult(n, n));
};
};
};
}