aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/parsing/Parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity/parsing/Parser.cpp')
-rw-r--r--libsolidity/parsing/Parser.cpp42
1 files changed, 41 insertions, 1 deletions
diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp
index b8f72238..0e99d1e7 100644
--- a/libsolidity/parsing/Parser.cpp
+++ b/libsolidity/parsing/Parser.cpp
@@ -76,6 +76,9 @@ ASTPointer<SourceUnit> Parser::parse(shared_ptr<Scanner> const& _scanner)
{
switch (auto token = m_scanner->currentToken())
{
+ case Token::Pragma:
+ nodes.push_back(parsePragmaDirective());
+ break;
case Token::Import:
nodes.push_back(parseImportDirective());
break;
@@ -97,6 +100,36 @@ ASTPointer<SourceUnit> Parser::parse(shared_ptr<Scanner> const& _scanner)
}
}
+ASTPointer<PragmaDirective> Parser::parsePragmaDirective()
+{
+ // pragma anything* ;
+ // Currently supported:
+ // pragma solidity ^0.4.0 || ^0.3.0;
+ ASTNodeFactory nodeFactory(*this);
+ expectToken(Token::Pragma);
+ vector<string> literals;
+ vector<Token::Value> tokens;
+ do
+ {
+ Token::Value token = m_scanner->currentToken();
+ if (token == Token::Illegal)
+ parserError("Token incompatible with Solidity parser as part of pragma directive.");
+ else
+ {
+ string literal = m_scanner->currentLiteral();
+ if (literal.empty() && Token::toString(token))
+ literal = Token::toString(token);
+ literals.push_back(literal);
+ tokens.push_back(token);
+ }
+ m_scanner->next();
+ }
+ while (m_scanner->currentToken() != Token::Semicolon && m_scanner->currentToken() != Token::EOS);
+ nodeFactory.markEndPosition();
+ expectToken(Token::Semicolon);
+ return nodeFactory.createNode<PragmaDirective>(tokens, literals);
+}
+
ASTPointer<ImportDirective> Parser::parseImportDirective()
{
// import "abc" [as x];
@@ -272,6 +305,7 @@ ASTPointer<FunctionDefinition> Parser::parseFunctionDefinition(ASTString const*
options.allowLocationSpecifier = true;
ASTPointer<ParameterList> parameters(parseParameterList(options));
bool isDeclaredConst = false;
+ bool isPayable = false;
Declaration::Visibility visibility(Declaration::Visibility::Default);
vector<ASTPointer<ModifierInvocation>> modifiers;
while (true)
@@ -282,6 +316,11 @@ ASTPointer<FunctionDefinition> Parser::parseFunctionDefinition(ASTString const*
isDeclaredConst = true;
m_scanner->next();
}
+ else if (m_scanner->currentToken() == Token::Payable)
+ {
+ isPayable = true;
+ m_scanner->next();
+ }
else if (token == Token::Identifier)
modifiers.push_back(parseModifierInvocation());
else if (Token::isVisibilitySpecifier(token))
@@ -321,6 +360,7 @@ ASTPointer<FunctionDefinition> Parser::parseFunctionDefinition(ASTString const*
isDeclaredConst,
modifiers,
returnParameters,
+ isPayable,
block
);
}
@@ -720,7 +760,7 @@ ASTPointer<Statement> Parser::parseStatement()
{
statement = ASTNodeFactory(*this).createNode<PlaceholderStatement>(docString);
m_scanner->next();
- return statement;
+ break;
}
// fall-through
default: