PEGJs, Grammar for nested array creation

I have the following line of input:

(
   (
     (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)

      

wants to convert to:

[
    [
         [
           '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'
]

      

How can I do this in pegjs grammar?

I can of course write javascript code, but I am looking for some help with PEGjs.

+3


source to share


1 answer


This should get you started, which is roughly what you are looking for.

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

      



Output:

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

      

0


source







All Articles