Mercurial > projects > dil
diff src/dil/lexer/IdentsGenerator.d @ 806:bcb74c9b895c
Moved out files in the trunk folder to the root.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 09 Mar 2008 00:12:19 +0100 |
parents | trunk/src/dil/lexer/IdentsGenerator.d@3b34f6a95a27 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dil/lexer/IdentsGenerator.d Sun Mar 09 00:12:19 2008 +0100 @@ -0,0 +1,117 @@ +/++ + Author: Aziz Köksal + License: GPL3 ++/ +module dil.lexer.IdentsGenerator; + +struct StrPair +{ +const: + char[] str; /// Identifier string in code. + char[] idStr; /// In table. +} + +/// Table of predefined identifiers. +static const StrPair[] identPairs = [ + // Predefined version identifiers: + {"DigitalMars"}, {"X86"}, {"X86_64"}, + /*{"Windows"}, */{"Win32"}, {"Win64"}, + {"linux"}, {"LittleEndian"}, {"BigEndian"}, + {"D_Coverage"}, {"D_InlineAsm_X86"}, {"D_Version2"}, + {"none"}, {"all"}, + // Variadic parameters: + {"_arguments"}, {"_argptr"}, + // scope: + {"exit"}, {"success"}, {"failure"}, + // pragma: + {"msg"}, {"lib"}, {"startaddress"}, + // Linkage: + {"C"}, {"D"}, {"Windows"}, {"Pascal"}, {"System"}, + // Con-/Destructor: + {"__ctor"}, {"__dtor"}, + // new() and delete() methods. + {"__new"}, {"__delete"}, + // Unittest and invariant. + {"__unittest"}, {"__invariant"}, + // Operator methods: + {"opNeg"}, + {"opPos"}, + {"opComp"}, + {"opAddAssign"}, + {"opSubAssign"}, + {"opPostInc"}, + {"opPostDec"}, + {"opCall"}, + {"opCast"}, + {"opIndex"}, + {"opSlice"}, + // ASM identifiers: + {"near"}, {"far"}, {"word"}, {"dword"}, {"qword"}, + {"ptr"}, {"offset"}, {"seg"}, {"__LOCAL_SIZE"}, + {"FS"}, {"ST"}, + {"AL"}, {"AH"}, {"AX"}, {"EAX"}, + {"BL"}, {"BH"}, {"BX"}, {"EBX"}, + {"CL"}, {"CH"}, {"CX"}, {"ECX"}, + {"DL"}, {"DH"}, {"DX"}, {"EDX"}, + {"BP"}, {"EBP"}, {"SP"}, {"ESP"}, + {"DI"}, {"EDI"}, {"SI"}, {"ESI"}, + {"ES"}, {"CS"}, {"SS"}, {"DS"}, {"GS"}, + {"CR0"}, {"CR2"}, {"CR3"}, {"CR4"}, + {"DR0"}, {"DR1"}, {"DR2"}, {"DR3"}, {"DR6"}, {"DR7"}, + {"TR3"}, {"TR4"}, {"TR5"}, {"TR6"}, {"TR7"}, + {"MM0"}, {"MM1"}, {"MM2"}, {"MM3"}, + {"MM4"}, {"MM5"}, {"MM6"}, {"MM7"}, + {"XMM0"}, {"XMM1"}, {"XMM2"}, {"XMM3"}, + {"XMM4"}, {"XMM5"}, {"XMM6"}, {"XMM7"}, +]; + +/++ + CTF for generating the members of the struct Ident. + + The resulting string looks like this: + --- + private struct Ids {static const: + Identifier _str = {"str", TOK.Identifier, IDK.str}; + // more ... + } + Identifier* str = &Ids._str; + // more ... + private Identifier*[] __allIds = [ + str, + // more ... + ] + --- ++/ +char[] generateIdentMembers() +{ + char[] private_members = "private struct Ids {static const:"; + + char[] public_members = ""; + char[] array = "private Identifier*[] __allIds = ["; + foreach (pair; identPairs) + { + // N.B.: Compiler cries for some reason when trying to access pair.idStr. + // Identifier _str = {"str", TOK.Identifier, ID.str}; + private_members ~= "Identifier _"~pair.str~` = {"`~pair.str~`", TOK.Identifier, IDK.`~pair.str~"};\n"; + // Identifier* str = &_str; + public_members ~= "Identifier* "~pair.str~" = &Ids._"~pair.str~";\n"; + array ~= pair.str~","; + } + + private_members ~= "}"; // Close private { + array ~= "];"; + + return private_members ~ public_members ~ array; +} + +/// CTF for generating the members of the enum IDK. +char[] generateIDMembers() +{ + char[] members; + foreach (pair; identPairs) + members ~= pair.str ~ ",\n"; + return members; +} + +// pragma(msg, generateIdentMembers()); +// pragma(msg, generateIDMembers());