我想解析一种简单的语言,该语言基本上在一行文本的前面有几个特殊的字形或字符。如果没有这些,则仅将文本行作为数据。
例如:
+ hfflsdjf dslfhsldfh sdlfkh sdlfkhs
! sdlfkhsdl sdfb sldflsdfh sldkfh sd
dsf sldfbbsf sdfjbs kfjbsd kjbsdf
由于+和!,第一行和第二行具有特殊含义。在最前面,该行的其余部分是该指令的数据。但是第三行只是数据。
我该如何用Instaparse表达这一点?
基本上,我想说的是与其他任何规则不匹配的字符串都应由DATA终端匹配。
答案 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 "])