Соответствие чему-либо с Clojure Instaparse - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу разобрать простой язык, у которого в основном есть пара специальных символов или символов перед строкой текста. Если он не имеет их, тогда строка текста просто берется как данные.

Например:

+ hfflsdjf dslfhsldfh sdlfkh sdlfkhs 
! sdlfkhsdl sdfb sldflsdfh sldkfh sd
dsf sldfbbsf sdfjbs kfjbsd kjbsdf 

Первая и вторая строки имеют особые значения из-за + и! впереди остальная часть строки - данные этой инструкции. Но третья строка - это просто данные.

Как я могу выразить это в Instaparse?

По сути, я хочу сказать, что любая строка, которая не соответствует ни одному из других правил, должна соответствовать терминалу DATA.

1 Ответ

0 голосов
/ 17 ноября 2018
(def as-and-bs
    (insta/parser
        "<text> = (rubbish | op ) *
         <op> = plus | bang
         <line> = #'[^\n]*(\n|$)'
         rubbish = line
         plus = '+' line
         bang = '!' line"))

(as-and-bs "+ abc\n! def\ncu ")
;=> ([:plus "+" " abc\n"] [:bang "!" " def\n"] [:rubbish "cu "])
...