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 to share