1 module pegged.examples.csv; 2 3 import pegged.grammar; 4 5 version(unittest) 6 { 7 import std.stdio; 8 } 9 10 mixin(grammar(` 11 CSV: 12 13 CsvFile <- Line* LastLine 14 Line <- :S* Item (:Sep Item)* :endOfLine 15 LastLine <- :S* Item (:Sep Item)* eoi 16 Item <- SimpleField 17 / QuotedField 18 / EmptyField 19 SimpleField <~ (!eoi !endOfLine !S !',' !doublequote .)+ :S* 20 QuotedField <~ doublequote EscapedField doublequote :S* 21 EscapedField <~ SubField (doublequote doublequote SubField)* 22 SubField <~ (!doublequote !eoi .)+ 23 EmptyField <- eps :S* 24 25 Sep <- ',' :S* 26 S <- (' ' / '\t') 27 `)); 28 29 unittest 30 { 31 assert(CSV("a,b,c").successful); 32 assert(CSV("a1,b2,c3, 3.14159").successful); 33 assert(CSV(`a1,,,b2,c3, 3.14159, άλφα, "abc", "abc""def"`).successful); 34 35 assert(CSV("1,2,3,").successful); 36 assert(CSV("1,2,,3").successful); 37 assert(CSV("1,,,,,").successful); 38 assert(CSV(",1").successful); 39 assert(CSV("").successful); 40 auto p1 = CSV( 41 "1, 2 , 3 42 4, 5, 6,, 43 7"); 44 45 assert(p1.children[0].children.length == 3); // 3 lines 46 assert(p1.children[0].children[0].matches == ["1", "2", "3"]); 47 assert(p1.children[0].children[1].matches == ["4","5","6","",""]); 48 assert(p1.children[0].children[2].matches == ["7"]); 49 50 assert(CSV("1, 51 2, 52 3, 53 4, 54 ").successful); 55 56 assert(!CSV("1 2 3").successful); 57 58 }