comparison src/luan/modules/parsers/LuanParser.java @ 1574:f118ead273a1

LuanParser.longString
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 20 Dec 2020 13:17:27 -0700
parents b89212fd04b5
children c922446f53aa
comparison
equal deleted inserted replaced
1573:c6b50b7b958c 1574:f118ead273a1
60 return tbl; 60 return tbl;
61 return null; 61 return null;
62 } 62 }
63 63
64 private String string() throws ParseException { 64 private String string() throws ParseException {
65 String s;
66 s = quotedString();
67 if( s != null )
68 return s;
69 s = longString();
70 if( s != null )
71 return s;
72 return null;
73 }
74
75 private String quotedString() throws ParseException {
65 parser.begin(); 76 parser.begin();
66 if( !parser.match('"') ) 77 if( !parser.match('"') )
67 return parser.failure(null); 78 return parser.failure(null);
68 StringBuilder sb = new StringBuilder(); 79 StringBuilder sb = new StringBuilder();
69 while( parser.anyChar() ) { 80 while( parser.anyChar() ) {
119 sb.append(c); 130 sb.append(c);
120 } 131 }
121 } 132 }
122 parser.failure(); 133 parser.failure();
123 throw exception("unclosed string"); 134 throw exception("unclosed string");
135 }
136
137 private String longString() throws ParseException {
138 parser.begin();
139 if( !parser.match('[') )
140 return parser.failure(null);
141 int start = parser.currentIndex();
142 while( parser.match('=') );
143 int nEquals = parser.currentIndex() - start;
144 if( !parser.match('[') )
145 return parser.failure(null);
146 endOfLine();
147 start = parser.currentIndex();
148 while( !longBracketsEnd(nEquals) ) {
149 if( !(endOfLine() || parser.anyChar()) )
150 throw exception("Unclosed long string");
151 }
152 String s = parser.text.substring( start, parser.currentIndex() - nEquals - 2 );
153 return parser.success(s);
154 }
155
156 private boolean longBracketsEnd(int nEquals) {
157 parser.begin();
158 if( !parser.match(']') )
159 return parser.failure();
160 while( nEquals-- > 0 ) {
161 if( !parser.match('=') )
162 return parser.failure();
163 }
164 if( !parser.match(']') )
165 return parser.failure();
166 return parser.success();
124 } 167 }
125 168
126 private Number number() { 169 private Number number() {
127 parser.begin(); 170 parser.begin();
128 if( parser.match("double") ) { 171 if( parser.match("double") ) {