Mercurial Hosting > luan
annotate src/luan/modules/parsers/Csv.java @ 1111:88b5b81cad4a
move Parser to luan.lib.parser
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 02 Aug 2017 15:19:47 -0600 |
parents | 1a68fc55a80c |
children | 9fa8b8389578 |
rev | line source |
---|---|
585 | 1 package luan.modules.parsers; |
2 | |
3 import luan.LuanTable; | |
1111
88b5b81cad4a
move Parser to luan.lib.parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
4 import luan.lib.parser.Parser; |
88b5b81cad4a
move Parser to luan.lib.parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
5 import luan.lib.parser.ParseException; |
585 | 6 |
7 | |
8 public final class Csv { | |
9 | |
10 public static LuanTable toList(String line) throws ParseException { | |
11 return new Csv(line).parse(); | |
12 } | |
13 | |
14 private final Parser parser; | |
15 | |
16 private Csv(String line) { | |
17 this.parser = new Parser(line); | |
18 } | |
19 | |
20 private ParseException exception(String msg) { | |
21 return new ParseException(parser,msg); | |
22 } | |
23 | |
24 private LuanTable parse() throws ParseException { | |
25 LuanTable list = new LuanTable(); | |
26 while(true) { | |
27 Spaces(); | |
28 String field = parseField(); | |
29 list.rawPut(list.rawLength()+1,field); | |
30 Spaces(); | |
31 if( parser.endOfInput() ) | |
32 return list; | |
33 if( !parser.match(',') ) | |
34 throw exception("unexpected char"); | |
35 } | |
36 } | |
37 | |
38 private String parseField() throws ParseException { | |
39 parser.begin(); | |
40 String rtn; | |
41 if( parser.match('"') ) { | |
42 int start = parser.currentIndex(); | |
43 do { | |
44 if( parser.endOfInput() ) { | |
45 parser.failure(); | |
46 throw exception("unclosed quote"); | |
47 } | |
48 } while( parser.noneOf("\"") ); | |
49 rtn = parser.textFrom(start); | |
50 parser.match('"'); | |
51 } else { | |
52 int start = parser.currentIndex(); | |
53 while( !parser.endOfInput() && parser.noneOf(",") ); | |
54 rtn = parser.textFrom(start).trim(); | |
55 } | |
56 return parser.success(rtn); | |
57 } | |
58 | |
59 private void Spaces() { | |
60 while( parser.anyOf(" \t") ); | |
61 } | |
62 | |
63 } |