#P1896. Code Formatting

Code Formatting

描述描述
众所周知,当讨论代码的正确格式化问题时,程序员们总会展开“圣战”。当新的程序员团队开始参与项目时,常常会带来略有不同的代码格式化风格,并希望依照自己的风格重新格式化旧源代码。此外,缺乏经验的程序员往往忽视良好且一致的代码风格的重要性,这给他们的队友和自己的工作都带来了不便。这种状况为代码格式化工具创造了蓬勃发展的市场。

你正在参与一个名为Salvation的新代码格式化工具的概念验证项目。这只是一个试点项目,目标并非实际应用,而是展示你解析和格式化高级语言代码的能力。你的任务是为一种名为TRIVIAL(与竞争实现无关的语言)的编程语言编写代码格式化工具。该语言具有简单的词法和语法结构,没有任何关键字和控制结构,因为其所有语言构造都通过函数调用和闭包表示。

词法结构由标识符、圆括号、花括号、逗号和分号组成。标识符仅包含数字0'0'-9'9'和拉丁字母a'a'-z'z'A'A'-Z'Z'。词法项之间可能由空白分隔,文件中的前导和 trailing 空白也被允许。空白可由空格、制表符(ASCII码99)和行分隔符(ASCII13131010组成的对)构成。

有效TRIVIAL程序的结构由以下产生式定义:

Program ::= Block

  • Block ::= '{' Statements '}'
  • Statements ::= Statement | Statement Statements
  • Statement ::= Expression ;';'
  • Expression ::= identifier ['[''(' Arguments )')' ]']' ['['Block]']'
  • Arguments ::= Expression | Expression ,',' Arguments

正确格式化的TRIVIAL程序还需满足以下规则:

  • 无空行。
  • 不使用制表符。
  • 文件首字符为左花括号'{'(无前导空白),末字符为右花括号'}'(无 trailing 空白)。
  • 每行以4N4N个空格字符开头,其中NN为缩进级别。
  • 程序首行和末行的缩进级别为00
  • 被花括号'{'...'}'包围的块体行,缩进级别比外层多11
  • 行内不允许空白,除非以下两种情况必须有一个空格:左花括号'{'前,或逗号,','后。
  • 除末行外,每行以分号;';'或左花括号'{'结尾。这些字符不得出现在行中或行首(包括末行)。
  • 右花括号'}'只能出现在缩进空格后的行首。

正确格式化的TRIVIAL程序示例见样例输出部分。

输入输入
输入为有效的TRIVIAL程序,每个用例大小不超过20002000字节。

输出输出
向输出文件写入输入程序的正确格式化后的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));
            };
        };
    };
}