私はScilabのカスタマイズされたバージョンで "シナリオ"ファイルを生成する適切な運転シミュレータで作業しています。私は単一の11,000行の "マスター"ファイルを提供しており、これからはnバージョンのシナリオを生成するために特定の値を置き換える必要があります。私は、標準入力で、このスクリプトで特定の値を交換する必要がカスタム文法の中で変数を変更する最も効率的な方法は?
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=""
}
}
}
}
:
単一の親TASK
の構文の最小限の例では、このようなものになるだろう。例えば、親レベルTASK
の下にあるLABEL
の値を置き換える名前のリストを持っている。そして、次のように、私の最初の溶液はPythonの正規表現が基づいていた
6〜16の乱数で最初の親VARIABLE
ためVALUE
を置き換えるために何かを持っている(ただし、すべての値のために私は変更しよう):
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
ご覧のとおり、これは問題の効率的な解決方法ではありません。もっと良い解決策は何だと思いますか?
本当のパーサーが必要でしょう。正規表現は、引用符で囲まれた文字列や何かのような厄介なものがあれば、正しく処理することを保証することは難しいです。私は前にParsimoniousのことは聞いたことがありませんが、それは良い場所のように見える!なぜそれは動作しませんか? –