#include <iostream>
#include <string>
#include <lexer.hpp>

using namespace std;

typedef Lexer * Compiler_Lexer;
int show_token( Token *token );
int just_toke_it( Lexer *lexer, const char *script );

int main() {
	const char *filename = "foo.pl";
	bool verbose = false;
	Lexer *lexer = new Lexer(filename, verbose);

	just_toke_it( lexer, "$scalar->$*" );

	just_toke_it( lexer, "$array->@*" );
	just_toke_it( lexer, "$array->@[0]" );
	just_toke_it( lexer, "$array->@[0,1]" );
	just_toke_it( lexer, "$array->@[@indices]" );
	just_toke_it( lexer, "$array->$#*" );

	just_toke_it( lexer, "$hash->%*" );
	just_toke_it( lexer, "$hash->%{'key'}" );
	just_toke_it( lexer, "$hash->%{'key','key2'}" );
	just_toke_it( lexer, "$hash->%{@keys}" );

	just_toke_it( lexer, "$coderef->&('arg','arg2')" );
	just_toke_it( lexer, "$coderef->&*" );

	just_toke_it( lexer, "$typeglob->**" );
	just_toke_it( lexer, "$typeglob->*{SCALAR}" );

	return 0;
	}

int just_toke_it( Lexer *lexer, const char *script ) {
	Tokens *tokens = lexer->tokenize((char *)script);

	cout << "==================" 
		<< endl 
		<< script 
		<< endl 
		<< "-------------------" 
		<< endl;

	size_t size = tokens->size();
	for (size_t i = 0; i < size; i++) {
		Token *token = tokens->at(i);
		show_token( token );
		}
	
	return 1;
	}

int show_token( Token *token ) {
	printf( 
		"%-20s | %-s\n",
		token->info.name,
		token->_data
		);
	return 1;
	}	

/*

		HV *hash = (HV*)new_Hash();
		(void)hv_stores(hash, "stype", set(new_Int(token->stype)));
		(void)hv_stores(hash, "type", set(new_Int(token->info.type)));
		(void)hv_stores(hash, "kind", set(new_Int(token->info.kind)));
		(void)hv_stores(hash, "line", set(new_Int(token->finfo.start_line_num)));
		(void)hv_stores(hash, "has_warnings", set(new_Int(token->info.has_warnings)));
		(void)hv_stores(hash, "name", set(new_String(token->info.name, strlen(token->info.name))));
		(void)hv_stores(hash, "data", set(new_String(token->_data, strlen(token->_data))));

*/