2017-04-09 4 views
3

verschachtelten Array zu erstellen, die folgenden Eingabestring mir:PEGJs, Grammatik

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

will in verwandeln:

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

Wie kann ich tue dies in der pegjs Grammatik?

Ich kann sicherlich einen Javascript-Code schreiben, aber ich suche nach etwas Hilfe in PEGjs.

+0

ist die Eingabezeichenfolge nur sehr dieses oder Sie haben ziemlich lang und viele? –

+0

Erklären Sie, auf welche Weise Ihre Bemühungen fehlschlagen. – ceving

Antwort

0

Dies sollte Ihnen helfen, es ist in etwa das, wonach Sie suchen.

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

Ausgang:

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