Instaparse系列数字或字母作为一片叶子?

时间:2016-04-19 01:17:54

标签: clojure ebnf instaparse

所以我一直在使用instaparse并且它很棒,但是我一直试图避免使用Regexes作为拐杖而且它导致了更多的冗长。为了保持这种可读性,我们只说#'[A-z]'实际上是'A'|'B'|etc格式。

(def myprsr (instaparse.core/parser 
  "word = (ltr | num)+; 
   <ltr> = #'[A-z]';
   <num> = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';"))
(myprs"foo123") ;; -> [:word "f" "o" "o" "1" "2" "3"]

有没有办法在不诉诸#'[A-z]+'#'[0-9]+的情况下像[:word "foo123"][:number "123"](如果我做了一个数字顶级规则),以便避免将它们作为后解析处理的一部分连接起来吗?

1 个答案:

答案 0 :(得分:2)

目前没有办法(除了正则表达式)在解析期间自动合并这些字符串。我建议在insta/transform地图中进行此连接。

在这种情况下,使用正则表达式也没有错。我们知道,通过贪婪地解析所有字母或所有数字,我们不会错过任何可能的解析。因此,正则表达式是可以接受的(并且性能更高)。