diff options
author | tomsmeding <tom.smeding@gmail.com> | 2017-02-10 23:35:02 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2017-02-10 23:35:02 +0100 |
commit | ca45da0925cabc3bbf0d22d5d23ccb9a25d8e228 (patch) | |
tree | b96cb309d210e62deccdebfcc5646cfa2f3cb384 /parser.cpp | |
parent | 269f28df980f34895c3c7181140963b4a86a1afc (diff) |
Preliminary 'compiling'
Diffstat (limited to 'parser.cpp')
-rw-r--r-- | parser.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
@@ -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; |