MCPcopy Create free account
hub / github.com/LemonOSProject/LemonOS / Parse

Function Parse

InterfaceCompiler/main.cpp:359–468  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

357}
358
359void Parse(){
360 std::stack<ParserState> states;
361
362 states.push(ParserState(ParserStateRoot));
363
364 auto it = tokens.begin();
365 while(it != tokens.end()){
366 Token& tok = *it;
367 ParserState pState = states.top();
368
369 switch(pState.state){
370 case ParserStateRoot:
371 switch(tok.type){
372 case TokenKeyword: {
373 KeywordType kw = keywords.at(tok.value); // Get keyword id
374
375 if(kw == KeywordInterface){
376 std::shared_ptr<InterfaceDeclarationStatement> ifDecl = ParseInterfaceDeclarationStatement(++it);
377 it++;
378
379 statements.push_back(ifDecl);
380 states.push(ParserStateInterface);
381
382 states.top().statement = ifDecl;
383 } else {
384 printf("error: [line %d:%d] Unexpected keyword '%s'!", tok.lineNum, tok.linePos, tok.value.c_str());
385 exit(3);
386 }
387 break;
388 } case TokenEndline:
389 it++;
390 continue;
391 default:
392 printf("error: [line %d:%d] Unexpected token '%s'!", tok.lineNum, tok.linePos, tokenNames[tok.type].c_str());
393 exit(3);
394 continue;
395 }
396 break;
397 case ParserStateInterface:
398 switch(tok.type){
399 case TokenIdentifier: {
400 Token next = *(++it);
401
402 if(next.type == TokenLeftParens){ // Parse parameter list
403 ParameterList pList = ParseParameterListStatement(tokens.end(), ++it);
404
405 Token response = *(it++);
406 if(response.type == TokenResponse){
407 // Synchronous method
408 if(it->type == TokenLeftParens){ // Check for return parameters
409 it++;
410
411 ParameterList rPList = ParseParameterListStatement(tokens.end(), it);
412
413 std::shared_ptr method = std::shared_ptr<SynchronousMethod>(new SynchronousMethod(tok.value));
414 method->parameters = pList;
415 method->returnParameters = rPList;
416

Callers 1

mainFunction · 0.70

Calls 6

topMethod · 0.80
ParserStateClass · 0.70
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected