首页 > 解决方案 > 用 Clojure Instaparse 匹配任何东西

问题描述

我想解析一种简单的语言,它基本上在一行文本前面有几个特殊的字形或字符。如果它没有这些,那么文本行就被当作数据。

例如 :

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

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

我如何在 Instaparse 中表达这一点?

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

标签: parsingclojureinstaparse

解决方案


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

推荐阅读