2016-08-18 9 views
1

私はScilabのカスタマイズされたバージョンで "シナリオ"ファイルを生成する適切な運転シミュレータで作業しています。私は単一の11,0​​00行の "マスター"ファイルを提供しており、これからは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 

ご覧のとおり、これは問題の効率的な解決方法ではありません。もっと良い解決策は何だと思いますか?

+0

本当のパーサーが必要でしょう。正規表現は、引用符で囲まれた文字列や何かのような厄介なものがあれば、正しく処理することを保証することは難しいです。私は前にParsimoniousのことは聞いたことがありませんが、それは良い場所のように見える!なぜそれは動作しませんか? –

答えて

0

ファイルを新しい値でファイルを生成するScilabスクリプトに変換できますか。

変換はテキストエディタで(かもしれ予想される1でデフォルト値を置き換えるために生成されたスクリプトを変更し、各実験についてのScilabで非常に簡単 まず(一度に行うことにする)

T=mgetl("Task_file");mputl(sci2exp(T),"Task_file.sce") 

です

タイム1の値以下の例を参照してくださいは、グランドによって生成される)...ファイルからこれらの値を読み取る、またはによって、X_pos1はScilabのコンソールから読み出され

T=["TYPEOF TASK (57)" 
"{" 
" LABEL=""Dot 3a""/*replace with name for name in list */" 
" TASK_KIND=""0""" 
"" 
" TYPEOF VARIABLE (53)" 
" {" 
"  LABEL=""Time1""" 
"  TYPE=""FLOAT""" 
"  VALUE="""+string(grand(1,1,"uin",6,16)+"""" /* replace with random.integer() */" 
"  INTERACTIVE=""VOID""" 
"" 
" TYPEOF VARIABLE (54)" 
" {" 
"  LABEL=""X_pos1""" 
"  TYPE=""FLOAT""" 
"  VALUE=""""+string(input("X_pos1")+"""" 
"  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=""""" 
"    }" 
"   }" 
"  }" 
" }"]; 
muptl(T,"Task") 
+0

シラバスを使わずにこのような解決策を得ることは可能ですか?つまり、最初の変数を取得するために$ 1を行うことができます。私はそれらを$$ LABEL $$のような一意のIDで置き換えることができたと思いますが、これは正規表現の例に戻ります。 –

関連する問題