From ca45da0925cabc3bbf0d22d5d23ccb9a25d8e228 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Fri, 10 Feb 2017 23:35:02 +0100 Subject: Preliminary 'compiling' --- parser.cpp | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'parser.cpp') diff --git a/parser.cpp b/parser.cpp index 764776c..fb9bf47 100644 --- a/parser.cpp +++ b/parser.cpp @@ -366,6 +366,35 @@ static vector parseArgumentList(Tokeniser &tokeniser){ return args; } +static vector parseArgumentNameList(Tokeniser &tokeniser){ + if(tokeniser.eof())throw ParseError(tokeniser.site(),"Expected argument name list but found EOF"); + Token tok=tokeniser.get(); + if(tok.type!=Token::Type::symbol||tok.str!="("){ + throw ParseError(tok.site,"Expected argument name list but found '"+tok.str+"'"); + } + tokeniser.advance(); + vector args; + while(true){ + tok=tokeniser.get(); + if(tok.type!=Token::Type::word){ + throw ParseError(tok.site,"Expected argument name but found something else"); + } + Name name=tok.str; + tokeniser.advance(); + if(tokeniser.eof()){ + throw ParseError(tokeniser.site(),"Expected ')' or ',' after argument name but found EOF"); + } + tok=tokeniser.get(); + if(tok.type!=Token::Type::symbol||(tok.str!=")"&&tok.str!=",")){ + throw ParseError(tok.site,"Expected ')' or ',' after argument name but found something else"); + } + tokeniser.advance(); + args.push_back(name); + if(tok.str==")")break; + } + return args; +} + static Expression parseAtom(Tokeniser &tokeniser){ if(tokeniser.eof())throw ParseError(tokeniser.site(),"Expected atom but found EOF"); Token tok=tokeniser.get(); @@ -456,7 +485,7 @@ static Expression parseAtom(Tokeniser &tokeniser){ else if(tok.str!="{"){ throw ParseError(tok.site,"Unexpected token '"+tok.str+"' in expression atom position"); } else sctype=ScopeDef::Type::direct; - vector args; + vector args; if(sctype!=ScopeDef::Type::direct){ tokeniser.advance(); if(tokeniser.eof()){ @@ -467,7 +496,7 @@ static Expression parseAtom(Tokeniser &tokeniser){ throw ParseError(tok2.site,"Expected '(' or '{' after '"+tok.str+"'"); } if(tok2.type==Token::Type::symbol&&tok2.str=="("){ - args=parseArgumentList(tokeniser); + args=parseArgumentNameList(tokeniser); } } // DEBUG<<"args: "<