aboutsummaryrefslogtreecommitdiffstats
path: root/Parser.cpp
diff options
context:
space:
mode:
authorChristian <c@ethdev.com>2014-12-03 14:46:55 +0800
committerChristian <c@ethdev.com>2014-12-03 17:44:46 +0800
commit328387d6d0a14143f1634df11036a91fad85cec9 (patch)
tree0c790402332a3fdc4fc8beddd57929db148b8c36 /Parser.cpp
parent9dadeea37710fe23a7512035b69356f3405ee6f1 (diff)
downloaddexon-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.cpp43
1 files changed, 35 insertions, 8 deletions
diff --git a/Parser.cpp b/Parser.cpp
index 2a76a05a..c385dd8d 100644
--- a/Parser.cpp
+++ b/Parser.cpp
@@ -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);
}