Javascript PEGJs,创建嵌套数组的语法

Javascript PEGJs,创建嵌套数组的语法,javascript,regex,pegjs,Javascript,Regex,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 P

我有以下输入字符串:

(
   (
     (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中的一些帮助。

这应该可以让您开始,它大致满足您的需求

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"
      ]
   ]
]

输入字符串是否只有这么多,或者您有相当长的字符串?请解释您的努力以何种方式失败。