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 }