Mercurial > projects > dil
diff trunk/src/main.d @ 306:9c866aadcb5b
- Moved code out of main() to separate functions.
- Added compiler version info and main help message.
author | aziz |
---|---|
date | Tue, 14 Aug 2007 17:53:03 +0000 |
parents | df237b3b5f09 |
children | 5f6a173d4ad3 |
line wrap: on
line diff
--- a/trunk/src/main.d Tue Aug 14 12:18:01 2007 +0000 +++ b/trunk/src/main.d Tue Aug 14 17:53:03 2007 +0000 @@ -9,25 +9,54 @@ import Messages; import std.stdio; import std.file; +import std.metastrings; -char[] xmlescape(char[] text) +import Declarations, SyntaxTree; + +version(D2) +{ + const VERSION_MAJOR = 2; + const VERSION_MINOR = 0; +} +else { - char[] result; - foreach(c; text) - switch(c) - { - case '<': result ~= "<"; break; - case '>': result ~= ">"; break; - case '&': result ~= "&"; break; - default: result ~= c; - } - return result; + const VERSION_MAJOR = 1; + const VERSION_MINOR = 0; } -import Declarations, SyntaxTree; +const string VERSION = Format!("%s.%s", VERSION_MAJOR, VERSION_MINOR); + +const char[] usageHighlight = "highlight (hl) file.d"; +const string helpMain = `dil v`~VERSION~` +Copyright (c) 2007 by Aziz Köksal + +Subcommands: + `~usageHighlight~` + +Type 'dil help <subcommand>' for more help on a particular subcommand. + +Compiled with `~__VENDOR__~` `~Format!("v%s.%s", __VERSION__/1000, __VERSION__%1000)~` on `~__TIMESTAMP__~`. +`; + void main(char[][] args) { - auto srctext = cast(char[]) std.file.read(args[1]); - auto parser = new Parser(srctext, args[1]); + if (args.length <= 1) + return writefln(helpMain); + + string command = args[1]; + switch (command) + { + case "hl", "highlight": + if (args.length == 3) + highlightTokens(args[2]); + break; + default: + } +} + +void parse(string fileName) +{ + auto sourceText = cast(char[]) std.file.read(fileName); + auto parser = new Parser(sourceText, fileName); parser.start(); auto root = parser.parseModule(); @@ -45,111 +74,137 @@ { writefln(`%s(%d)P: %s`, parser.lx.fileName, error.loc, error.getMsg); } -std.c.stdlib.exit(0); +} - auto lx = new Lexer(srctext, args[1]); +char[] xml_escape(char[] text) +{ + char[] result; + foreach(c; text) + switch(c) + { + case '<': result ~= "<"; break; + case '>': result ~= ">"; break; + case '&': result ~= "&"; break; + default: result ~= c; + } + return result; +} - auto tokens = lx.getTokens(); +void highlightTokens(string fileName) +{ + auto sourceText = cast(char[]) std.file.read(fileName); + auto lx = new Lexer(sourceText, fileName); + + auto token = lx.getTokens(); char* end = lx.text.ptr; - writef(`<?xml version="1.0"?> -<?xml-stylesheet href="format.css" type="text/css"?> -<root> -<compilerinfo>`\n); - foreach (error; lx.errors) + writef(`<?xml version="1.0"?>` + `<?xml-stylesheet href="format.css" type="text/css"?>` + `<root>`); + if (lx.errors.length) { - writefln(`<error t="%s">%s(%d): %s</error>`, "l", lx.fileName, error.loc, error.getMsg); + writefln("<compilerinfo>"); + foreach (error; lx.errors) + { + writefln(`<error t="%s">%s(%d): %s</error>`, "l", lx.fileName, error.loc, xml_escape(error.getMsg)); + } + writefln("</compilerinfo>"); } - writef(`</compilerinfo> -<sourcetext>`); - foreach (ref token; tokens) + writef(`<sourcetext>`); + + // Traverse linked list and print tokens. + while (token.type != TOK.EOF) { + token = token.next; + + // Print whitespace between previous and current token. if (end != token.start) - writef("%s", xmlescape(end[0 .. token.start - end])); - string srcText = xmlescape(token.srcText); + writef("%s", xml_escape(end[0 .. token.start - end])); + + string srcText = xml_escape(token.srcText); + switch(token.type) { - case TOK.Identifier: - writef("<i>%s</i>", srcText); + case TOK.Identifier: + writef("<i>%s</i>", srcText); break; - case TOK.Comment: - string c; - switch (token.start[1]) - { - case '/': c = "lc"; break; - case '*': c = "bc"; break; - case '+': c = "nc"; break; - default: - assert(0); - } - writef(`<c c="%s">%s</c>`, c, srcText); + case TOK.Comment: + string c; + switch (token.start[1]) + { + case '/': c = "l"; break; + case '*': c = "b"; break; + case '+': c = "n"; break; + default: + assert(0); + } + writef(`<c c="%s">%s</c>`, c, srcText); break; - case TOK.String: - writef("<sl>%s</sl>", srcText); + case TOK.String: + writef("<sl>%s</sl>", srcText); break; - case TOK.CharLiteral, TOK.WCharLiteral, TOK.DCharLiteral: - writef("<cl>%s</cl>", srcText); + case TOK.CharLiteral, TOK.WCharLiteral, TOK.DCharLiteral: + writef("<cl>%s</cl>", srcText); break; - case TOK.Assign, TOK.Equal, - TOK.Less, TOK.Greater, - TOK.LShiftAssign, TOK.LShift, - TOK.RShiftAssign, TOK.RShift, - TOK.URShiftAssign, TOK.URShift, - TOK.OrAssign, TOK.OrBinary, - TOK.AndAssign, TOK.AndBinary, - TOK.PlusAssign, TOK.PlusPlus, TOK.Plus, - TOK.MinusAssign, TOK.MinusMinus, TOK.Minus, - TOK.DivAssign, TOK.Div, - TOK.MulAssign, TOK.Mul, - TOK.ModAssign, TOK.Mod, - TOK.XorAssign, TOK.Xor, - TOK.CatAssign, TOK.Catenate, - TOK.Tilde, - TOK.Unordered, - TOK.UorE, - TOK.UorG, - TOK.UorGorE, - TOK.UorL, - TOK.UorLorE, - TOK.LorEorG: - writef("<op>%s</op>", srcText); + case TOK.Assign, TOK.Equal, + TOK.Less, TOK.Greater, + TOK.LShiftAssign, TOK.LShift, + TOK.RShiftAssign, TOK.RShift, + TOK.URShiftAssign, TOK.URShift, + TOK.OrAssign, TOK.OrBinary, + TOK.AndAssign, TOK.AndBinary, + TOK.PlusAssign, TOK.PlusPlus, TOK.Plus, + TOK.MinusAssign, TOK.MinusMinus, TOK.Minus, + TOK.DivAssign, TOK.Div, + TOK.MulAssign, TOK.Mul, + TOK.ModAssign, TOK.Mod, + TOK.XorAssign, TOK.Xor, + TOK.CatAssign, TOK.Catenate, + TOK.Tilde, + TOK.Unordered, + TOK.UorE, + TOK.UorG, + TOK.UorGorE, + TOK.UorL, + TOK.UorLorE, + TOK.LorEorG: + writef("<op>%s</op>", srcText); break; - case TOK.LorG: - writef(`<op c="lg"><></op>`); + case TOK.LorG: + writef(`<op c="lg"><></op>`); break; - case TOK.LessEqual: - writef(`<op c="le"><=</op>`); + case TOK.LessEqual: + writef(`<op c="le"><=</op>`); break; - case TOK.GreaterEqual: - writef(`<op c="ge">>=</op>`); + case TOK.GreaterEqual: + writef(`<op c="ge">>=</op>`); break; - case TOK.AndLogical: - writef(`<op c="aa">&&</op>`); + case TOK.AndLogical: + writef(`<op c="aa">&&</op>`); break; - case TOK.OrLogical: - writef(`<op c="oo">||</op>`); + case TOK.OrLogical: + writef(`<op c="oo">||</op>`); break; - case TOK.NotEqual: - writef(`<op c="ne">!=</op>`); + case TOK.NotEqual: + writef(`<op c="ne">!=</op>`); break; - case TOK.Not: - writef(`<op c="n">!</op>`); + case TOK.Not: + writef(`<op c="n">!</op>`); break; - case TOK.Int32, TOK.Int64, TOK.Uint32, TOK.Uint64, - TOK.Float32, TOK.Float64, TOK.Float80, - TOK.Imaginary32, TOK.Imaginary64, TOK.Imaginary80: - writef("<n>%s</n>", srcText); + case TOK.Int32, TOK.Int64, TOK.Uint32, TOK.Uint64, + TOK.Float32, TOK.Float64, TOK.Float80, + TOK.Imaginary32, TOK.Imaginary64, TOK.Imaginary80: + writef("<n>%s</n>", srcText); break; - case TOK.LParen, TOK.RParen, TOK.LBracket, - TOK.RBracket, TOK.LBrace, TOK.RBrace: - writef("<br>%s</br>", srcText); + case TOK.LParen, TOK.RParen, TOK.LBracket, + TOK.RBracket, TOK.LBrace, TOK.RBrace: + writef("<br>%s</br>", srcText); break; - case TOK.EOF: break; - default: - if (token.isKeyword()) - writef("<k>%s</k>", srcText); - else - writef("%s", srcText); + default: + if (token.isKeyword()) + writef("<k>%s</k>", srcText); + else + writef("%s", srcText); } end = token.end; }