Scilabのカスタマイズされたバージョンで「シナリオ」ファイルを生成する適切な運転シミュレーターを使用しています。11,000 行の長さの「マスター」ファイルが 1 つ提供されます。このファイルから特定の値を置き換えて、シナリオのnバージョンを生成する必要があります。
単一の親の構文の最小限の例は、次のTASK
ようになります。
TYPEOF TASK (57)
{
LABEL="Dot 3a"/*replace with name for name in list */
TASK_KIND="0"
TYPEOF VARIABLE (53)
{
LABEL="Time1"
TYPE="FLOAT"
VALUE="14.000000" /* replace with random.integer() */
INTERACTIVE="VOID"
TYPEOF VARIABLE (54)
{
LABEL="X_pos1"
TYPE="FLOAT"
VALUE="23.600000"
INTERACTIVE="VOID"
TYPEOF TASK (58)
{
LABEL="Task: ISI"
TASK_KIND="0"
TYPEOF RULE (115)
{
LABEL="Rule: Go to subtask after Time1 seconds"
TYPEOF CONDITION (SUPERIOR)
{
IS_EXPANDED="1"
MODIFIER="BECOMES_TRUE"
TYPEOF PARAMETER (OPERAND_1)
{
KIND="FUNCTION"
TYPEOF FUNCTION (GET_TASK_CLOCK)
{
}
OWNER_FILE=""
}
TYPEOF PARAMETER (OPERAND_2)
{
KIND="VARIABLE"
VALUE="53"
OWNER_FILE=""
}
}
TYPEOF ACTION (GOTO_TASK)
{
IS_EXPANDED="1"
TYPEOF PARAMETER (TASK_NUMBER)
{
KIND="ENUM"
VALUE="GOTO_NEXT_TASK"
OWNER_FILE=""
}
}
}
}
このスクリプトの特定の値を標準入力に置き換える必要があります。たとえばLABEL
、親 level の下の値を置き換える名前のリストを用意しますTASK
。VALUE
最初の親VARIABLE
を 6 ~ 16 の乱数に置き換える必要があります。
私の最初の解決策は Python REGEX ベースで、次のようなものでした (ただし、変更しようとしているすべての値に対して):
for row in scenarioInput:
parenttaskmatch = re.search("^\t\tTYPEOF TASK",row)
if parenttaskmatch:
replacementrow = re.sub(r"([0-9]{1,3})",repl,row)
私は、Parsimonious のようなものでカスタム文法を書き、Mustache で出力を再生成することができると提案されました。
from parsimonious.grammar import Grammar
grammar = Grammar(r"""
any = task / data
task = "TYPEOF " key " (" number ")" newline open_curly any+ close_curly
data = key "=" quote text quote newline
open_curly = "{" newline
close_curly = "}" newline
key = ~"[A-Z 0-9_]*"
text = ~"[A-Z0-9 ]*"i
number = ~"[0-9]*"
newline = "\n"
space = " "
quote = "\""
""")
text = open('example_driving_rule.sci').read()
grammar.parse(text)
# Note doesn't work
ご覧のとおり、これも問題に対する効率的な解決策ではありません。皆さんは、より良い解決策は何だと思いますか?