Parser.hpp: Add a "filter_comma_list" function to fix commas in parameters or arguments lists
Signed-off-by: Username404 <w.iron.zombie@gmail.com>
This commit is contained in:
		
							parent
							
								
									0d12f7eceb
								
							
						
					
					
						commit
						21ab59fc6d
					
				| @ -19,6 +19,18 @@ namespace Parser { | ||||
|         const bool& quoteTokenText = false | ||||
|     ) { error(token, text, token.line, quoteTokenText); } | ||||
| 
 | ||||
|     void filter_comma_list(vector<tok>& tokens) { | ||||
|         if (tokens.size() >= 2 && tokens[1].toktype != tok::RPAR) { | ||||
|             for (auto iterator = tokens.begin(); iterator < tokens.end() - 1; ++iterator) { | ||||
|                 const auto nextIterator = iterator + 1; | ||||
|                 if (nextIterator->toktype == tok::COMMA) { | ||||
|                     tokens.erase(nextIterator); | ||||
|                 } else throw ParsingException("Missing comma after \"" + iterator->toktext + '"'); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     inline vector<tok> filter_comma_list(vector<tok>&& tokens) { filter_comma_list(tokens); return tokens; } | ||||
| 
 | ||||
|     IS(ParseTree) | ||||
|     inline T parse(const input_iterator auto&, const input_iterator auto&); | ||||
| 
 | ||||
| @ -74,7 +86,7 @@ namespace Parser { | ||||
|                         if (nextAre({LCOMP, LCOMP, LBRACE})) { | ||||
|                             Function function(current.toktext); | ||||
|                             if (parametersDistance > 2) { | ||||
|                                 function.parameters = parse(lexed.begin() + ((i + 2) - parametersDistance), lexed.begin() + i); | ||||
|                                 function.parameters = parse(filter_comma_list(vector(lexed.begin() + ((i + 2) - parametersDistance), lexed.begin() + i))); | ||||
|                             } | ||||
|                             parseTree << function; | ||||
|                             i += 2; | ||||
| @ -106,16 +118,7 @@ namespace Parser { | ||||
|                 case LPAR: case LBRACE: case LBRACKET: { | ||||
|                     const auto closingCharacter = find_corresponding(lexed.begin() + i + 1, lexed.end(), current.toktype, tok::inverseLCharacter(current.toktype)); | ||||
|                     vector<tok> subTokens(lexed.begin() + i + 1, closingCharacter); | ||||
|                     if (current.toktype == LPAR || current.toktype == LBRACKET) { | ||||
|                         if (subTokens.size() >= 2 && subTokens[1].toktype != RPAR) { | ||||
|                             for (auto iterator = subTokens.cbegin(); iterator < (subTokens.cend() - 1); ++iterator) { | ||||
|                                 const auto nextIterator = iterator + 1; | ||||
|                                 if (nextIterator->toktype == COMMA) { | ||||
|                                     subTokens.erase(nextIterator); | ||||
|                                 } else throw ParsingException("Missing comma after \"" + iterator->toktext + '"'); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     if (current.toktype == LPAR || current.toktype == LBRACKET) filter_comma_list(subTokens); | ||||
|                     if (not parseTree.empty()) { | ||||
|                         try { | ||||
|                             auto& previous = dynamic_cast<ParseTree&>(*parseTree.at(parseTree.size() - 1)); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user