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 |         const bool& quoteTokenText = false | ||||||
|     ) { error(token, text, token.line, quoteTokenText); } |     ) { 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) |     IS(ParseTree) | ||||||
|     inline T parse(const input_iterator auto&, const input_iterator auto&); |     inline T parse(const input_iterator auto&, const input_iterator auto&); | ||||||
| 
 | 
 | ||||||
| @ -74,7 +86,7 @@ namespace Parser { | |||||||
|                         if (nextAre({LCOMP, LCOMP, LBRACE})) { |                         if (nextAre({LCOMP, LCOMP, LBRACE})) { | ||||||
|                             Function function(current.toktext); |                             Function function(current.toktext); | ||||||
|                             if (parametersDistance > 2) { |                             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; |                             parseTree << function; | ||||||
|                             i += 2; |                             i += 2; | ||||||
| @ -106,16 +118,7 @@ namespace Parser { | |||||||
|                 case LPAR: case LBRACE: case LBRACKET: { |                 case LPAR: case LBRACE: case LBRACKET: { | ||||||
|                     const auto closingCharacter = find_corresponding(lexed.begin() + i + 1, lexed.end(), current.toktype, tok::inverseLCharacter(current.toktype)); |                     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); |                     vector<tok> subTokens(lexed.begin() + i + 1, closingCharacter); | ||||||
|                     if (current.toktype == LPAR || current.toktype == LBRACKET) { |                     if (current.toktype == LPAR || current.toktype == LBRACKET) filter_comma_list(subTokens); | ||||||
|                         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 (not parseTree.empty()) { |                     if (not parseTree.empty()) { | ||||||
|                         try { |                         try { | ||||||
|                             auto& previous = dynamic_cast<ParseTree&>(*parseTree.at(parseTree.size() - 1)); |                             auto& previous = dynamic_cast<ParseTree&>(*parseTree.at(parseTree.size() - 1)); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user