aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/parsing/Parser.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2016-09-01 17:02:50 +0800
committerGitHub <noreply@github.com>2016-09-01 17:02:50 +0800
commitb5d941d3d9f32193c7f9094dee20511585508f6a (patch)
tree05b5156cbc8fb901102890994842412f18504d06 /libsolidity/parsing/Parser.cpp
parent4a26adfb7d4e962de094f4c6f02139181fac1699 (diff)
parent4abba77ddc0b4402597d13d5c29adcf5cac82e11 (diff)
downloaddexon-solidity-b5d941d3d9f32193c7f9094dee20511585508f6a.tar
dexon-solidity-b5d941d3d9f32193c7f9094dee20511585508f6a.tar.gz
dexon-solidity-b5d941d3d9f32193c7f9094dee20511585508f6a.tar.bz2
dexon-solidity-b5d941d3d9f32193c7f9094dee20511585508f6a.tar.lz
dexon-solidity-b5d941d3d9f32193c7f9094dee20511585508f6a.tar.xz
dexon-solidity-b5d941d3d9f32193c7f9094dee20511585508f6a.tar.zst
dexon-solidity-b5d941d3d9f32193c7f9094dee20511585508f6a.zip
Merge pull request #935 from chriseth/pragma
Version pragma
Diffstat (limited to 'libsolidity/parsing/Parser.cpp')
-rw-r--r--libsolidity/parsing/Parser.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp
index b8f72238..b2f4a156 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];