New Lexer:
; ST - Stack Library by Banane
; http://www.autohotkey.com/forum/viewtopic.php?t=54153

;-----------------------------------------------------------------------------------------------------------------------------
;Function:    ST_Dim
;Parameters:  Stack = Specify a new variable
;Description: Declares the specified variable as a stack
;-----------------------------------------------------------------------------------------------------------------------------
ST_Dim(ByRef Stack) {
  If (ST_IsValid(Stack,1) = 1) {
    If (ST_Debug() = 1)
      MsgBox, 48, ST Error, Specified Stack is already declared.
     Return 0
  }
  Stack :="[]"
}


;-----------------------------------------------------------------------------------------------------------------------------
;Function:    ST_Undim
;Parameters:  Stack = Declared Stack
;Description: Deletes all contents from the stack variable
;-----------------------------------------------------------------------------------------------------------------------------
ST_Undim(ByRef Stack) {
  If (ST_IsValid(Stack) = 0)
    Return 0
  Stack := ""
}

;-----------------------------------------------------------------------------------------------------------------------------
;Function:    ST_Del
;Parameters:  Stack = Declared Stack
;Description: Deletes all entrys from the stack
;-----------------------------------------------------------------------------------------------------------------------------
ST_Del(ByRef Stack) {
  If (ST_IsValid(Stack) = 0)
    Return 0
  Stack := "[]"
}

;-----------------------------------------------------------------------------------------------------------------------------
;Function:    ST_Push
;Parameters:  Stack = Declared Stack
              Value = Entry's value
;Description: Adds an entry to the stack
;-----------------------------------------------------------------------------------------------------------------------------
ST_Push(ByRef Stack,Value) {
  ;Check if it's a valid stack
  If (ST_IsValid(Stack) = 0)
    Return 0
  ;Add the value
  Stack := "[" . ST_Convert(Value) . "|" . SubStr(Stack,2,StrLen(Stack) - 2) . "]"
}

;-----------------------------------------------------------------------------------------------------------------------------
;Function:    ST_Pop
;Parameters:  Stack = Declared Stack
;Description: Removes and returns the newest entrys contents
;-----------------------------------------------------------------------------------------------------------------------------
ST_Pop(ByRef Stack) {
  ;Check if it's a valid stack
  If (ST_IsValid(Stack) = 0)
    Return 0
  Else If (ST_Len(Stack) < 1)
     Return 1
  ;Get first entry
  Value := SubStr(Stack,2,InStr(Stack,"|") - 2)
  ;Remove from stack
  Stack := "[" . SubStr(Stack,InStr(Stack,"|") + 1,StrLen(Stack))
  Return ST_Convert(Value,1)
}

;-----------------------------------------------------------------------------------------------------------------------------
;Function:    ST_Peek
;Parameters:  Stack = Declared Stack
;Description: Returns the newest entrys contents without removing
;-----------------------------------------------------------------------------------------------------------------------------
ST_Peek(ByRef Stack) {
  ;Check if it's a valid stack
  If (ST_IsValid(Stack) = 0)
    Return 0
  Else If (ST_Len(Stack) < 1)
     Return 1
  ;Return first entry
  Return ST_Convert(SubStr(Stack,2,InStr(Stack,"|") - 2),1)
}

;-----------------------------------------------------------------------------------------------------------------------------
;Function:    ST_Len
;Parameters:  Stack = Declared Stack
;Description: Returns the count of entrys
;-----------------------------------------------------------------------------------------------------------------------------
ST_Len(ByRef Stack) {
  ;Check if it's a valid stack
  If (ST_IsValid(Stack) = 0)
    Return 0
  ;Check how many entrys are in it
  Loop, Parse, Stack
     If (A_LoopField = "|")
      Length ++
  ;If Stack doesn't have any entrys
  If (ST_Debug() = 1 and Length = "")
    MsgBox, 48, ST Error, Specified Stack doesn't have any entrys.
   ;Return the length
  Return Length
}

;-----------------------------------------------------------------------------------------------------------------------------
;Function:    ST_Debug
;Parameters:  OnOff = Boolean - 1 to activate, 0 to deactivate
;Description: Actiavtes error messages
;-----------------------------------------------------------------------------------------------------------------------------
ST_Debug(OnOff="") {
 static Debug

  ;Change Debug State
  Debug := (OnOff = "") ? Debug : OnOff
  ;Return Debug State
  Return Debug
}

;=============================================================================================================================
;Internal Functions
;=============================================================================================================================
ST_Convert(Value,Mode=0) {
  ;Mode 0 = Convert to Stack Format
  ;Mode 1 = Convert from Stack Format
  If (Mode = 0)
    StringReplace, Value, Value, |, <'D'>, 1 ;Replace Delimiter
   Else
    StringReplace, Value, Value, <'D'>, |, 1 ;Change to Delimiter
   Return Value
}

ST_IsValid(ByRef Stack,Dim=0) {
  If (SubStr(Stack,1,1) = "[" and SubStr(Stack,StrLen(Stack),1) = "]")
    Return 1
  If (ST_Debug() = 1 and Dim = 0)
    MsgBox, 48, ST Error, Specified Stack isn't valid.
   Return 0
}