New Lexer:
; Number System Converter by Holle
; http://www.autohotkey.com/forum/viewtopic.php?t=56135

; Some "names" for the number systems will be accepted such as decimal/dec/d/base10/dekal or
; binary/bin/digital/dual/di/b/base2
; Use can use the names/shortcuts or the "base", like "base10" for decimal or "base2" for binary. 
baseConvert(value, from, to)                        ;the function baseConvert()
{
    if !(value and from and to)                 ;if mising data...
    {
        MsgBox, 4096 , , Missing Parameter! `n`nUse: baseConvert("Value", "From", "To") `n`nExample: `nbaseConvert("55", "dec", "hex")
         Exit
    }                                                      ;else ....
    ;some names for number systems
    base2 = Base2|Binary|Bin|Digital|Binär|Dual|Di|B
    base3 = Base3|Ternary|Triple|Trial|Ternär
    base4 = Base4|Quaternary|Quater|Tetral|Quaternär
    base5 = Base5|Quinary|Pental|Quinär
    base6 = Base6|Senary|Hexal|Senär
    base7 = Base7|Septenary|Peptal|Heptal
    base8 = Base8|Octal|Oktal|Oct|Okt|O
    base9 = Base9|Nonary|Nonal|Enneal
    base10 = Base10|Decimal|Dezimal|Denär|Dekal|Dec|Dez|D
    base11 = Base11|Undenary|Monodecimal|Monodezimal|Hendekal
    base12 = Base12|Duodecimal|Dedezimal|Dodekal
    base13 = Base13|Tridecimal|Tridezimal|Triskaidekal
    base14 = Base14|Tetradecimal|Tetradezimal|Tetrakaidekal
    base15 = Base15|Pentadecimal|Pentadezimal|Pentakaidekal
    base16 = Base16|Hexadecimal|Hexadezimal|Hektakaidekal|Hex|H
    base17 = Base17|Peptaldecimal|Peptaldezimal|Heptakaidekal
    base18 = Base18|Octaldecimal|Oktaldezimal|Octakaidekal|Oktakaidekal
    base19 = Base19|Nonarydecimal|Nonaldezimal|Enneakaidekal
    base20 = Base20|Vigesimal|Eikosal
    base30 = Base30|Triakontal
    base40 = Base40|Tettarakontal
    base50 = Base50|Pentekontal
    base60 = Base60|Sexagesimal|Hektakontal
    StringReplace, value_form, value,(,,all
     StringReplace, value_form, value_form ,),, all          ;if value is integer or letter when...
    if value_form is not Alnum                                       ;...parenthesis are removed
    {                                                                           ; if not...
        MsgBox, 4096 , , Error! `n`nOnly alphanumeric Symbols will be accepted!
         Exit
    }                                                           ;------------------------------------------------------------------------------------
    if (InStr(from, "base"))                                            ;if the word "base" is in "from"...
    {
        StringTrimLeft, base_check, from, 4                   ;...then cut "base" to have ONLY the number
         if base_check is not Integer                               ;if "from" not integer now
        {
            MsgBox, 4096 , , Unknown Number System! `n`nUse Base + Number (example: Base16), `nor the name/shortcut (example: "Hexadecimal" or "Hex")
             Exit
        }
        else                                                                  ;else replace the value from "from"
             from := base_check                                       ;with the number in base_check
    }                                                           ;------------------------------------------------------------------------------------
    if (InStr(to, "base"))                                               ;the same as above again for the destination number system
    {
        StringTrimLeft, base_check, to, 4
         if base_check is not Integer
        {
            MsgBox, 4096 , , Unknown Number System! `n`nUse Base + Number (example: Base16), `nor the name/shortcut (example: "Hexadecimal" or "Hex")
             Exit
        }
        else
             to := base_check
    }                                                           ;---------------------------------------------------------------------------------
    base_loop := 1
    loop, 60                                                ;check in a loop from 2 to 60 if the names from
     {                                                          ;the source / destination number system is in the Variable "base.."
        if from is Integer                               ;if "from" is integer...
            if to is Integer                               ;and "to" too...
                Break                                       ;...cancel the loop
         if (base_loop < 20)                            ;if base_loop < 20...
            base_loop ++                                ;...increase by 1
        else                                                  ;else...
             base_loop += 10                           ;...increase by 10
        if (base_loop > 60)                            ;and if more then 60 ...
            Break                                           ;...cancel the loop
         base := base%base_loop%
        loop parse, base, |                            ;split every base variable word by word
         {
            if (from = A_LoopField)                  ;if one of them identical with the name ...
                from := base_loop                     ;...from the source number system then save the number in "from"
            if (to = A_LoopField)                      ;        ...the same for the destination number system
                to := base_loop
        }
    }
    if (from < 11)                                        ;by source numer system to 10 (therefore Decimal)
        if value is not Integer                         ;letters are not allowed
        {                                                      ;else exit
            StringGetPos, seperator_1, base%from%, |, L1 ;position of the first seperator
             StringGetPos, seperator_2, base%from%, |, L2 ;position of the second seperator...
            StringMid, name_from, base%from%, (seperator_1 + 2), (seperator_2 - seperator_1 - 1)
             MsgBox, 4096 , , Error! `nNo letters allowed in %name_from% system!
            Exit
         }
    con_letter := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;allowed letters
    result_dec=
    length := StrLen(value) ;count the characters
    counter := 0
    parenthesis := False    ;no parenthesis yet
    loop, %length%           ;loop by any character from "value"
     {
        StringMid, char, value, (length + 1 - A_Index), 1 ;process "backwards" the value, character by character
         if (char = ")")                                                   ;if there an right parenthesis ...
        {                                                                    ;      (notice, we work "backwards" at this time)
            if parenthesis                                              ;...although there was an right parenthesis before (without a left parenthesis) ...
            {                                                                ;...then exit
                MsgBox, 4096 , , Error!`nOnly "simple" parenthesis will be accepted!`n`nExample:`n57AH6(45)(48)G2 = accepted`n57AH6((45)(48))G2 = NOT accepted!
                 Exit
            }
            parenthesis := True                                     ;else memorize that we are between parenthesis now
            Continue                                                     ;...cancel the rest from the loop and continue from begin
         }
        else if (char = "(")                                            ;if there an right parenthesis ...
         {                                                                    ;      (notice, we work "backwards" at this time)
            if !parenthesis                                             ;...although there wasn´t a right parenthesis before...
            {                                                                ;...then exit
                MsgBox, 4096 , , Error!`nOnly "simple" parenthesis will be accepted!`n`nExample:`n57AH6(45)(48)G2 = accepted`n57AH6((45)(48))G2 = NOT accepted!
                 Exit
            }
            parenthesis := False                                   ;else memorize that we are NOT between parenthesis now
            if !par_char                                                ;if nothing between the parenthesis...
            {                                                               ;...then exit
                MsgBox, 4096 , , Error! `n No value between parenthesis!
                 Exit
            }
            char := par_char                                        ;else, all numbers between parenthesis are ONE character now
        }
        else if parenthesis                                          ;we are between parenthesis at this time...
         {
            if char is not Integer                                   ;...and there is some other than Integer, then cancel
            {
                MsgBox, 4096 , , Error! ´nBetween parenthesis only numbers will be accepted!
                 Exit
            }
            par_char := char . par_char                        ;else put every character between the parenthesis to ONE value
            Continue                                                    ;notice, because we work backwards in this loop, the next number will put BEFORE the previous number, ...
         }
        else if char is Alpha                                        ;if there a letter
         {
            StringGetPos, char_pos, con_letter, %char%          ;then check th position from this letter in "con_letter"
             StringReplace, char, char, %char%, %char_pos%   ;and replace the letter with the position-number
            char += 10                                                            ;and add 10
            if (char >= from)
            {                                                                           ;if the number greater than the number system...
                StringGetPos, seperator_1, base%from%, |, L1  ;...Example: 18 in hexadecimal system
                 StringGetPos, seperator_2, base%from%, |, L2  ;then exit
                StringMid, name_from, base%from%, (seperator_1 + 2), (seperator_2 - seperator_1 - 1)
                 char := from - 10
                StringMid, char, con_letter, %char%, 1
                 MsgBox, 4096 , , Error! `nOnly letters until "%char%" will be accepted in %name_from% system!
                Exit
             }
        }
        if (char >= from)   ;is the character at this position isn´t a letter, but a number which is...
        {                          ;...greater than the number system, then exit
            max_value := from - 1
            MsgBox, 4096 , , Error! `nOnly values from 0-%max_value% will be accepted in base%from% system!
             Exit
        }
        result_dec += char * (from**counter)   ;convert source number system to decimale number system
        counter ++                                        ;increase counter by one
    }
    if (to = 10)                                            ;if decimale system the destination number system
        Return %result_dec%                        ;then return the result
    result=                                                  ;else convert it to destination number system
    while (result_dec)
    {       
        char := Mod(result_dec , to)                        ; first number from destination number system
        if (char > 35)                                               ;if it greater than 35...
            char := "(" . char . ")"                               ;...put it between parenthesis
        else if (char > 9)                                          ;if it less than 36 , but greater than 9,
             StringMid, char, con_letter, (char - 9), 1    ;...replace it with a letter
        result :=  char . result                                   ;combine the characters to the result
        result_dec := Floor(result_dec / to)               ;calculate the remain to continue the converting with this
    }
    Return %result%                                             ;return result
}