我需要Ruby使用自定义语法

时间:2016-11-23 11:44:08

标签: ruby parsing

我有一组.txt文件显示自定义语言,我希望使用Ruby脚本系统地修改文件。该语言的语法如下:

(我将[some text]用作表达式的元变量,如[atom 1]表示任意原子,[atom 2]表示与前者不同的任意原子

原子:字母数字字符串,可能被双引号括起来。例子:

same_realm 
"Ok"

陈述:要么

[atom_1] = [atom_2] 

[atom_1] = { [atom or statement 1] ... [atom or statement n] }

注释:在文本的任何一行中,#之后的任何字符都将被忽略。例如:

[atom_1] = [atom_2]  #This is a comment and will be ignored

如果一个陈述的形式是[atom 1] = {[atom or statement 1] ... [atom or statement n]},我们将[atom 1]称为satement的头部和[atom or statement 1 ] ... [原子或陈述n]陈述的主体。

在=之前和之后,{和}可以有一个任意数字(可能是0)的空格字符。 在两个连续的原子之间必须至少有一个空格字符,但可以是任何高于该数字的数字。

因此,下面示例中的两个表达式any_realm_lord = {...}和any_realm_lord = {...}是有效的,它们之间唯一的语法区别是使用any_realm_lord / any_province_lord作为每个语句的头部。

#Example file

#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag} 
} any_province_lord={any_character  = {      #some comment
        limit = {#some other comment
same_realm = ROOT} set_character_flag = 
        my_flag
    }
}#more text

一旦解释了,这就是我想用ruby做的事情(我将使用上面的示例文件来说明它)

1)打开一个文件,找到不在其他语句正文中的语句

(在示例中,我希望它找到any_realm_character = {...}和any_province_character = {...}语句)

2)迭代位于1)中的语句,并选择其头部与某个字符串匹配的语句。如果匹配位于还有其他原子或语句的行中,请将它们分开。从现在开始,我将引用其头部与字符串匹配的语句为"目标语句"。

(说要匹配的字符串是" any_province_lord"。在此步骤之后,文件将如下所示:

#Example file

#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag} 
}
any_province_lord={any_character  = {      #some comment
        limit = {#some other comment
same_realm = ROOT} set_character_flag = 
        my_flag
    }
}#more text

3)在目标语句的头部所在的行上方创建一个空行,并在目标语句所包含的行中剪切并粘贴任何注释

#Example file

#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag} 
}
 #some comment#some other comment
any_province_lord={any_character  = {     
        limit = {
same_realm = ROOT} set_character_flag = 
        my_flag
    }
}#more text

4)如果目标语句的右括号与另一个原子或语句位于同一行,则在右括号后添加\ n

#Example file

#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag} 
}
 #some comment#some other comment
any_province_lord={any_character  = {     
        limit = {
same_realm = ROOT} set_character_flag = 
        my_flag
    }
}
#more text

5)删除目标语句的主体(但不删除括号),并在我已经定义的括号之间添加新内容,间距很小。 (

#Example file

#previous text
any_realm_lord={any_character={limit={same_realm=ROOT}set_character_flag=my_flag} 
}
 #some comment#some other comment
any_province_lord={     
        #my predefined content will be here
}
#more text

那么在效率方面这样做最好的方法是什么?我需要我的程序来完成超过一千个文件(每个文件的平均大小为500Kb)。我对Ruby很新,所以我还在弄清楚这些东西是否最好在效率方面使用read,readlines或readline。 你觉得怎么样?

我希望我已经清楚地解释了我需要什么,而不是太不必要的冗长

0 个答案:

没有答案