2017-04-09 61 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" 
     ] 
    ] 
]