Newer
Older
libj / modules / parser / src / main.cpp
#include <iostream>
#include <iomanip>

#include <tokenizer.hpp>
#include <parser.hpp>

using namespace xtokenizer;
using namespace parser;

/**
 * Token を出力します。
 *
 * @param tokens 出力するトークンリスト
 */
void dumpTokens(const std::vector<Token> &tokens)
{
    for (Token token : tokens)
    {
        std::cout << std::setw(4) << std::right << token.line << ":"
                  << std::setw(10) << std::left << toTokenTypeSymbol(token.type)
                  << " " << token.str;
        if (token.type == TokenType::T_INTEGER)
        {
            std::cout << "\t value = " << token.value.i;
        }
        else if (token.type == TokenType::T_FLOAT)
        {
            std::cout << "\t value = " << token.value.f;
        }

        if (token.type == TokenType::T_KEYWORD)
        {
            std::cout << "\t [keyword] " << static_cast<int>(token.keyword) << std::endl;
        }
        std::cout << std::endl;
    }
}

#if defined(UNITTEST)
int dummy(int argc, char *argv[])
#else
int main(int argc, char *argv[])
#endif
{
    if (argc < 2)
    {
        std::cout << "./xtokenizer <file>" << std::endl;
        return 1;
    }

    const char *fileName = argv[1];
    Tokenizer tokenizer(fileName);
    std::vector<Token> &tokens = tokenizer.parse();
    dumpTokens(tokens);

    Parser parser(tokens);
    std::unique_ptr<Node> node = parser.parse();
    node->dump();

    return 0;
}