2017-04-09 47 views
3

我在下面輸入字符串:PEGJs,語法到創建嵌套數組

(
    (
    (App = smtp AND "Server Port" != 25) 
    OR 
    (App = pop3 AND "Server Port" == 20) 
    ) 
    AND 
    (App = smtp AND "Server Port" != 35) 
) 
OR 
(App = pop3 AND "Server Port" != 110) 
AND 
(
    (App = imap AND "Server Port" != 143) 
    OR 
    (App = pop3 AND "Server Port" == 20) 
) 
AND (App = imap OR "Server Port" != 143) 

要變成:

[ 
    [ 
     [ 
      'App = smtp AND "Server Port" != 25', 
      'OR', 
      'App = pop3 AND "Server Port" == 20' 
     ], 
     'AND', 
     'App = smtp AND "Server Port" != 35' 
    ], 
    'OR', 
    'App = pop3 AND "Server Port" != 110', 
    'AND', 
    [  
    [ 
     'App = imap AND "Server Port" != 143', 
     'OR', 
     'App = pop3 AND "Server Port" == 20' 
    ] 
    ], 
    'AND', 
    'App = imap OR "Server Port" != 143' 
] 

如何做到這一點的pegjs語法?

我當然可以寫一個JavaScript代碼,但我在尋找一些幫助PEGjs。

+0

是輸入字符串只有這麼多,或者你有很長,許多? –

+0

解釋你的努力失敗的方式。 – ceving

回答

0

這應該讓你開始,它大致上是你要找的。

start = 
    _ ex:expression _ 
    { 
     return ex; 
    } 

expression = 
    op:operand bi:binary? 
    { 
     return bi ? [op].concat(bi) : op; 
    } 

operand = 
    paren/terminal 

paren = 
    '(' _ ex:expression _ ')' 
    { 
     return ex; 
    } 

binary = 
    _ op:operator _ ex:expression 
    { 
     return [op, ex]; 
    } 

operator = 
    'OR'/'AND' 

terminal = 
    $((!paren [^)])+) 

_ = [\r\n ]* 

輸出:

[ 
    [ 
     [ 
     "App = smtp AND \"Server Port\" != 25", 
     "OR", 
     "App = pop3 AND \"Server Port\" == 20" 
     ], 
     "AND", 
     "App = smtp AND \"Server Port\" != 35" 
    ], 
    "OR", 
    [ 
     "App = pop3 AND \"Server Port\" != 110", 
     "AND", 
     [ 
     [ 
      "App = imap AND \"Server Port\" != 143", 
      "OR", 
      "App = pop3 AND \"Server Port\" == 20" 
     ], 
     "AND", 
     "App = imap OR \"Server Port\" != 143" 
     ] 
    ] 
]