summaryrefslogtreecommitdiff
path: root/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'parser.cpp')
-rw-r--r--parser.cpp33
1 files changed, 31 insertions, 2 deletions
diff --git a/parser.cpp b/parser.cpp
index 764776c..fb9bf47 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -366,6 +366,35 @@ static vector<Expression> parseArgumentList(Tokeniser &tokeniser){
return args;
}
+static vector<Name> 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<Name> 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<Expression> args;
+ vector<Name> 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: "<<args<<endl;