Соответствие чему-либо с 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 "])
Другие вопросы по тегам