用Clojure Instaparse匹配任何东西

时间:2018-11-16 20:05:44

标签: parsing clojure instaparse

我想解析一种简单的语言,该语言基本上在一行文本的前面有几个特殊的字形或字符。如果没有这些,则仅将文本行作为数据。

例如:

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

由于+和!,第一行和第二行具有特殊含义。在最前面,该行的其余部分是该指令的数据。但是第三行只是数据。

我该如何用Instaparse表达这一点?

基本上,我想说的是与其他任何规则不匹配的字符串都应由DATA终端匹配。

1 个答案:

答案 0 :(得分: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 "])