diff options
author | Christian <c@ethdev.com> | 2014-12-03 14:46:55 +0800 |
---|---|---|
committer | Christian <c@ethdev.com> | 2014-12-03 17:44:46 +0800 |
commit | 328387d6d0a14143f1634df11036a91fad85cec9 (patch) | |
tree | 0c790402332a3fdc4fc8beddd57929db148b8c36 /Parser.cpp | |
parent | 9dadeea37710fe23a7512035b69356f3405ee6f1 (diff) | |
download | dexon-solidity-328387d6d0a14143f1634df11036a91fad85cec9.tar dexon-solidity-328387d6d0a14143f1634df11036a91fad85cec9.tar.gz dexon-solidity-328387d6d0a14143f1634df11036a91fad85cec9.tar.bz2 dexon-solidity-328387d6d0a14143f1634df11036a91fad85cec9.tar.lz dexon-solidity-328387d6d0a14143f1634df11036a91fad85cec9.tar.xz dexon-solidity-328387d6d0a14143f1634df11036a91fad85cec9.tar.zst dexon-solidity-328387d6d0a14143f1634df11036a91fad85cec9.zip |
Import directive.
Diffstat (limited to 'Parser.cpp')
-rw-r--r-- | Parser.cpp | 43 |
1 files changed, 35 insertions, 8 deletions
@@ -20,6 +20,7 @@ * Solidity parser. */ +#include <vector> #include <libdevcore/Log.h> #include <libsolidity/BaseTypes.h> #include <libsolidity/Parser.h> @@ -33,13 +34,6 @@ namespace dev namespace solidity { -ASTPointer<ContractDefinition> Parser::parse(shared_ptr<Scanner> const& _scanner) -{ - m_scanner = _scanner; - return parseContractDefinition(); -} - - /// AST node factory that also tracks the begin and end position of an AST node /// while it is being parsed class Parser::ASTNodeFactory @@ -65,6 +59,28 @@ private: Location m_location; }; +ASTPointer<SourceUnit> Parser::parse(shared_ptr<Scanner> const& _scanner) +{ + m_scanner = _scanner; + ASTNodeFactory nodeFactory(*this); + vector<ASTPointer<ASTNode>> nodes; + while (_scanner->getCurrentToken() != Token::EOS) + { + switch (m_scanner->getCurrentToken()) + { + case Token::IMPORT: + nodes.push_back(parseImportDirective()); + break; + case Token::CONTRACT: + nodes.push_back(parseContractDefinition()); + break; + default: + BOOST_THROW_EXCEPTION(createParserError(std::string("Expected import directive or contract definition."))); + } + } + return nodeFactory.createNode<SourceUnit>(nodes); +} + int Parser::getPosition() const { return m_scanner->getCurrentLocation().start; @@ -75,6 +91,18 @@ int Parser::getEndPosition() const return m_scanner->getCurrentLocation().end; } +ASTPointer<ImportDirective> Parser::parseImportDirective() +{ + ASTNodeFactory nodeFactory(*this); + expectToken(Token::IMPORT); + if (m_scanner->getCurrentToken() != Token::STRING_LITERAL) + BOOST_THROW_EXCEPTION(createParserError("Expected string literal (URL).")); + ASTPointer<ASTString> url = getLiteralAndAdvance(); + nodeFactory.markEndPosition(); + expectToken(Token::SEMICOLON); + return nodeFactory.createNode<ImportDirective>(url); +} + ASTPointer<ContractDefinition> Parser::parseContractDefinition() { ASTNodeFactory nodeFactory(*this); @@ -112,7 +140,6 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition() } nodeFactory.markEndPosition(); expectToken(Token::RBRACE); - expectToken(Token::EOS); return nodeFactory.createNode<ContractDefinition>(name, structs, stateVariables, functions); } |