diff --git a/js4g/StackMachine.cc b/js4g/StackMachine.cc index 62a2118..8bf3157 100644 --- a/js4g/StackMachine.cc +++ b/js4g/StackMachine.cc @@ -27,7 +27,7 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m { while( not tokenStack.empty() and tokenStack.back().hasNext() ) { - runWord( next() ); + runWord( std::get< std::string_view >( next() ) ); if( C::debug ) std::cerr << "After processing stack is now: " << std::endl; if( C::debug ) for( const auto &element: stack ) @@ -43,7 +43,7 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m if( C::debug ) std::cerr << "Run done with stack at size: " << stack.size() << std::endl; } - std::string_view + StackMachine::Token StackMachine::next() { if( tokenStack.empty() ) @@ -88,8 +88,8 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m } if( C::debug ) std::cerr << "Definition of " << definition.value() << " is done. It is: " << std::endl; - if( C::debug ) std::copy( begin( words.at( definition.value() ) ), end( words.at( definition.value() ) ), - std::ostream_iterator< std::string >{ std::cout, "\n" } ); + //if( C::debug ) std::copy( begin( words.at( definition.value() ) ), end( words.at( definition.value() ) ), + //std::ostream_iterator< std::string >{ std::cout, "\n" } ); definition= std::nullopt; } else if( definition.has_value() ) @@ -203,6 +203,8 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m if( C::debug ) std::cerr << "Starting function definition for " << definition.value() << std::endl; } + else if( word == "0"sv ) push( 0 ); + else if( word == "1"sv ) push( 1 ); else if( word.at( 0 ) == '@' ) { const auto invoke= word.substr( 1 ); diff --git a/js4g/StackMachine.h b/js4g/StackMachine.h index b603a3b..a1fa032 100644 --- a/js4g/StackMachine.h +++ b/js4g/StackMachine.h @@ -50,10 +50,11 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m // It's `void *` to break the cycle with itself struct TokenHolder; - //using Token= std::variant< std::string, TokenHolder * >; - using Token= std::string; + using Token= std::variant< std::string_view, TokenHolder *>; - std::vector< std::string > tokens; + std::vector< std::string > backing; + + std::vector< Token > tokens; struct Tokenizer { @@ -66,14 +67,14 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m bool hasNext() const { return pos != end; } - std::string_view next() { return *pos++; } + Token next() { return *pos++; } }; std::vector< Tokenizer > tokenStack; std::list< std::string > wordNames; - std::unordered_map< std::string_view, std::vector< std::string > > words; + std::unordered_map< std::string_view, std::vector< Token > > words; // Which side of the current conditional to take. enum ConditionalState { If, Else, Skipped }; @@ -104,7 +105,7 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m void push( const T &t ); - std::string_view next(); + Token next(); void recurse( std::string_view func ); @@ -114,7 +115,9 @@ namespace Dillo::Hydrogen::JavaScriptForge ::detail:: StackMachine_m void loadProgram( std::vector< std::string > tokens ) { - this->tokens= std::move( tokens ); + backing= std::move( tokens ); + this->tokens.clear(); + std::copy( begin( backing ), end( backing ), back_inserter( this->tokens ) ); tokenStack.clear(); tokenStack.emplace_back( this->tokens ); }