2016-04-19 2 views
2

私は不慣れで悩んでいましたが、それは素晴らしかったですが、私はRegexesを松葉杖として使うのをやめようとしていましたが、もう少し冗長になりました。この可読性を保つために、ちょうど#'[A-z]'と言うのは実際には'A'|'B'|etcの形式です。無数の数字や文字を1枚の葉にしますか?

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

ポストパース処理の一部として、それらを連結するのを避けるために(私は数のトップレベルのルールを作った場合)[:word "foo123"]または[:number "123"]のような葉を出すために#'[A-z]+'#'[0-9]+に頼ることなく、どのような方法があります?

答えて

2

パース中にこれらの文字列を自動的にマージする方法はありません(正規表現以外に)。 insta/transform地図でこの連結を行うことをおすすめします。

この単純なケースで正規表現を使用すると何も問題ありません。私たちは、すべての文字またはすべての数字を貪欲に解析することによって、抜け落ちる可能性のある解析がないことを知っています。したがって、正規表現は受け入れられる(そしてより演奏的である)。

関連する問題