Соответствие чему-либо с Clojure Instaparse
Я хочу разобрать простой язык, который в основном имеет пару специальных символов или символов перед строкой текста. Если он не имеет их, то строка текста просто берется в качестве данных.
Например:
+ hfflsdjf dslfhsldfh sdlfkh sdlfkhs
! sdlfkhsdl sdfb sldflsdfh sldkfh sd
dsf sldfbbsf sdfjbs kfjbsd kjbsdf
Первая и вторая строки имеют особые значения из-за + и! впереди остальная часть строки - данные этой инструкции. Но третья строка - это просто данные.
Как я могу выразить это в Instaparse?
По сути, я хочу сказать, что любая строка, которая не соответствует ни одному из других правил, должна соответствовать терминалу DATA.
1 ответ
(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 "])