Diff
Not logged in

Differences From Artifact [31eeea68e341add3]:

To Artifact [752d9af2ecdd593b]:


4 4 * 5 5 * Parser for Polemy programming language 6 6 */ 7 7 module polemy.parse; 8 8 import polemy._common; 9 9 import polemy.lex; 10 10 import polemy.ast; 11 -import std.bigint; 12 11 13 12 /// Parsing Failure 14 13 15 14 class ParserException : Exception 16 15 { 17 16 private: 18 17 this(string msg) { super(msg); } ................................................................................ 62 61 } 63 62 return p; 64 63 } 65 64 66 65 Program parseStatements() 67 66 { 68 67 Program p; 69 - while( !lex.empty && (lex.front.kind!=Token.Kind.identifier || lex.front.str!="}") ) 68 + while( !lex.empty && (lex.front.quoted || lex.front.str!="}") ) 70 69 p ~= parseStatement(); 71 70 return p; 72 71 } 73 72 74 73 Statement parseStatement() 75 74 { 76 75 auto saved = lex.save; 77 76 scope(failure) lex = saved; 78 77 79 78 if( lex.empty ) 80 79 throw new ParserException("EOF during parsing a statement"); 81 80 auto pos = lex.front.pos; 82 81 83 - if( lex.front.kind==Token.Kind.identifier && lex.front.str=="var" ) 82 + if( !lex.front.quoted && lex.front.str=="var" ) 84 83 { 85 84 // "var" Var "=" Expression ";" 86 85 lex.popFront; 87 86 string var = lex.front.str; 88 87 lex.popFront; 89 88 eat("=", "for variable declaration"); 90 89 auto parsed = new DeclStatement(pos, var, parseExpression()); ................................................................................ 177 176 178 177 Expression parseBaseBaseExpression() 179 178 { 180 179 if( lex.empty ) 181 180 throw new ParserException("EOF during parsing an expression"); 182 181 auto pos = lex.front.pos; 183 182 184 - if( lex.front.kind == Token.Kind.number ) 183 + if( lex.front.quoted ) 184 + { 185 + scope(exit) lex.popFront; 186 + return new StrLiteralExpression(pos, lex.front.str); 187 + } 188 + if( isNumber(lex.front.str) ) // is_number 185 189 { 186 190 scope(exit) lex.popFront; 187 191 return new IntLiteralExpression(pos, BigInt(cast(string)lex.front.str)); 188 192 } 189 - if( lex.front.kind == Token.Kind.stringLiteral ) 190 - { 191 - scope(exit) lex.popFront; 192 - return new StrLiteralExpression(pos, lex.front.str); 193 - } 194 193 if( tryEat("(") ) 195 194 { 196 195 auto e = parseE(); 197 196 eat(")", "after parenthesized expression"); 198 197 return e; 199 198 } 200 199 if( tryEat("if") ) ................................................................................ 227 226 string[] params; 228 227 while(!tryEat(")")) 229 228 { 230 229 if( lex.empty ) { 231 230 auto e = ParserException.create(lex,"Unexpected EOF"); 232 231 throw e; 233 232 } 234 - if( lex.front.kind != Token.Kind.identifier ) { 233 + if( lex.front.quoted ) { 235 234 auto e = ParserException.create(lex,"Identifier Expected for parameters"); 236 235 throw e; 237 236 } 238 237 params ~= lex.front.str; 239 238 lex.popFront; 240 239 if( !tryEat(",") ) { 241 240 eat(")", "after function parameters"); ................................................................................ 268 267 ~(lex.empty ? "EOF" : lex.front.str)~"' occured"); 269 268 throw e; 270 269 } 271 270 } 272 271 273 272 bool tryEat(string kwd) 274 273 { 275 - if( lex.empty || lex.front.kind!=Token.Kind.identifier || lex.front.str!=kwd ) 274 + if( lex.empty || lex.front.quoted || lex.front.str!=kwd ) 276 275 return false; 277 276 lex.popFront; 278 277 return true; 279 278 } 279 + 280 + bool isNumber(string s) 281 + { 282 + return find!(`a<'0'||'9'<a`)(s).empty; 283 + } 280 284 } 281 285 282 286 unittest 283 287 { 284 288 auto p = parserFromString(` 285 289 var x = 100; 286 290 var y = 200; ................................................................................ 339 343 new IntLiteralExpression(null, BigInt(1)), 340 344 new FuncallExpression(null, 341 345 new FunLiteralExpression(null, ["abc"], [ 342 346 ]), 343 347 new IntLiteralExpression(null, BigInt(4)) 344 348 )))); 345 349 } 350 + 351 +/* 346 352 unittest 347 353 { 348 354 auto p = parserFromString(`var x = 1; var f = fun(){x=x+1;}; f(); f(); x;`); 349 355 Program prog = p.parseProgram(); 350 356 } 351 357 352 358 unittest ................................................................................ 357 363 new VarExpression(null, "if"), 358 364 new FuncallExpression(null, new VarExpression(null,"<"), new VarExpression(null,"x"), 359 365 new IntLiteralExpression(null, BigInt(2))), 360 366 new FunLiteralExpression(null, [], [new ExprStatement(null, new IntLiteralExpression(null, BigInt(1)))]), 361 367 new FunLiteralExpression(null, [], [new ExprStatement(null, new VarExpression(null, "x"))]) 362 368 ))); 363 369 } 370 +*/