annotate src/luan/modules/parsers/LuanParser.java @ 1562:b89212fd04b5

remove table.luan
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 08 Nov 2020 16:50:59 -0700
parents 851b9a48cc44
children f118ead273a1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1447
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan.modules.parsers;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import goodjava.parser.Parser;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import goodjava.parser.ParseException;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 import luan.Luan;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 import luan.LuanTable;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 import luan.LuanException;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 public final class LuanParser {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11
1562
b89212fd04b5 remove table.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1447
diff changeset
12 public static Object parse(String text) throws ParseException {
b89212fd04b5 remove table.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1447
diff changeset
13 return new LuanParser(text).parse();
1447
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 private static final Object NULL = new Object();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 private final Parser parser;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18
1562
b89212fd04b5 remove table.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1447
diff changeset
19 private LuanParser(String text) {
1447
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20 this.parser = new Parser(text);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 private ParseException exception(String msg) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 return new ParseException(parser,msg);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 private Object parse() throws ParseException {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 do { spaces(); } while( endOfLine() );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 Object value = requiredValue();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 do { spaces(); } while( endOfLine() );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 if( !parser.endOfInput() )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 throw exception("unexpected text");
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 return value;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 private Object requiredValue() throws ParseException {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 Object value = value();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 if( value == null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39 throw exception("invalid value");
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 if( value == NULL )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 return null;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 return value;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 private Object value() throws ParseException {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
46 if( parser.match("nil") )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 return NULL;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 if( parser.match("true") )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 return Boolean.TRUE;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50 if( parser.match("false") )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 return Boolean.FALSE;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 String s = string();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 if( s != null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 return s;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 Number n = number();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56 if( n != null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 return n;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 LuanTable tbl = table();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 if( tbl != null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 return tbl;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 return null;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 private String string() throws ParseException {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 parser.begin();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 if( !parser.match('"') )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 StringBuilder sb = new StringBuilder();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 while( parser.anyChar() ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 char c = parser.lastChar();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 switch(c) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 case '"':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 return parser.success(sb.toString());
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 case '\\':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 if( parser.anyChar() ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 c = parser.lastChar();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 switch(c) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 case '"':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 case '\'':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 case '\\':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 sb.append(c);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 continue;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 case 'b':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 sb.append('\b');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 continue;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86 case 'f':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 sb.append('\f');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88 continue;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 case 'n':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 sb.append('\n');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 continue;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92 case 'r':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
93 sb.append('\r');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 continue;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95 case 't':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96 sb.append('\t');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
97 continue;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
98 case 'u':
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
99 int n = 0;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 for( int i=0; i<4; i++ ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101 int d;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102 if( parser.inCharRange('0','9') ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103 d = parser.lastChar() - '0';
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104 } else if( parser.inCharRange('a','f') ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105 d = parser.lastChar() - 'a' + 10;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106 } else if( parser.inCharRange('A','F') ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
107 d = parser.lastChar() - 'A' + 10;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 } else {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 throw exception("invalid hex digit");
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111 n = 16*n + d;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
112 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
113 sb.append((char)n);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
114 continue;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
115 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117 throw exception("invalid escape char");
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 default:
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 sb.append(c);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
121 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
122 parser.failure();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
123 throw exception("unclosed string");
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
124 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
125
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
126 private Number number() {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 parser.begin();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 if( parser.match("double") ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 Number n = inParens();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
132 n = Luan.asDouble(n);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
133 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
134 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
135 return n;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
136 } else if( parser.match("float") ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
137 Number n = inParens();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
138 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
139 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
140 n = Luan.asFloat(n);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
141 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
142 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
143 return n;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
144 } else if( parser.match("integer") ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
145 Number n = inParens();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
146 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
147 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
148 n = Luan.asInteger(n);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
149 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
150 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
151 return n;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
152 } else if( parser.match("long") ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
153 Number n = inParens();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
154 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
155 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
156 n = Luan.asLong(n);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
157 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
158 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
159 return n;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
160 } else {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161 Number n = untypedNumber();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
162 if( n != null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
163 return parser.success(n);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164 else
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169 private Number inParens() {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171 if( !parser.match('(') )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172 return null;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 Number n = untypedNumber();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
175 if( n==null )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
176 return null;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
177 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
178 if( !parser.match(')') )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179 return null;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180 return n;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
181 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
182
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183 private Number untypedNumber() {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184 int start = parser.begin();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 boolean isFloat = false;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186 parser.match('-');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
187 if( !parser.match('0') ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
188 if( !parser.inCharRange('1','9') )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
189 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
190 while( parser.inCharRange('0','9') );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
191 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
192 if( parser.match('.') ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
193 if( !parser.inCharRange('0','9') )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
194 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
195 while( parser.inCharRange('0','9') );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
196 isFloat = true;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
197 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
198 if( parser.anyOf("eE") ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199 parser.anyOf("+-");
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 if( !parser.inCharRange('0','9') )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 return parser.failure(null);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202 while( parser.inCharRange('0','9') );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203 isFloat = true;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
204 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
205 String s = parser.textFrom(start);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 Number n;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207 if(isFloat)
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
208 n = Double.valueOf(s);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
209 else
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
210 n = Long.valueOf(s);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
211 return parser.success(n);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
212 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
213
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
214 private LuanTable table() throws ParseException {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
215 parser.begin();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
216 if( !parser.match('{') )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
217 return parser.failure(null);
1562
b89212fd04b5 remove table.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1447
diff changeset
218 LuanTable tbl = new LuanTable();
1447
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
219 do {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
220 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
221 Object obj = value();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222 if( obj != null ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223 if( obj != NULL )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
224 tbl.rawAdd(obj);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
225 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
226 continue;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
227 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 Object key = key();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
229 if( key != null ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
230 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
231 requiredMatch('=');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
232 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
233 Object value = requiredValue();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
234 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
235 try {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
236 tbl.rawPut(key,value);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
237 } catch(LuanException e) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
238 throw new RuntimeException(e);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
239 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
240 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
241 } while( fieldSep() );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
242 requiredMatch('}');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
243 return parser.success(tbl);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
244 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
245
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
246 private Object key() throws ParseException {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
247 if( parser.match('[') ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
248 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
249 Object key = requiredValue();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
250 spaces();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
251 requiredMatch(']');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
252 return key;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
253 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
254 int start = parser.currentIndex();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
255 if( nameFirstChar() ) {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
256 while( nameChar() );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
257 return parser.textFrom(start);
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
258 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
259 return null;
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
260 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
261
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
262 private boolean nameChar() {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
263 return nameFirstChar() || parser.inCharRange('0','9');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
264 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
265
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
266 private boolean nameFirstChar() {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
267 return parser.inCharRange('a','z') || parser.inCharRange('A','Z') || parser.match('_');
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
268 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
269
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
270 private boolean fieldSep() throws ParseException {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
271 return parser.anyOf(",;") || endOfLine();
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
272 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
273
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
274 private boolean endOfLine() {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
275 return parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
276 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
277
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
278 private void requiredMatch(char c) throws ParseException {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
279 if( !parser.match(c) )
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
280 throw exception("'"+c+"' expected");
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
281 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
282
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
283 private void spaces() {
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
284 while( parser.anyOf(" \t") );
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
285 }
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
286
851b9a48cc44 Luan.parse
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
287 }