view trunk/src/main.d @ 364:1059295c2727

- Every command module has an execute method now. - Added module cmd.ImportGraph. - Renamed ModuleName to ModuleFQN. - Added module dil.Module. - Added member 'imports' to class Parser.
author aziz
date Fri, 31 Aug 2007 00:53:00 +0000
parents 2b387a3c6b58
children dcbd3bf9bf74
line wrap: on
line source

/++
  Author: Aziz Köksal
  License: GPL3
+/
module main;
import std.stdio;
import dil.Parser;
import dil.Lexer;
import dil.Token;
import dil.Messages;
import dil.Settings;
import dil.Declarations, dil.Expressions, dil.SyntaxTree;
import dil.File;
import cmd.Generate;
import cmd.Statistics;
import cmd.ImportGraph;

void main(char[][] args)
{
  GlobalSettings.load();

  if (args.length <= 1)
    return writefln(helpMain());

  string command = args[1];
  switch (command)
  {
  case "gen", "generate":
    char[] fileName;
    DocOption options = DocOption.Tokens;
    foreach (arg; args[2..$])
    {
      switch (arg)
      {
      case "--syntax":
        options |= DocOption.Syntax; break;
      case "--xml":
        options |= DocOption.XML; break;
      case "--html":
        options |= DocOption.HTML; break;
      default:
        fileName = arg;
      }
    }
    if (!(options & (DocOption.XML | DocOption.HTML)))
      options |= DocOption.XML; // Default to XML.
    cmd.Generate.execute(fileName, options);
    break;
  case "stats", "statistics":
    cmd.Statistics.execute(args[2]);
    break;
  case "parse":
    if (args.length == 3)
      parse(args[2]);
    break;
  case "?", "help":
    if (args.length == 3)
      printHelp(args[2]);
    else
      writefln(helpMain());
    break;
  default:
  }
}

const char[] COMMANDS =
  "  generate (gen)\n"
  "  help (?)\n"
  "  statistics (stats)\n";

char[] helpMain()
{
  return format(MID.HelpMain, VERSION, COMMANDS, COMPILED_WITH, COMPILED_VERSION, COMPILED_DATE);
}

void printHelp(char[] command)
{
  char[] msg;
  switch (command)
  {
  case "gen", "generate":
    msg = GetMsg(MID.HelpGenerate);
    break;
  default:
    msg = helpMain();
  }
  writefln(msg);
}

void parse(string fileName)
{
  auto sourceText = loadFile(fileName);
  auto parser = new Parser(sourceText, fileName);
  parser.start();
  auto root = parser.parseModule();

void print(Node[] decls, char[] indent)
{
  foreach(decl; decls)
  {
    assert(decl !is null);
    writefln(indent, decl.classinfo.name, ": begin=%s end=%s", decl.begin ? decl.begin.srcText : "\33[31mnull\33[0m", decl.end ? decl.end.srcText : "\33[31mnull\33[0m");
    print(decl.children, indent ~ "  ");
  }
}
print(root.children, "");
foreach (error; parser.errors)
{
  writefln(`%s(%d)P: %s`, parser.lx.fileName, error.loc, error.getMsg);
}
}