2017-05-02 12 views
1

私はこのようなテーブル構造のテーブルがあります。テーブルLUAでテーブルの検索

[1] = { 
    [1] = { 
     category = "WORD", 
     cursor = <filtered>, 
     ptype = "STATEMENT", 
     ttype = "SERVICE", 
     value = "service", 
     <metatable> = <filtered> 
    }, 
    [2] = { 
     category = "VARIABLE", 
     cursor = <filtered>, 
     ptype = "STATEMENT", 
     ttype = "IDENTIFIER", 
     value = "TestService", 
     <metatable> = <filtered> 
    }, 
    [3] = { 
     ttype = "BRACE_BLOCK", 
     value = { 
      [1] = { ... 
... 
[2] = { 
    [1] = { 
     category = "WORD", 
     cursor = <filtered>, 
     ptype = "STATEMENT", 
     ttype = "SERVICE", 
     value = "service", 
     <metatable> = <filtered> 
    }, 
    [2] = { 
     category = "VARIABLE", 
     cursor = <filtered>, 
     ptype = "STATEMENT", 
     ttype = "IDENTIFIER", 
     value = "HelloWorld", 
     <metatable> = <filtered> 
    }, 

は、私がその情報を濾過し、TTYPEとの最初のテーブルを探し、単にループをプログラムしたいと思います次のサービスが対応するサービスを開始するまで残りのトークンを割り当てる。

local found_service = 0 
if found_service == 0 then 
for k1, v1 in pairs (parse_tree) do 
     for i=1,#v1 do 
      if v1[i].ttype == "SERVICE" then 
      --Store wanted data in an object 
      found_service = 1 
      end 
      if (found_service == 1 and v1[i].ttype ~= "SERVICE") then 
      -- ->assign the rest to last found service 
      end 
      if found_service == 1 and v1[i].ttype == "SERVICE" then 
      -- ->Found the next service -->starting over 
      found_service = 0 
      end 
     end  
    end 
end 

問題は、私はインデックスiで立ち往生し、V1 [i]が「SERVICE」であるということですので、彼はあまりにも、直接最後のif節に入る:私の考えは、そのように見えます。最初のif節の後に、どのようにして1つのループ反復を終了させるか。または、これを行うもっと良い方法がありますか?

ありがとうございます。 Theo

+1

は ''いくつか::ラベル:: ' – tonypdmtr

答えて

1

私はあなたの一般的な考え方を理解していませんが、最初に"SERVICE"キャプチャイベントでループボディをスキップする方法の答えがあります。

local found_service = 0 
if found_service == 0 then 
for k1, v1 in pairs (parse_tree) do 
     for i=1,#v1 do 
      if (found_service == 0 and v1[i].ttype == "SERVICE") then 
       --Store wanted data in an object 
       found_service = 1 
      else 
       if (found_service == 1 and v1[i].ttype ~= "SERVICE") then 
        -- ->assign the rest to last found service 
       end 
       if found_service == 1 and v1[i].ttype == "SERVICE" then 
        -- ->Found the next service -->starting over 
        found_service = 0 
       end 
      end 
     end  
    end 
end 

しかし、私はまだ現在のレコードではない"SERVICE"found_service == 0に何をすべきか、それを得ることはありませんよ。ちなみに、found_serviceの後の私の答えでは、ifの3番目に0になると、最初のiftrueに戻ってしまう可能性があります。その場合、(次のサービスまで、他のTTYPEテーブル)(次のサービスまで、他のTTYPEテーブル)
SERVICE_1
SERVICE_2
...

あなたのアイデアのようなベクトルのいくつかの種類を構築することである場合コードは次のようになります。

local found_service = 0 
if found_service == 0 then 
for k1, v1 in pairs (parse_tree) do 
     for i=1,#v1 do 
      if (found_service == 0 and v1[i].ttype == "SERVICE") then 
       --Store wanted data in an object 
       found_service = 1 
       current_service = v1[i] 
      else 
       if (found_service == 1 and v1[i].ttype ~= "SERVICE") then 
        -- ->assign the rest to last found service 
       end 
       if found_service == 1 and v1[i].ttype == "SERVICE" then 
        -- ->Found the next service -->starting over 
        current_service = v1[i] 
       end 
      end 
     end  
    end 
end 
+0

はあなたに感謝しgoto'を使用してください。私のためにうまくいった。 – Theodor