Skip to content

Instantly share code, notes, and snippets.

@lifthrasiir
Created July 22, 2012 13:47
Show Gist options
  • Select an option

  • Save lifthrasiir/3159760 to your computer and use it in GitHub Desktop.

Select an option

Save lifthrasiir/3159760 to your computer and use it in GitHub Desktop.
UserScript: a forgotten programming language from the hell (2003)
BODY, P, LI, DD, DT { font:10pt Verdana; }
P { margin-left:40pt; margin-right:20pt; }
SMALL { font-style:italic; font-size:100%; }
A { color:blue; text-decoration:underline; }
A:visited { text-decoration:none ! important; }
A:hover { color:red; text-decoration:underline; }
H1 { margin-left:0pt; margin-right:0pt; padding-left:5pt; padding-right:5pt; border-bottom:#224466 solid 4pt; color:#336699; font-family:"Verdana"; letter-spacing:2px; }
H2 { margin-left:0pt; margin-right:0pt; padding-left:5pt; padding-right:5pt; border-bottom:#662244 solid 2pt; color:#993366; font-family:"Verdana"; letter-spacing:2px; }
H3 { margin-left:15pt; margin-right:5pt; padding-left:3pt; padding-right:3pt; border-bottom:#226644 solid 1.5pt; margin-bottom:0pt; color:#339966; font-family:"Verdana"; letter-spacing:1px; }
H4 { margin-left:25pt; margin-right:5pt; margin-bottom:0pt; color:#663399; font-family:"Verdana"; }
H1 SMALL { color:#99B3CC; }
H2 SMALL { color:#CC99B3; }
H3 SMALL { color:#99CCB3; }
H4 SMALL { color:#B399CC; }
UL { margin-left:50pt; margin-right:20pt; }
OL { margin-left:50pt; margin-right:20pt; }
LI { margin-top:5pt; }
DT { font-weight:bold; }
DL { margin-left:50pt; margin-right:20pt; }
DD { margin-left:30pt; }
CODE { font-family:"Lucida Console"; color:#000080; font-weight:bold; line-height:120%; }
CODE.result { font-family:"Lucida Console"; color:#008000; font-weight:bold; }
SPAN.warning { color:red; font-weight:bold; }
Attribute VB_Name = "mdlUserScript"
'###############################################################################
'## @@ @@ @@@@ @@ +++ +++ ##
'## @@ @@ @@@@ @@@@ @@ @@ @@ @@@@ @@ @@ @@ @@@@ @@@@ ++ ++ ++ ++ ##
'## @@ @@ @@@ @@@@@@ @@@@ @@@ @@ @@@@ @@ @@ @@ @@ ++ ++ ++ ##
'## @@ @@ @@@ @@ @@ @@ @@ @@ @@ @@@@ @@ ++ ++ ++ ++ ##
'##__@@@@__@@@@___@@@@__@@____@@@@___@@@@_@@____@@_@@______@@___+++__++_+++++_##
'## UserScript, for Break the Box @@ version 0.2.3 ##
'##===========================================================================##
'## Created by Tokigun <[email protected]>, 2003/12/15 - 2003/12/22. ##
'## For more information, use usInformation() function please. :) ##
'###############################################################################
Option Explicit
'*******************************************************************************
'* Enumerations *
'*******************************************************************************
Private Enum usTokenEnum
T_UNDEFINED = 99 ' Undefined Tokens
T_NONE = 0 ' () Empty Parentheses
T_ENDLINE = -1 ' \r\n End of Statement
' Arithmetic Operators
T_PLUS = 1 ' + Addition
T_MINUS = 2 ' - Subtraction
T_TIMES = 3 ' * Multiplication
T_DIVIDE = 4 ' / Division
T_MODULOUS = 5 ' % Modulo
T_POWER = 6 ' ^ Involution
' Comparison Operators
T_EQUAL = 11 ' == Equality
T_INEQUAL = 12 ' != <> Inequality
T_GREATER = 13 ' > Greater than
T_GREATER_EQ = 14 ' >= => Equal to or Greater than
T_LESS = 15 ' < Less than
T_LESS_EQ = 16 ' <= =< Equal to or Less than
' Logical/Bitwise Operators
T_AND = 21 ' and Logical/Bitwise AND
T_OR = 22 ' or Logical/Bitwise OR
T_NOT = 23 ' not Logical/Bitwise NOT
' Unary Operators
T_POSITIVE = 24 ' + Unary Positive
T_NEGATIVE = 25 ' - Unary Negative (Complement)
T_PRE_INC = 26 ' ++ Pre-increment
T_POST_INC = 27 ' ++ Post-increment
T_PRE_DEC = 28 ' -- Pre-decrement
T_POST_DEC = 29 ' -- Post-decrement
' Comma/Assignment Operators
T_COMMA = 31 ' , Comma Operator for Function
T_ASSIGN = 32 ' = Assignment
T_PLUS_ASSIGN = 33 ' += Additive Assignment
T_MINUS_ASSIGN = 34 ' -= Subtractive Assignment
T_TIMES_ASSIGN = 35 ' *= Multiplicative Assignment
T_DIVIDE_ASSIGN = 36 ' /= Divisional Assignment
T_MODULOUS_ASSIGN = 37 ' %= Modulous Assignment
T_POWER_ASSIGN = 38 ' ^= Involutional Assignment
' Parentheses
T_LPARENT = 41 ' ( Left Parenthese
T_RPARENT = 42 ' ) Right Parenthese
T_LBRACKET = 43 ' [ Left Bracket
T_RBRACKET = 44 ' ] Right Bracket
T_LBRACE = 45 ' { Left Brace
T_RBRACE = 46 ' } Right Brace
' Special Tokens
T_FUNCTION = 51 ' abs() Function
T_NUMBER = 52 ' 123 Number
T_VARIABLE = 53 ' $TEMP Variable
T_COMMENT = 54 ' // Comment (never used)
' Statement Tokens
T_IF = 61 ' if() Conditional Statement (IF)
T_ELSE = 62 ' else Conditional Statement (ELSE)
T_DO = 63 ' do() Repetitive Statement (DO)
End Enum
Private Enum usActionEnum
VA_EXIST = 0 ' Check that this variable is.
VA_GET = 1 ' Get the value of this variable.
VA_LET = 2 ' Let the value of this variable given value.
End Enum
Public Enum usInformationEnum
usISignal = 0 ' Module S/N
usIProgramName = 1 ' Program Name
usIProgramVersion = 2 ' Program Version
usIProgramBuild = 3 ' Program Build Number
usIAuthor = 4 ' Author
usIAuthorMail = 5 ' Author's E-Mail
usIAuthorSite = 6 ' Author's Website
usICopyright = 7 ' Copyright
usIDateTime = 8 ' Last Update
usIWebSite = 9 ' Program's Website
usIRCSID = 10 ' RCS ID (undefined!)
End Enum
Public Enum usErrorEnum
usESuccess = 0 ' Successfully Done.
' Syntax Error
usEUnknownCharacter = 1 ' There is unknown character. (ex. #)
usENonNested = 2 ' Parentheses aren't well-nested.
usENoOperand = 3 ' There is no operand for more than one operators.
usEOpenedComment = 4 ' Long comment (/*...*/) isn't closed.
usEOpenedStatement = 5 ' There is no statement seperator (;).
usEInvalidSyntax = 6 ' There is invalid syntax.
usEUnknownBlock = 7 ' Block is not closed.
' Functions/Variables
usEUndefinedFunction = 11 ' This function is not.
usEWrongArgumentCount = 12 ' This function doesn't accept the number of arguments.
usEUndefinedVariable = 13 ' This variable is not.
usEReadOnlyVariable = 14 ' Can't write the variable in this variable.
usECantAssignToVariable = 15 ' This variable doesn't accept given value.
' Runtime Error
usEDivideByZero = 21 ' Script divided by zero.
usEZerothPowerOfZero = 22 ' Zeroth power of zero is undefined.
usEAssignToNonVariable = 23 ' Non-variable expression isn't assigned.
usEOverflow = 24 ' Number is too great.
usETimeout = 25 ' Script takes too long time.
' Special Error
usEEmpty = -1 ' This script contains no statement.
usEExitBlock = 100 ' Closest block is exited by this statement: exit()
usETerminateScript = 101 ' Script is terminated by this statement: end()
usEMatrixError = 102 ' Script can't accept this matrix: _error()
usEUndefined = 999 ' Undefined Error.
End Enum
'*******************************************************************************
'* UserScript-related Types *
'*******************************************************************************
Private Type usVariableType
Name As String
Value As Long
End Type
Private Type usBlockType
blockType As usTokenEnum
startPos As Integer
Counter As Long
limitCounter As Long
End Type
Private Type usTokenType
Token As usTokenEnum
Value As Variant
End Type
'*******************************************************************************
'* Constants *
'*******************************************************************************
Private Const spaceCharacters As String = " " & vbTab & vbCrLf
Private Const maximumLines As Long = 50000
'*******************************************************************************
'* Information Functions *
'*******************************************************************************
Public Function usInformation( _
ByVal WhatDoYouWant As usInformationEnum _
) As Variant
Const verMajor As Integer = 0
Const verMinor As Integer = 2
Const verAddition As Integer = 3
Const verBuild As Integer = 98
Const verTag As String = "-BTB"
Const lastUpdate As Date = 37977.4718634259
Select Case WhatDoYouWant
Case usISignal
usInformation = "TOK14000108-" & Format(verMajor * 10000 + verMinor * 100 + verAddition, "00000")
Case usIProgramName
usInformation = "UserScript"
Case usIProgramVersion
usInformation = "version " & verMajor & "." & verMinor & "." & verAddition & verTag
Case usIProgramBuild
usInformation = "Build " & verBuild
Case usIAuthor
usInformation = "Tokigun"
Case usIAuthorMail
usInformation = "[email protected]"
Case usIAuthorSite
usInformation = "http://tokigun.net/"
Case usICopyright
usInformation = "Copyright (c) 2003, Tokigun. All rights reserved."
Case usIDateTime
usInformation = lastUpdate
Case usIWebSite
usInformation = "http://creation.tokigun.net/vb/userscript/"
Case usIRCSID
usInformation = _
"$Id: $" 'now undefined
Case Else
usInformation = Null
End Select
End Function
'*******************************************************************************
'* Utility Functions *
'*******************************************************************************
Private Function usIsSymbol( _
ByVal char As String, Optional ByVal isFirstChar As Boolean = False _
) As Boolean
If char = "" Then char = Chr(0)
usIsSymbol = ( _
((Asc(char) Or 32) > 96 And (Asc(char) Or 32) < 123) Or _
(Not isFirstChar And char >= "0" And char <= "9") Or _
char = "_" _
)
End Function
Private Function usIsNumeric( _
ByVal char As String _
) As Boolean
If char = "" Then char = Chr(0)
usIsNumeric = (char >= "0" And char <= "9")
End Function
Private Function usTrim( _
ByVal src As String _
) As String
Do While InStr(spaceCharacters, Left(src, 1)) > 0 And src <> ""
src = Mid(src, 2)
Loop
Do While InStr(spaceCharacters, Right(src, 1)) > 0 And src <> ""
src = Left(src, Len(src) - 1)
Loop
usTrim = src
End Function
Private Function usOperatorPrecedence( _
ByVal Token As usTokenEnum _
) As Integer
Select Case Token
Case T_PRE_INC, T_PRE_DEC, T_POST_INC, T_POST_DEC
usOperatorPrecedence = 1
Case T_POSITIVE, T_NEGATIVE, T_NOT
usOperatorPrecedence = 2
Case T_POWER
usOperatorPrecedence = 3
Case T_MODULOUS
usOperatorPrecedence = 4
Case T_TIMES, T_DIVIDE
usOperatorPrecedence = 5
Case T_PLUS, T_MINUS
usOperatorPrecedence = 6
Case T_GREATER, T_GREATER_EQ, T_LESS, T_LESS_EQ
usOperatorPrecedence = 7
Case T_EQUAL, T_INEQUAL
usOperatorPrecedence = 8
Case T_AND
usOperatorPrecedence = 9
Case T_OR
usOperatorPrecedence = 10
Case T_ASSIGN, T_PLUS_ASSIGN, T_MINUS_ASSIGN, T_TIMES_ASSIGN, T_DIVIDE_ASSIGN, _
T_MODULOUS_ASSIGN, T_POWER_ASSIGN
usOperatorPrecedence = 11
Case T_COMMA
usOperatorPrecedence = 12
Case T_LPARENT
usOperatorPrecedence = 100
Case T_FUNCTION
usOperatorPrecedence = 101
Case T_LBRACKET
usOperatorPrecedence = 0
Case Else
usOperatorPrecedence = -1
End Select
End Function
Private Function usIsEvaluatedToRight( _
ByVal Token As usTokenEnum _
) As Integer
Select Case Token
Case T_POSITIVE, T_NEGATIVE, T_NOT, T_ASSIGN, T_PLUS_ASSIGN, T_MINUS_ASSIGN, _
T_TIMES_ASSIGN, T_DIVIDE_ASSIGN, T_MODULOUS_ASSIGN, T_POWER_ASSIGN
usIsEvaluatedToRight = False
Case Else
usIsEvaluatedToRight = True
End Select
End Function
Private Function usIsUnaryOperator( _
ByVal Token As usTokenEnum _
) As Integer
Select Case Token
Case T_POSITIVE, T_NEGATIVE, T_NOT, T_FUNCTION, T_PRE_INC, T_PRE_DEC, _
T_POST_INC, T_POST_DEC
usIsUnaryOperator = True
Case Else
usIsUnaryOperator = False
End Select
End Function
Private Sub usPushNode( _
ByRef Node() As usTokenType, ByRef lNode As Integer, _
ByVal Token As usTokenEnum, ByVal Value As Variant _
)
ReDim Preserve Node(0 To lNode) As usTokenType
Node(lNode).Token = Token
Node(lNode).Value = Value
lNode = lNode + 1
End Sub
Private Function usPopNode( _
ByRef Node() As usTokenType, ByRef lNode As Integer, _
ByRef Token As usTokenEnum, ByRef Value As Variant _
) As Boolean
If lNode = 0 Then
usPopNode = False
Else
usPopNode = True
lNode = lNode - 1
Token = Node(lNode).Token
Value = Node(lNode).Value
If lNode > 0 Then
ReDim Preserve Node(0 To lNode) As usTokenType
End If
End If
End Function
Private Function usMatchingBlock( _
ByRef Tokens() As usTokenType, ByVal pos As Integer, _
Optional ByVal DestDepth As Integer = 0 _
) As Integer
Dim blockDepth As Integer, i As Integer
blockDepth = 0
If Tokens(pos).Token = T_LBRACE Then
For i = pos To UBound(Tokens)
If Tokens(i).Token = T_LBRACE Then
blockDepth = blockDepth + 1
ElseIf Tokens(i).Token = T_RBRACE Then
blockDepth = blockDepth - 1
End If
If blockDepth = DestDepth Then
usMatchingBlock = i
Exit Function
End If
Next
ElseIf Tokens(pos).Token = T_RBRACE Then
For i = pos To 0 Step -1
If Tokens(i).Token = T_RBRACE Then
blockDepth = blockDepth + 1
ElseIf Tokens(i).Token = T_LBRACE Then
blockDepth = blockDepth - 1
End If
If blockDepth = DestDepth Then
usMatchingBlock = i
Exit Function
End If
Next
End If
usMatchingBlock = -1
End Function
'*******************************************************************************
'* Tokenize Functions *
'*******************************************************************************
Private Function usTokenizeStatement( _
ByVal Expression As String, ByRef Result() As usTokenType _
) As usErrorEnum
Dim Stack() As usTokenType, lStack As Integer, lResult As Integer
Dim pos As Integer, prevOperator As Boolean, lastParenthese As Boolean
Dim tok As usTokenEnum, vtok As Variant, ptok As usTokenEnum, pvtok As Variant
Dim symbol As String, char As String
lStack = 0
lResult = 0
pos = 1
prevOperator = True
lastParenthese = False
Do While pos <= Len(Expression)
char = Mid(Expression, pos, 1)
If char = "(" Then
usPushNode Stack, lStack, T_LPARENT, 0
prevOperator = True
lastParenthese = True
pos = pos + 1
ElseIf char = ")" Or char = "]" Then
Do
If Not usPopNode(Stack, lStack, tok, vtok) Then
usTokenizeStatement = usENonNested
Exit Function
End If
If tok = T_LPARENT Or (char = ")" And tok = T_FUNCTION) Then Exit Do
usPushNode Result, lResult, tok, vtok
Loop
If lastParenthese Then
usPushNode Result, lResult, T_NONE, 0
End If
If tok = T_FUNCTION Then
usPushNode Result, lResult, tok, vtok
End If
prevOperator = False
lastParenthese = False
pos = pos + 1
ElseIf InStr("+-*/%^!<>=,", char) > 0 Then
tok = T_UNDEFINED
Select Case Mid(Expression, pos, 2)
Case "<=", "=<": tok = T_LESS_EQ
Case "=>", ">=": tok = T_GREATER_EQ
Case "==": tok = T_EQUAL
Case "!=", "<>", "><": tok = T_INEQUAL
Case "+=": tok = T_PLUS_ASSIGN
Case "-=": tok = T_MINUS_ASSIGN
Case "*=": tok = T_TIMES_ASSIGN
Case "/=": tok = T_DIVIDE_ASSIGN
Case "%=": tok = T_MODULOUS_ASSIGN
Case "^=": tok = T_POWER_ASSIGN
Case "++": tok = IIf(prevOperator, T_PRE_INC, T_POST_INC)
Case "--": tok = IIf(prevOperator, T_PRE_DEC, T_POST_DEC)
End Select
If tok = T_UNDEFINED Then
Select Case char
Case "+": tok = IIf(prevOperator, T_POSITIVE, T_PLUS)
Case "-": tok = IIf(prevOperator, T_NEGATIVE, T_MINUS)
Case "*": tok = T_TIMES
Case "/": tok = T_DIVIDE
Case "%": tok = T_MODULOUS
Case "^": tok = T_POWER
Case "<": tok = T_LESS
Case ">": tok = T_GREATER
Case "=": tok = T_ASSIGN
Case ",": tok = T_COMMA
Case Else
usTokenizeStatement = usEUnknownCharacter
Exit Function
End Select
pos = pos + 1
Else
pos = pos + 2
End If
Do
If Not usPopNode(Stack, lStack, ptok, pvtok) Then Exit Do
If _
usOperatorPrecedence(ptok) > usOperatorPrecedence(tok) Or _
(usOperatorPrecedence(ptok) = usOperatorPrecedence(tok) And _
Not usIsEvaluatedToRight(tok)) _
Then
usPushNode Stack, lStack, ptok, pvtok
Exit Do
End If
usPushNode Result, lResult, ptok, pvtok
Loop
usPushNode Stack, lStack, tok, 0
prevOperator = True
lastParenthese = False
ElseIf char = "$" Then
symbol = ""
Do
pos = pos + 1
char = Mid(Expression, pos, 1)
If Not usIsSymbol(char, symbol = "") Then Exit Do
symbol = symbol & char
Loop
Do While InStr(spaceCharacters, char) > 0 And char <> ""
pos = pos + 1
char = Mid(Expression, pos, 1)
Loop
If char = "[" Then
usPushNode Stack, lStack, T_LBRACKET, 0
usPushNode Stack, lStack, T_LPARENT, 0
usPushNode Result, lResult, T_VARIABLE, symbol
lastParenthese = True
pos = pos + 1
Else
usPushNode Result, lResult, T_VARIABLE, symbol
lastParenthese = False
End If
prevOperator = False
ElseIf usIsNumeric(char) Then
symbol = char
Do
pos = pos + 1
char = Mid(Expression, pos, 1)
If Not usIsNumeric(char) Then Exit Do
symbol = symbol & char
Loop
usPushNode Result, lResult, T_NUMBER, symbol
prevOperator = False
lastParenthese = False
ElseIf usIsSymbol(char, True) Then
symbol = char
Do
pos = pos + 1
char = Mid(Expression, pos, 1)
If Not usIsSymbol(char, False) Then Exit Do
symbol = symbol & char
Loop
tok = T_UNDEFINED
Select Case UCase(symbol)
Case "NOT": tok = T_NOT
Case "AND": tok = T_AND
Case "OR": tok = T_OR
Case "MOD": tok = T_MODULOUS
End Select
If tok = T_UNDEFINED Then
Do While InStr(spaceCharacters, char) > 0 And char <> ""
pos = pos + 1
char = Mid(Expression, pos, 1)
Loop
If char = "(" Then
usPushNode Stack, lStack, T_FUNCTION, symbol
lastParenthese = True
prevOperator = True
pos = pos + 1
Else
usPushNode Stack, lStack, T_UNDEFINED, symbol
lastParenthese = False
prevOperator = False
End If
Else
Do
If Not usPopNode(Stack, lStack, ptok, pvtok) Then Exit Do
If _
usOperatorPrecedence(ptok) > usOperatorPrecedence(tok) Or _
(usOperatorPrecedence(ptok) = usOperatorPrecedence(tok) And _
Not usIsEvaluatedToRight(tok)) _
Then
usPushNode Stack, lStack, ptok, pvtok
Exit Do
End If
usPushNode Result, lResult, ptok, pvtok
Loop
usPushNode Stack, lStack, tok, 0
lastParenthese = False
prevOperator = False
End If
ElseIf InStr(spaceCharacters, char) > 0 Then
pos = pos + 1
Else
usTokenizeStatement = usEUnknownCharacter
Exit Function
End If
Loop
Do While usPopNode(Stack, lStack, tok, vtok)
usPushNode Result, lResult, tok, vtok
Loop
If lResult = 0 Then
ReDim Preserve Result(0 To 0) As usTokenType
Result(0).Token = T_NONE: Result(0).Value = 0
usTokenizeStatement = usEEmpty
Else
usTokenizeStatement = usESuccess
End If
End Function
Private Function usTokenizeScript( _
ByVal Code As String, ByRef Result() As usTokenType _
) As usErrorEnum
Dim ScriptPos As Integer, ScriptLine() As String, ScriptLength As Integer, inComment As Integer
Dim CurrentLine As String, char As String, pchar As String, iError As usErrorEnum
Dim pResult() As usTokenType, lResult As Integer, lastToken As usTokenEnum, PrevSpecialToken As usTokenEnum
Dim vTemp As String, blockDepth As Integer, vIDepth As Integer, vIPos As Integer
Dim i As Integer, j As Integer
ScriptLength = 0
ScriptPos = 0
inComment = 0
CurrentLine = ""
char = ""
Do While ScriptPos <= Len(Code)
ScriptPos = ScriptPos + 1
pchar = char
char = Mid(Code, ScriptPos, 1)
If inComment = 1 Then
If char = vbCr Or char = vbLf Then inComment = 0
ElseIf inComment = 2 Then
If pchar & char = "*/" Then inComment = 0
ElseIf pchar & char = "//" Then
CurrentLine = Left(CurrentLine, Len(CurrentLine) - 1)
inComment = 1
ElseIf pchar & char = "/*" Then
CurrentLine = Left(CurrentLine, Len(CurrentLine) - 1)
inComment = 2
ElseIf char = ";" Then
ReDim Preserve ScriptLine(0 To ScriptLength) As String
ScriptLine(ScriptLength) = CurrentLine
ScriptLength = ScriptLength + 1
CurrentLine = ""
ElseIf char = "{" Or char = "}" Then
ReDim Preserve ScriptLine(0 To ScriptLength + 1) As String
ScriptLine(ScriptLength) = CurrentLine
ScriptLine(ScriptLength + 1) = char
ScriptLength = ScriptLength + 2
CurrentLine = ""
Else
CurrentLine = CurrentLine & char
End If
Loop
ReDim Preserve ScriptLine(0 To ScriptLength + 1) As String
ScriptLine(ScriptLength) = CurrentLine
ScriptLength = ScriptLength + 1
lResult = 0
blockDepth = 0
lastToken = T_UNDEFINED
For i = 0 To ScriptLength - 2
lastToken = T_UNDEFINED
ScriptLine(i) = usTrim(ScriptLine(i))
If ScriptLine(i) = "{" Or ScriptLine(i) = "}" Then
If ScriptLine(i) = "{" And PrevSpecialToken = T_UNDEFINED Then
usTokenizeScript = usEUnknownBlock
Exit Function
ElseIf ScriptLine(i) = "}" And blockDepth <= 0 Then
usTokenizeScript = usENonNested
Exit Function
End If
ReDim Preserve Result(0 To lResult + 1) As usTokenType
Result(lResult).Value = 0
Result(lResult).Token = IIf(ScriptLine(i) = "{", T_LBRACE, T_RBRACE)
Result(lResult + 1).Value = 0
Result(lResult + 1).Token = T_ENDLINE
lResult = lResult + 2
lastToken = T_UNDEFINED
blockDepth = blockDepth + IIf(ScriptLine(i) = "{", 1, -1)
ElseIf lastToken <> T_UNDEFINED Then
usTokenizeScript = usEInvalidSyntax
Exit Function
Else
vTemp = usTrim(Mid(ScriptLine(i), 3))
If Left(vTemp, 1) = "(" Then
Select Case UCase(Left(ScriptLine(i), 2))
Case "DO": lastToken = T_DO
Case "IF": lastToken = T_IF
End Select
If lastToken <> T_UNDEFINED Then ScriptLine(i) = vTemp
ElseIf UCase(ScriptLine(i)) = "DO" Then
lastToken = T_DO
ScriptLine(i) = ""
End If
vTemp = usTrim(Mid(ScriptLine(i), 5))
If vTemp = "" And UCase(ScriptLine(i)) = "ELSE" Then
lastToken = T_ELSE
ScriptLine(i) = ""
End If
If lastToken <> T_UNDEFINED And ScriptLine(i) <> "" Then
vIDepth = 0
For vIPos = 1 To Len(ScriptLine(i))
Select Case Mid(ScriptLine(i), vIPos, 1)
Case "(", "[": vIDepth = vIDepth + 1
Case ")", "]": vIDepth = vIDepth - 1
End Select
If vIDepth = 0 Then Exit For
Next
If vIPos <> Len(ScriptLine(i)) Or Mid(ScriptLine(i), vIPos, 1) <> ")" Then
usTokenizeScript = usENonNested
Exit Function
End If
End If
iError = usTokenizeStatement(ScriptLine(i), pResult)
If iError = usESuccess Then
vTemp = UBound(pResult) + IIf(lastToken = T_UNDEFINED, 1, 2)
ReDim Preserve Result(0 To lResult + vTemp) As usTokenType
For j = 0 To UBound(pResult)
Result(lResult + j) = pResult(j)
Next
If lastToken <> T_UNDEFINED Then
Result(lResult + vTemp - 1).Token = lastToken
Result(lResult + vTemp - 1).Value = 0
End If
Result(lResult + vTemp).Token = T_ENDLINE
Result(lResult + vTemp).Value = 0
lResult = lResult + vTemp + 1
ElseIf iError = usEEmpty Then
vTemp = IIf(lastToken = T_UNDEFINED, 0, IIf(lastToken = T_ELSE, 1, 2))
ReDim Preserve Result(0 To lResult + vTemp) As usTokenType
If vTemp = 2 Then
Result(lResult).Token = T_NONE
Result(lResult).Value = 0
End If
If vTemp > 0 Then
Result(lResult + vTemp - 1).Token = lastToken
Result(lResult + vTemp - 1).Value = 0
End If
Result(lResult + vTemp).Token = T_ENDLINE
Result(lResult + vTemp).Value = 0
lResult = lResult + vTemp + 1
Else
usTokenizeScript = iError
Exit Function
End If
PrevSpecialToken = lastToken
End If
Next
If lResult = 0 Then
usTokenizeScript = usEEmpty
ElseIf usTrim(ScriptLine(ScriptLength - 1)) = "" Then
usTokenizeScript = usESuccess
Else
usTokenizeScript = usEOpenedStatement
End If
End Function
'*******************************************************************************
'* Function/Variable Callback & Processing Functions *
'*******************************************************************************
Private Function usCallbackFunction( _
ByVal Name As String, ByRef param() As usTokenType, _
ByRef ReturnValue As Long, ByRef Matrix As Variant, ByRef Variables() As usVariableType _
) As usErrorEnum
Dim nArg As Integer, vTemp As Long, vTemp2 As Long, i As Integer
Name = UCase(Name)
nArg = UBound(param)
For i = 1 To nArg
If param(i).Token = T_VARIABLE Then
param(i).Token = T_NUMBER
usCallbackVariable param(i).Value, VA_GET, vTemp, Matrix, Variables
param(i).Value = vTemp
End If
Next
Select Case Name
Case "START"
Select Case nArg
Case 0
usCallbackVariable "_ROW", VA_LET, 0, Matrix, Variables
usCallbackVariable "_COLUMN", VA_LET, 0, Matrix, Variables
Case 2
If _
usCallbackVariable("_ROW", VA_LET, CLng(param(1).Value), Matrix, Variables) Or _
usCallbackVariable("_COLUMN", VA_LET, CLng(param(2).Value), Matrix, Variables) _
Then
usCallbackFunction = usECantAssignToVariable
Exit Function
End If
Case Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End Select
ReturnValue = 0
Case "GO_RIGHT", "GO_LEFT"
usCallbackVariable "_COLUMN", VA_GET, vTemp, Matrix, Variables
If nArg = 0 Or nArg = 1 Then
If nArg = 0 Then vTemp2 = 1 Else vTemp2 = param(1).Value
vTemp = vTemp + IIf(Name = "GO_LEFT", -1, 1) * vTemp2
If usCallbackVariable("_COLUMN", VA_LET, vTemp, Matrix, Variables) Then
usCallbackFunction = usEExitBlock
ReturnValue = 1
Exit Function
End If
Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End If
ReturnValue = 0
Case "GO_UP", "GO_DOWN"
usCallbackVariable "_ROW", VA_GET, vTemp, Matrix, Variables
If nArg = 0 Or nArg = 1 Then
If nArg = 0 Then vTemp2 = 1 Else vTemp2 = param(1).Value
vTemp = vTemp + IIf(Name = "GO_UP", -1, 1) * vTemp2
If usCallbackVariable("_ROW", VA_LET, vTemp, Matrix, Variables) Then
usCallbackFunction = usEExitBlock
ReturnValue = 1
Exit Function
End If
Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End If
ReturnValue = 0
Case "END"
usCallbackFunction = IIf(nArg = 0, usETerminateScript, usEWrongArgumentCount)
ReturnValue = 0
Exit Function
Case "EXIT"
usCallbackFunction = IIf(nArg = 0 Or nArg = 1, usEExitBlock, usEWrongArgumentCount)
If nArg = 0 Then ReturnValue = 1 Else ReturnValue = param(1).Value
Exit Function
Case "_ERROR"
usCallbackFunction = IIf(nArg = 0, usEMatrixError, usEWrongArgumentCount)
ReturnValue = 0
Exit Function
Case "ADD", "SUB", "MUL", "DIV", "MOD"
usCallbackVariable "RESULT", VA_GET, vTemp, Matrix, Variables
usCallbackVariable "CURRENT", VA_GET, vTemp2, Matrix, Variables
If nArg = 0 Then
Select Case Name
Case "ADD": vTemp = vTemp + vTemp2
Case "SUB": vTemp = vTemp - vTemp2
Case "MUL": vTemp = vTemp * vTemp2
Case "DIV", "MOD"
If vTemp2 = 0 Then
usCallbackFunction = usEDivideByZero
Exit Function
ElseIf Name = "DIV" Then
vTemp = vTemp \ vTemp2
Else
vTemp = vTemp Mod vTemp2
End If
End Select
If usCallbackVariable("RESULT", VA_LET, vTemp, Matrix, Variables) Then
usCallbackFunction = usECantAssignToVariable
Exit Function
End If
Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End If
ReturnValue = 0
Case "_ADD", "_SUB", "_MUL", "_DIV", "_MOD"
usCallbackVariable "RESULT", VA_GET, vTemp, Matrix, Variables
If nArg = 1 Then
Select Case Name
Case "_ADD": vTemp = vTemp + param(1).Value
Case "_SUB": vTemp = vTemp - param(1).Value
Case "_MUL": vTemp = vTemp * param(1).Value
Case "_DIV", "_MOD"
If param(1).Value = 0 Then
usCallbackFunction = usEDivideByZero
Exit Function
ElseIf Name = "_DIV" Then
vTemp = vTemp \ param(1).Value
Else
vTemp = vTemp Mod param(1).Value
End If
End Select
If usCallbackVariable("RESULT", VA_LET, vTemp, Matrix, Variables) Then
usCallbackFunction = usECantAssignToVariable
Exit Function
End If
Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End If
ReturnValue = 0
Case "ABS"
If nArg = 1 Then
ReturnValue = Abs(param(1).Value)
Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End If
Case "SIGN"
If nArg = 1 Then
ReturnValue = Sgn(param(1).Value)
Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End If
Case "_RANDOM"
If nArg = 0 Then
Randomize Timer
ElseIf nArg = 1 Then
Randomize param(1).Value
Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End If
ReturnValue = 0
Case "RANDOM"
If nArg = 1 Then
ReturnValue = Int(Rnd * param(1).Value)
Else
usCallbackFunction = usEWrongArgumentCount
Exit Function
End If
Case Else
usCallbackFunction = usEUndefinedFunction
Exit Function
End Select
usCallbackFunction = usESuccess
End Function
Private Function usCallbackVariable( _
ByVal Name As String, ByVal Action As usActionEnum, _
ByRef Value As Long, ByRef Matrix As Variant, ByRef Variables() As usVariableType _
) As usErrorEnum
Dim i As Integer, vNum As Integer, vTemp As Long
Dim sRow As Long, sColumn As Long, sCurrent As Long, sPrevious As Long
Name = UCase(Name)
vNum = -1
For i = 0 To UBound(Variables)
If UCase(Variables(i).Name) = Name Then
vNum = i
Exit For
End If
Next
If vNum < 0 Then
usCallbackVariable = usEUndefinedVariable
Exit Function
ElseIf Action = VA_EXIST Then
Value = vNum
usCallbackVariable = usESuccess
Exit Function
ElseIf Action = VA_GET Then
Value = Variables(vNum).Value
usCallbackVariable = usESuccess
Exit Function
End If
Select Case Name
Case "CURRENT", "PREVIOUS", "_ROWS", "_COLUMNS", "TEMP"
usCallbackVariable = usEReadOnlyVariable
Exit Function
Case "_ROW"
usCallbackVariable "_ROWS", VA_GET, vTemp, Matrix, Variables
If Value < 0 Or Value >= vTemp Then
usCallbackVariable = usECantAssignToVariable
Exit Function
End If
Case "_COLUMN"
usCallbackVariable "_COLUMNS", VA_GET, vTemp, Matrix, Variables
If Value < 0 Or Value >= vTemp Then
usCallbackVariable = usECantAssignToVariable
Exit Function
End If
End Select
Variables(vNum).Value = Value
Select Case Name
Case "_ROW", "_COLUMN"
If Name = "_ROW" Then
sRow = vNum
usCallbackVariable "_COLUMN", VA_EXIST, sColumn, Matrix, Variables
Else
sColumn = vNum
usCallbackVariable "_ROW", VA_EXIST, sRow, Matrix, Variables
End If
usCallbackVariable "CURRENT", VA_EXIST, sCurrent, Matrix, Variables
usCallbackVariable "PREVIOUS", VA_EXIST, sPrevious, Matrix, Variables
Variables(sPrevious).Value = Variables(sCurrent).Value
Variables(sCurrent).Value = Matrix(Variables(sColumn).Value, Variables(sRow).Value)
End Select
usCallbackVariable = usESuccess
End Function
Private Sub usInitializeVariables( _
ByRef Variables() As usVariableType, _
ByRef Matrix As Variant _
)
ReDim Variables(0 To 17) As usVariableType
Dim i As Integer
With Variables(0): .Name = "RESULT": .Value = 0: End With
With Variables(1): .Name = "CURRENT": .Value = Matrix(0, 0): End With
With Variables(2): .Name = "PREVIOUS": .Value = 0: End With
With Variables(3): .Name = "_ROW": .Value = 0: End With
With Variables(4): .Name = "_COLUMN": .Value = 0: End With
With Variables(5): .Name = "_ROWS": .Value = UBound(Matrix, 2) + 1: End With
With Variables(6): .Name = "_COLUMNS": .Value = UBound(Matrix, 1) + 1: End With
With Variables(7): .Name = "TEMP": .Value = 0: End With 'no used!
For i = 0 To 9
With Variables(8 + i): .Name = "TEMP" & Chr(0) & i: .Value = 0: End With
Next
End Sub
Private Sub usInitializeFunctions( _
ByRef Variables() As usVariableType, _
ByRef Matrix As Variant _
)
Dim param(0 To 0) As usTokenType
Dim ReturnValue As Long
param(0).Token = T_FUNCTION
param(0).Value = "START"
usCallbackFunction "START", param, ReturnValue, Matrix, Variables
param(0).Value = "_RANDOM"
usCallbackFunction "_RANDOM", param, ReturnValue, Matrix, Variables
End Sub
'*******************************************************************************
'* Evaluate Function *
'*******************************************************************************
Private Function usEvaluateStatement( _
ByRef Tokens() As usTokenType, ByVal evStart As Integer, ByVal evDone As Integer, _
ByRef Value As Long, ByRef Matrix As Variant, ByRef Variables() As usVariableType _
) As usErrorEnum
On Error GoTo errorCatch
Dim Stack() As usTokenType, lStack As Integer, pStack As Long
Dim stok As usTokenEnum, svtok As Variant, vTemp As usErrorEnum, vTemp2 As Long
Dim tok As usTokenEnum, vtok As Variant, ptok As usTokenEnum, pvtok As Variant
Dim pValue As Long, pName As String, ppValue As Long, ppName As String
Dim i As Integer
If evStart > evDone Then
usEvaluateStatement = usEEmpty
Exit Function
End If
lStack = 0
For i = evStart To evDone
If _
Tokens(i).Token = T_NUMBER Or _
Tokens(i).Token = T_VARIABLE Or _
Tokens(i).Token = T_NONE _
Then
usPushNode Stack, lStack, Tokens(i).Token, Tokens(i).Value
Else
If Not usPopNode(Stack, lStack, tok, vtok) Then
usEvaluateStatement = usENoOperand
Exit Function
End If
If tok = T_NUMBER Or tok = T_VARIABLE Or tok = T_NONE Then
If tok = T_VARIABLE Then
vTemp = usCallbackVariable(CStr(vtok), VA_GET, pValue, Matrix, Variables)
If vTemp <> usESuccess Then
usEvaluateStatement = vTemp
Exit Function
Else
pName = vtok
End If
ElseIf tok = T_NONE Then
If Tokens(i).Token <> T_FUNCTION Then
usEvaluateStatement = usENoOperand
Exit Function
End If
Else
pValue = vtok
pName = ""
End If
Select Case Tokens(i).Token
Case T_NOT: pStack = Not pValue
Case T_POSITIVE: pStack = pValue
Case T_NEGATIVE: pStack = -pValue
Case T_FUNCTION
Dim param() As usTokenType, lParam As Integer
ReDim param(0 To 0) As usTokenType
param(0).Token = Tokens(i).Token
param(0).Value = Tokens(i).Value
lParam = 1
If tok <> T_NONE Then
usPushNode Stack, lStack, tok, vtok
Do
If Not usPopNode(Stack, lStack, stok, svtok) Then
usEvaluateStatement = usENoOperand
Exit Function
ElseIf stok <> T_COMMA Then
usPushNode param, lParam, stok, svtok
Exit Do
End If
If Not usPopNode(Stack, lStack, stok, svtok) Then
usEvaluateStatement = usENoOperand
Exit Function
End If
usPushNode param, lParam, stok, svtok
Loop
End If
vTemp = usCallbackFunction(param(0).Value, param, pStack, Matrix, Variables)
If vTemp = usEExitBlock Then
usEvaluateStatement = vTemp
Value = pStack
Exit Function
ElseIf vTemp <> usESuccess Then
usEvaluateStatement = vTemp
Exit Function
End If
Case T_PRE_INC, T_POST_INC, T_PRE_DEC, T_POST_DEC
If pName = "" Then
usEvaluateStatement = usEAssignToNonVariable
Exit Function
End If
vTemp = usCallbackVariable(pName, VA_GET, vTemp2, Matrix, Variables)
If vTemp <> usESuccess Then
usEvaluateStatement = vTemp
Exit Function
End If
tok = Tokens(i).Token
If tok = T_POST_INC Or tok = T_POST_DEC Then pStack = vTemp2
vTemp2 = vTemp2 + IIf(tok = T_PRE_INC Or tok = T_POST_INC, 1, -1)
If tok = T_PRE_INC Or tok = T_PRE_DEC Then pStack = vTemp2
vTemp = usCallbackVariable(pName, VA_LET, vTemp2, Matrix, Variables)
If vTemp <> usESuccess Then
usEvaluateStatement = vTemp
Exit Function
End If
End Select
If Not usIsUnaryOperator(Tokens(i).Token) Then
If Not usPopNode(Stack, lStack, ptok, pvtok) Then
usEvaluateStatement = usENoOperand
Exit Function
End If
If ptok = T_NUMBER Or ptok = T_VARIABLE Then
If ptok = T_VARIABLE Then
vTemp = usCallbackVariable(CStr(pvtok), VA_GET, ppValue, Matrix, Variables)
If vTemp <> usESuccess Then
usEvaluateStatement = vTemp
Exit Function
Else
ppName = pvtok
End If
Else
ppValue = pvtok
ppName = ""
End If
Select Case Tokens(i).Token
Case T_PLUS: pStack = ppValue + pValue
Case T_MINUS: pStack = ppValue - pValue
Case T_TIMES: pStack = ppValue * pValue
Case T_DIVIDE, T_MODULOUS
If pValue = 0 Then
usEvaluateStatement = usEDivideByZero
Exit Function
ElseIf Tokens(i).Token = T_DIVIDE Then
pStack = ppValue / pValue
Else
pStack = ppValue Mod pValue
End If
Case T_POWER
If ppValue = 0 And pValue = 0 Then
usEvaluateStatement = usEZerothPowerOfZero
Exit Function
Else
pStack = ppValue ^ pValue
End If
Case T_EQUAL: pStack = (ppValue = pValue)
Case T_INEQUAL: pStack = (ppValue <> pValue)
Case T_LESS: pStack = (ppValue < pValue)
Case T_LESS_EQ: pStack = (ppValue <= pValue)
Case T_GREATER: pStack = (ppValue > pValue)
Case T_GREATER_EQ: pStack = (ppValue >= pValue)
Case T_AND: pStack = (ppValue And pValue)
Case T_OR: pStack = (ppValue Or pValue)
Case T_COMMA 'in this case, we need special processing.
Case T_ASSIGN, T_PLUS_ASSIGN, T_MINUS_ASSIGN, T_TIMES_ASSIGN, _
T_DIVIDE_ASSIGN, T_POWER_ASSIGN, T_MODULOUS_ASSIGN
If ppName = "" Then
usEvaluateStatement = usEAssignToNonVariable
Exit Function
End If
Select Case Tokens(i).Token
Case T_ASSIGN: ppValue = pValue
Case T_PLUS_ASSIGN: ppValue = ppValue + pValue
Case T_MINUS_ASSIGN: ppValue = ppValue - pValue
Case T_TIMES_ASSIGN: ppValue = ppValue * pValue
Case T_DIVIDE_ASSIGN, T_MODULOUS_ASSIGN
If pValue = 0 Then
usEvaluateStatement = usEDivideByZero
Exit Function
ElseIf Tokens(i).Token = T_DIVIDE_ASSIGN Then
ppValue = ppValue / pValue
Else
ppValue = ppValue Mod pValue
End If
Case T_POWER
If pValue = 0 And ppValue = 0 Then
usEvaluateStatement = usEZerothPowerOfZero
Exit Function
Else
ppValue = ppValue ^ pValue
End If
End Select
vTemp = usCallbackVariable(ppName, VA_LET, ppValue, Matrix, Variables)
If vTemp <> usESuccess Then
usEvaluateStatement = vTemp
Exit Function
End If
pStack = ppValue
Case T_LBRACKET
If ppName = "" Then
usEvaluateStatement = usEAssignToNonVariable
Exit Function
End If
vtok = ppName & Chr(0) & pValue
End Select
Else
usEvaluateStatement = usENoOperand
Exit Function
End If
End If
If Tokens(i).Token = T_COMMA Then
usPushNode Stack, lStack, ptok, pvtok
usPushNode Stack, lStack, tok, vtok
usPushNode Stack, lStack, Tokens(i).Token, Tokens(i).Value
ElseIf Tokens(i).Token = T_LBRACKET Then
usPushNode Stack, lStack, T_VARIABLE, vtok
Else
usPushNode Stack, lStack, T_NUMBER, pStack
End If
Else
usEvaluateStatement = usENoOperand
Exit Function
End If
End If
Next
If lStack = 1 Then
If Stack(0).Token = T_VARIABLE Then
vTemp = usCallbackVariable(Stack(0).Value, VA_GET, Value, Matrix, Variables)
If vTemp <> usESuccess Then
usEvaluateStatement = vTemp
Exit Function
End If
Else
Value = Stack(0).Value
End If
usEvaluateStatement = usESuccess
Else
usEvaluateStatement = usENoOperand
End If
Exit Function
errorCatch:
If Err.Number = 6 Then
usEvaluateStatement = usEOverflow
Else
usEvaluateStatement = usEUndefined
End If
End Function
'*******************************************************************************
'* Script Executing Functions *
'*******************************************************************************
Public Function usEvaluateScript( _
ByRef Tokens() As usTokenType, ByRef Result As Long, _
ByRef Matrix As Variant, ByRef Variables() As usVariableType _
) As usErrorEnum
Dim blockLine() As usBlockType, blockDepth As Integer
Dim vTemp As usErrorEnum, vResult As Long, vDepth As Integer
Dim pos As Integer, npos As Integer, tok As usTokenEnum
Dim numberLines As Long
blockDepth = 0
pos = 0
numberLines = 0
Do While pos <= UBound(Tokens)
For npos = pos To UBound(Tokens)
If Tokens(npos).Token = T_ENDLINE Then Exit For
Next
Select Case Tokens(npos - 1).Token
Case T_DO
ReDim Preserve blockLine(-1 To blockDepth) As usBlockType
With blockLine(blockDepth)
.blockType = T_DO
.startPos = npos + 1
.Counter = 0
If Tokens(npos - 2).Token = T_NONE Then
vResult = -1
Else
vTemp = usEvaluateStatement(Tokens, pos, npos - 2, vResult, Matrix, Variables)
If vTemp <> usESuccess Then
usEvaluateScript = vTemp
Exit Function
End If
End If
.limitCounter = vResult
End With
npos = npos + 1
blockDepth = blockDepth + 1
Case T_IF
If Tokens(npos - 2).Token = T_NONE Then
usEvaluateScript = usEInvalidSyntax
Exit Function
Else
vTemp = usEvaluateStatement(Tokens, pos, npos - 2, vResult, Matrix, Variables)
If vTemp <> usESuccess Then
usEvaluateScript = vTemp
Exit Function
End If
End If
If vResult Then
ReDim Preserve blockLine(-1 To blockDepth) As usBlockType
With blockLine(blockDepth)
.blockType = T_IF
.Counter = 0
.limitCounter = 1
.startPos = npos + 1
End With
blockDepth = blockDepth + 1
npos = npos + 1
Else
vDepth = usMatchingBlock(Tokens, npos + 1)
If vDepth < 0 Then
usEvaluateScript = usEUnknownBlock
Exit Function
ElseIf vDepth + 1 < UBound(Tokens) Then
If Tokens(vDepth + 2).Token = T_ELSE Then
ReDim Preserve blockLine(-1 To blockDepth) As usBlockType
With blockLine(blockDepth)
.blockType = T_ELSE
.Counter = 0
.limitCounter = 1
.startPos = npos + 1
End With
blockDepth = blockDepth + 1
End If
End If
npos = vDepth + 2
End If
Case T_ELSE
If Tokens(npos + 1).Token = T_LBRACE Then
If blockLine(blockDepth - 1).blockType = T_ELSE Then
npos = npos + 1
ElseIf blockLine(blockDepth - 1).blockType = T_IF Then
ReDim Preserve blockLine(-1 To blockDepth - 2) As usBlockType
blockDepth = blockDepth - 1
vDepth = usMatchingBlock(Tokens, npos + 1)
If vDepth < 0 Then
usEvaluateScript = usEUnknownBlock
Exit Function
End If
npos = vDepth + 2
Else
usEvaluateScript = usEInvalidSyntax
Exit Function
End If
Else
usEvaluateScript = usEInvalidSyntax
Exit Function
End If
Case T_LBRACE
npos = npos + 1
Case T_RBRACE
If blockDepth = 0 Then
usEvaluateScript = usEUnknownBlock
Exit Function
End If
Select Case blockLine(blockDepth - 1).blockType
Case T_DO
blockLine(blockDepth - 1).Counter = blockLine(blockDepth - 1).Counter + 1
If _
blockLine(blockDepth - 1).limitCounter <> -1 And _
blockLine(blockDepth - 1).Counter >= blockLine(blockDepth - 1).limitCounter _
Then
ReDim Preserve blockLine(-1 To blockDepth - 2) As usBlockType
blockDepth = blockDepth - 1
npos = npos + 1
Else
npos = blockLine(blockDepth - 1).startPos + 2
End If
Case T_IF
If npos < UBound(Tokens) Then
If Tokens(npos + 1).Token <> T_ELSE Then
ReDim Preserve blockLine(-1 To blockDepth - 2) As usBlockType
blockDepth = blockDepth - 1
End If
End If
npos = npos + 1
Case T_ELSE
ReDim Preserve blockLine(-1 To blockDepth - 2) As usBlockType
blockDepth = blockDepth - 1
npos = npos + 1
End Select
Case Else
vTemp = usEvaluateStatement(Tokens, pos, npos - 1, vResult, Matrix, Variables)
If vTemp = usEExitBlock Then
If blockDepth = 0 Then
usEvaluateScript = usEUnknownBlock
Exit Function
Else
blockLine(blockDepth - 1).limitCounter = 0
npos = usMatchingBlock(Tokens, blockLine(blockDepth - 1).startPos, 1 - vResult)
If npos < 0 Then
usEvaluateScript = usEUnknownBlock
Exit Function
End If
ReDim Preserve blockLine(-1 To blockDepth - vResult) As usBlockType
blockDepth = blockDepth - vResult + 1
blockLine(blockDepth - 1).limitCounter = 0
End If
ElseIf vTemp = usESuccess Or vTemp = usEEmpty Then
npos = npos + 1
Else
usCallbackVariable "RESULT", VA_GET, Result, Matrix, Variables
usEvaluateScript = vTemp
Exit Function
End If
End Select
pos = npos
numberLines = numberLines + 1
If numberLines >= maximumLines Then
usCallbackVariable "RESULT", VA_GET, Result, Matrix, Variables
usEvaluateScript = usETimeout
Exit Function
End If
Loop
usCallbackVariable "RESULT", VA_GET, Result, Matrix, Variables
usEvaluateScript = usESuccess
End Function
Public Function usExecute( _
ByVal Code As String, ByRef Matrix As Variant, ByRef Result As Long _
) As usErrorEnum
Dim Variables() As usVariableType, Tokens() As usTokenType
Dim vTemp As usErrorEnum
vTemp = usTokenizeScript(Code, Tokens)
If vTemp <> usESuccess Then
usExecute = vTemp
Exit Function
End If
usInitializeVariables Variables, Matrix
usInitializeFunctions Variables, Matrix
usExecute = usEvaluateScript(Tokens, Result, Matrix, Variables)
End Function
<html>
<head>
<title>UserScript version 0.2.3</title>
<link rel="stylesheet" href="common.css" type="text/css" />
</head>
<body>
<h1>UserScript ๋ ˆํผ๋Ÿฐ์Šค <small>UserScript Reference</small></h1>
<h2>0. ๋ชฉ์ฐจ <small>Contents</small></h2>
<h2>1. ์†Œ๊ฐœ <small>Introduction</small></h2>
<h3>1.1 UserScript๋Š”? <small>What is UserScript?</small></h3>
<p>UserScript๋Š” Break the Box ์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„, Visual Basic 6์—์„œ ๋Œ์•„ ๊ฐ€๋Š” ์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์€ <b>ํ† ๋ผ๊ตฐ ๊ฐ• ์„ฑํ›ˆ</b>์ด ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ˜„์žฌ ์ตœ์‹  ๋ฒ„์ „์€ 0.2.3์ž…๋‹ˆ๋‹ค.</p>
<h3>1.2 ๋ฌด์—‡์„ ํ•˜๋Š”๊ฐ€? <small>What does UserScript?</small></h3>
<p>UserScript๋Š” ์ •์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ํ–‰๋ ฌ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์ด ๋ฐ”๋กœ Break the Box์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค)</p>
<h3>1.2 ํŒŒ์ผ ๊ตฌ์„ฑ <small>File Structure</small></h3>
<ul>
<li><b>mdlUserScript.bas</b>: UserScript ๋ชจ๋“ˆ</li>
<li><b>ref/common.css</b>: ๋ ˆํผ๋Ÿฐ์Šค์šฉ CSS (<a href="http://www.hypothetic.org/docs/msn/index.php">์—ฌ๊ธฐ</a>์„œ ๋งŽ์ด ๋นŒ๋ ค ์™”์Šต๋‹ˆ๋‹ค.)</li>
<li><b>ref/index.html</b>: ์ด ๋ฌธ์„œ :)</li>
</ul>
<h2>2. ๋ฌธ๋ฒ• ๋ ˆํผ๋Ÿฐ์Šค <small>Language Reference</small></h2>
<p>UserScript์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ๋ฒ•์€ C์™€ ํก์‚ฌํ•ฉ๋‹ˆ๋‹ค.</p>
<h3>2.1 ๊ฐœ๋… <small>Notions</small></h3>
<dl>
<dt>์‹ Expression</dt> <dd>UserScript์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ณ„์‚ฐ ๋‹จ์œ„๋กœ, ์ˆซ์ž, ํ˜น์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์‹์˜ ๊ฒฐํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.</dd>
<dt>๋ฌธ์žฅ Statement</dt> <dd>์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ๋๋‚˜๋Š”, ํ•˜๋‚˜์˜ ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>๋ธ”๋ก Block</dt> <dd>{์™€ }๋กœ ๋ฌถ์—ฌ ์žˆ๋Š”, ๋ฌธ์žฅ๋“ค์˜ ๋ฌถ์Œ์ž…๋‹ˆ๋‹ค.</dd>
<dt>ํ•จ์ˆ˜ Function</dt> <dd>ํ•˜๋‚˜ ์ด์ƒ์˜ ์‹์„ ๋ฐ›๊ฑฐ๋‚˜ ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ›์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช…๋ น์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. UserScript์˜ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค.</dd>
<dt>๋ฐ˜ํ™˜๊ฐ’ Return Value</dt> <dd>ํ•จ์ˆ˜๊ฐ€ ๊ณ„์‚ฐ๋œ ํ›„์— ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์œผ๋กœ, ์ˆ˜์‹ ์ค‘์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</dd>
<dt>๋ณ€์ˆ˜ Variable</dt> <dd>์‹์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.</dd>
<dt>์ฃผ์„ Comment</dt> <dd>์‹คํ–‰์— ์•„๋ฌด ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”, ์„ค๋ช…์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.</dd>
</dl>
<h3>2.2 ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž๋“ค <small>Used Characters</small></h3>
<dl>
<dt>๊ณต๋ฐฑ, ํƒญ, ์ค„ ๋ฐ”๊ฟˆ</dt> <dd>UserScript์—์„œ ์ด ๋ฌธ์ž๋“ค์€ ๋ชจ๋‘ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.</dd>
<dt>;</dt> <dd>๋ฌธ์žฅ ๋์— ๋ถ™์–ด์„œ ๋ฌธ์žฅ๊ณผ ๋ฌธ์žฅ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>% ^ * ( ) - + = [ ] &lt; &gt; , /</dt> <dd>์—ฐ์‚ฐ์ž๋“ค๋กœ, ์‹์„ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.</dd>
<dt>{ }</dt> <dd>๋ธ”๋ก์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.</dd>
<dt>$</dt> <dd>๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.</dd>
<dt>0~9</dt> <dd>์ˆซ์ž ์ƒ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.</dd>
<dt>A~Z a~z _</dt> <dd>ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</dd>
</dl>
<h3>2.3 ํ˜• <small>Types</small></h3>
<p>UserScript์—์„œ ์ง€์›ํ•˜๋Š” ์œ ์ผํ•œ ํ˜•์€ ์ •์ˆ˜ํ˜•์ž…๋‹ˆ๋‹ค. -2147483648๋ถ€ํ„ฐ 2147483647๊นŒ์ง€๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์‹ค์ˆ˜ํ˜•์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์†Œ์ˆซ์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.</p>
<p>UserScript์—์„œ "์ฐธ"์€ "0์ด ์•„๋‹Œ ๋ชจ๋“  ์ˆซ์ž"๋กœ, "๊ฑฐ์ง“"์€ "0"๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์€ ๊ฒฝ์šฐ "์ฐธ"์€ -1์„, "๊ฑฐ์ง“"์€ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</p>
<h3>2.4 ์—ฐ์‚ฐ์ž <small>Operators</small></h3>
<p>์—ฐ์‚ฐ์ž๋Š” ์‹๊ณผ ์‹์„ ์—ฐ๊ฒฐํ•ด์„œ ํ•˜๋‚˜์˜ ์‹(ํ˜น์€ ์ˆซ์ž)๋กœ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.</p>
<h4>2.4.1 ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž <small>Arithmetic Operators</small></h4>
<dl>
<dt>a + b</dt> <dd>a์™€ b๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a - b</dt> <dd>a์—์„œ b๋ฅผ ๋บ๋‹ˆ๋‹ค.</dd>
<dt>a * b</dt> <dd>a์™€ b๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a / b</dt> <dd>a๋ฅผ b๋กœ ๋‚˜๋ˆˆ ๋ชซ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. b๊ฐ€ 0์ด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a % b, a mod b (๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)</dt> <dd>a๋ฅผ b๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์—ญ์‹œ b๊ฐ€ 0์ด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a ^ b</dt> <dd>a์˜ b์ œ๊ณฑ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. a์™€ b๊ฐ€ ๋ชจ๋‘ 0์ด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.</dd>
</dl>
<h4>2.4.2 ๋น„๊ต ์—ฐ์‚ฐ์ž <small>Comparison Operators</small></h4>
<dl>
<dt>a == b</dt> <dd>a์™€ b๊ฐ€ ๊ฐ™์œผ๋ฉด -1(์ฐธ), ๋‹ค๋ฅด๋ฉด 0(๊ฑฐ์ง“)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a != b, a &lt;&gt; b, a &gt;&lt; b</dt> <dd>a์™€ b๊ฐ€ ๋‹ค๋ฅด๋ฉด -1(์ฐธ), ๊ฐ™์œผ๋ฉด 0(๊ฑฐ์ง“)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a &gt; b</dt> <dd>a๊ฐ€ b๋ณด๋‹ค ํฌ๋ฉด -1(์ฐธ), ๋‹ค๋ฅด๋ฉด 0(๊ฑฐ์ง“)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a =&gt; b, a &gt;= b</dt> <dd>a๊ฐ€ b๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด -1(์ฐธ), ๋‹ค๋ฅด๋ฉด 0(๊ฑฐ์ง“)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a &lt; b</dt> <dd>a๊ฐ€ b๋ณด๋‹ค ์ž‘์œผ๋ฉด -1(์ฐธ), ๋‹ค๋ฅด๋ฉด 0(๊ฑฐ์ง“)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a &lt;= b, a =&lt; b</dt> <dd>a๊ฐ€ b๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด -1(์ฐธ), ๋‹ค๋ฅด๋ฉด 0(๊ฑฐ์ง“)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
</dl>
<h4>2.4.3 ๋…ผ๋ฆฌ/๋น„ํŠธ ์—ฐ์‚ฐ์ž <small>Logical/Bitwise Operators</small></h4>
<p>์ด ์—ฐ์‚ฐ์ž๋“ค์€ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž์ด์ž ๋น„ํŠธ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ ์ด์ง๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.</p>
<p>๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž ์•ž ๋’ค์—๋Š” ๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์—ฐ์‚ฐ์ž๋“ค์€ ๋ชจ๋‘ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
<dl>
<dt>a and b</dt> <dd>a์™€ b๊ฐ€ ๋ชจ๋‘ ์ฐธ์ด๋ฉด -1(์ฐธ), ๋‹ค๋ฅด๋ฉด 0(๊ฑฐ์ง“)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a or b</dt> <dd>a์™€ b ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์ด ์ฐธ์ด๋ฉด -1(์ฐธ), ๋‹ค๋ฅด๋ฉด 0(๊ฑฐ์ง“)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>not a</dt> <dd>a๊ฐ€ ์ฐธ์ด๋ฉด 0(๊ฑฐ์ง“), ๊ฑฐ์ง“์ด๋ฉด 1(์ฐธ)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
</dl>
<p>UserScript๋Š” Lazy Evaluation (ํ˜น์€ Shorthand Evaluation)์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์•ž ๋’ค์˜ ์ˆ˜์‹์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ํ™•์ธํ•ด ๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.</p>
<h4>2.4.4 ๋‹จํ•ญ ๋ถ€ํ˜ธ ์—ฐ์‚ฐ์ž <small>Unary Sign Operators</small></h4>
<p>๋ชจ๋“  ๋‹จํ•ญ ๋ถ€ํ˜ธ ์—ฐ์‚ฐ์ž๋Š” ์•ž์— ๋ถ™์Šต๋‹ˆ๋‹ค.</p>
<dl>
<dt>+a</dt> <dd>a์˜ ๋ถ€ํ˜ธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ฆ‰ a์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.</dd>
<dt>-a</dt> <dd>a์˜ ๋ถ€ํ˜ธ๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ฆ‰ (-1) * a์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.</dd>
</dl>
<h4>2.4.5 ๋ณ€์ˆ˜ ์ฆ๊ฐ ์—ฐ์‚ฐ์ž <small>Variable Increase/Decrease Operators</small></h4>
<p>๋ณ€์ˆ˜ ์ฆ๊ฐ ์—ฐ์‚ฐ์ž๋Š” ์•ž์— ์˜ค๋Š” ๊ฒฝ์šฐ(์ „์œ„)์™€ ๋’ค์— ์˜ค๋Š” ๊ฒฝ์šฐ(ํ›„์œ„)์˜ ์—ฐ์‚ฐ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.</p>
<dl>
<dt>++a</dt> <dd>a๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ ํ›„ ํ˜„์žฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a++</dt> <dd>a๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ ํ›„ ์›๋ž˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (++a๋ณด๋‹ค 1 ์ž‘์Šต๋‹ˆ๋‹ค)</dd>
<dt>--a</dt> <dd>a๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ ํ›„ ํ˜„์žฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a--</dt> <dd>a๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ ํ›„ ์›๋ž˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (--a๋ณด๋‹ค 1 ํฝ๋‹ˆ๋‹ค)</dd>
</dl>
<p>๋ณ€์ˆ˜ ์ฆ๊ฐ ์—ฐ์‚ฐ์ž์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์ฝ๊ธฐ ์ „์šฉ ๋ณ€์ˆ˜๋ผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.</p>
<h4>2.4.6 ์‰ผํ‘œ ์—ฐ์‚ฐ์ž <small>Comma Operator</small></h4>
<dl>
<dt>,</dt> <dd>ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.</dd>
</dl>
<p>C์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, ์ˆ˜์‹ ์ค‘๊ฐ„์—์„œ ์–ธ์ œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์‰ผํ‘œ ์—ฐ์‚ฐ์ž๋Š” ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํŠน์ˆ˜ํ•œ ์—ฐ์‚ฐ์ž์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.</p>
<h4>2.4.7 ๋Œ€์ž… ์—ฐ์‚ฐ์ž <small>Assignment Operators</small></h4>
<dl>
<dt>a = b</dt> <dd>a์— b๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค. (๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.)</dd>
<dt>a += b</dt> <dd>a = a + b์™€ ๊ฐ™์€ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.</dd>
<dt>a -= b</dt> <dd>a = a - b์™€ ๊ฐ™์€ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.</dd>
<dt>a *= b</dt> <dd>a = a * b์™€ ๊ฐ™์€ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.</dd>
<dt>a /= b</dt> <dd>a = a / b์™€ ๊ฐ™์€ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.</dd>
<dt>a %= b</dt> <dd>a = a % b์™€ ๊ฐ™์€ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.</dd>
<dt>a ^= b</dt> <dd>a = a ^ b์™€ ๊ฐ™์€ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.</dd>
</dl>
<p>๋Œ€์ž… ์—ฐ์‚ฐ์ž์˜ ์™ผ์ชฝ ์‹์€ ํ•ญ์ƒ ๋ณ€์ˆ˜๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</dd>
<h4>2.4.8 ๊ด„ํ˜ธ ์—ฐ์‚ฐ์ž <small>Parentheses Operators</small></h4>
<dl>
<dt>(...)</dt> <dd>๊ด„ํ˜ธ ์•ˆ์— ๋“ค์–ด ์žˆ๋Š” ์‹์„ ๋จผ์ € ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>a[b]</dt> <dd>๋ณ€์ˆ˜ ๋ฐฐ์—ด a์˜ b๋ฒˆ์งธ ๋ณ€์ˆ˜๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. a๋Š” ํ•ญ์ƒ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</dd>
</dl>
<p>๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•  ๋•Œ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.</p>
<h4>2.4.9 ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ <small>Operator Precedence</small></h4>
<p>์—ฐ์‚ฐ์ž๋“ค์€ ๋‹ค์Œ์˜ ์ˆœ์„œ๋Œ€๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. (๋‹จ, ๊ด„ํ˜ธ๋กœ ์ธํ•ด์„œ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€” ๊ฒฝ์šฐ๋Š” ์ œ์™ธ) ๊ฐ™์€ ์ˆœ์„œ์— ์žˆ์œผ๋ฉด ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” ์ˆœ์„œ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.</p>
<ul>
<li><b>++, --</b></li>
<li><b>+, -</b>(๋ถ€ํ˜ธ ์—ฐ์‚ฐ์ž)<b>, not</b></li>
<li><b>^</b></li>
<li><b>*, /</b></li>
<li><b>+, -</b>(์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž)</li>
<li><b>&gt;, &gt;=, &lt;, &lt;=</b></li>
<li><b>==, !=</b></li>
<li><b>and</b></li>
<li><b>or</b></li>
<li><b>=, +=, -=, *=, /=, %=, ^=</b></li>
<li><b>,</b>(์‰ผํ‘œ ์—ฐ์‚ฐ์ž)<b>, []</b>(๊ด„ํ˜ธ ์—ฐ์‚ฐ์ž)</li>
</ul>
<p>๋ถ€ํ˜ธ ์—ฐ์‚ฐ์ž์™€ not ์—ฐ์‚ฐ์ž, ๊ทธ๋ฆฌ๊ณ  ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋ฅผ ๋บ€ ๋ชจ๋“  ์—ฐ์‚ฐ์ž๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.</p>
<h3>2.5 ๋ณ€์ˆ˜ <small>Variables</small></h3>
<p>๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ๋‹ด์•„ ๋‘๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” $๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๋ณ€์ˆ˜ ์ด๋ฆ„์—๋Š” ์•ŒํŒŒ๋ฒณ๊ณผ _๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
<p>UserScript๋Š” ์ƒ๋‹นํžˆ ์ œํ•œ์ ์ธ ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ๋งŒ๋“  ๋ณ€์ˆ˜๋“ค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
<h4>2.5.1 ๋ณ€์ˆ˜ ๋ฐฐ์—ด <small>Variable Array</small></h4>
<p>ํ•œ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. (C์—์„œ์˜ ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค)</p>
<p>์˜ˆ๋ฅผ ๋“ค์–ด์„œ $TEMP๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ด ๋ณ€์ˆ˜๊ฐ€ ๋ณ€์ˆ˜ ๋ฐฐ์—ด๋กœ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ $TEMP[0]๋ถ€ํ„ฐ $TEMP[9]๊นŒ์ง€ ์ˆซ์ž๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ถ™๋Š” ์ˆซ์ž๋ฅผ ์ธ๋ฑ์Šค(index)๋ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ๋”ฐ๋ผ์„œ ์ด ์ธ๋ฑ์Šค์˜ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.</p>
<p>$TEMP[0]๊ณผ ๊ฐ™์ด ๋ณ€์ˆ˜ ๋ฐฐ์—ด ์•ˆ์˜ ๋ณ€์ˆ˜๋“ค์€ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ ์™„์ „ํžˆ ๋˜‘๊ฐ™์ด ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ $TEMP[11]๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•ด์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.</p>
<h4>2.5.2 ํ–‰๋ ฌ ๋ณ€์ˆ˜๋“ค <small>Matrix Variables</small></h4>
<p>์•„๋ž˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” "ํ–‰ ๋ฒˆํ˜ธ"๋‚˜ "์—ด ๋ฒˆํ˜ธ"๋Š” ๋ชจ๋‘ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ˆซ์ž์ž…๋‹ˆ๋‹ค. ์ฆ‰ 3 x 3 ํ–‰๋ ฌ์—์„œ ํ–‰ ๋ฒˆํ˜ธ์™€ ์—ด ๋ฒˆํ˜ธ๋Š” ๋ชจ๋‘ 0๋ถ€ํ„ฐ 2๊นŒ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
<dl>
<dt>$_ROW, $_COLUMN</dt> <dd>ํ˜„์žฌ์˜ ํ–‰ ๋ฒˆํ˜ธ์™€ ์—ด ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋ฉด ํ˜„์žฌ ํ–‰๊ณผ ์—ด์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</dd>
<dt>$_ROWS, $_COLUMNS</dt> <dd>ํ–‰๋ ฌ์˜ ํ–‰ ๊ฐฏ์ˆ˜์™€ ์—ด ๊ฐฏ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 3 x 3 ํ–‰๋ ฌ์˜ ๊ฒฝ์šฐ $_ROWS์™€ $_COLUMNS๋Š” ๋ชจ๋‘ 3์ž…๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ๋Œ€์ž…ํ•  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.</dd>
<dt>$CURRENT</dd> <dd>ํ˜„์žฌ์˜ ํ–‰๊ณผ ์—ด์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ $_ROW์™€ $_COLUMN์ด 1์ผ ๊ฒฝ์šฐ, $CURRENT๋Š” ๋‘ ๋ฒˆ์งธ ํ–‰ ๋‘ ๋ฒˆ์งธ ์—ด์— ์žˆ๋Š” ์›์†Œ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.</dd>
<dt>$PREVIOUS</dd> <dd>ํ˜„์žฌ์˜ ํ–‰ ๋ฒˆํ˜ธ๋‚˜ ์—ด ๋ฒˆํ˜ธ๊ฐ€ ๋ฐ”๋€” ๊ฒฝ์šฐ ์ด์ „์— ๊ฐ€๋ฆฌํ‚ค๋˜ ์›์†Œ์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. <span class="warning">$_ROW์™€ $_COLUMN์— ์ง์ ‘ ๊ฐ’์„ ๋Œ€์ž…ํ•  ๊ฒฝ์šฐ, ํ•œ ๋ฒˆ ๋Œ€์ž…ํ•  ๋•Œ๋งˆ๋‹ค $PREVIOUS๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉฐ, ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์•„๋„ $PREVIOUS์˜ ๊ฐ’์€ ํ•ญ์ƒ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.</span></dd>
</dl>
<h4>2.5.2 ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋“ค <small>General Variables</small></h4>
<dl>
<dt>$RESULT</dt> <dd>์Šคํฌ๋ฆฝํŠธ์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.</dd>
<dt>$TEMP</dt> <dd>์ž„์‹œ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. 0๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ $TEMP ์ž์ฒด๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.</dd>
</dl>
<h3>2.6 ์กฐ๊ฑด/๋ฐ˜๋ณต๋ฌธ <small>Conditional/Repetitive Statements</small></h3>
<p>์กฐ๊ฑด๋ฌธ์€ ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ์žฅ(๋“ค)์„ ๋œปํ•˜๋ฉฐ, ๋ฐ˜๋ณต๋ฌธ์€ ์ง€์ •ํ•œ ํšŸ์ˆ˜๋‚˜ ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฌธ์žฅ(๋“ค)์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.</p>
<p>UserScript์˜ ๋ชจ๋“  ์กฐ๊ฑด/๋ฐ˜๋ณต๋ฌธ์€ (ํ•œ ๋ฌธ์žฅ์ด๋ผ๋„) ๋ธ”๋ก์œผ๋กœ ๋ฌถ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ก์€ ์ด ๋ฌธ์žฅ๋“ค ์ด์™ธ์— ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.</p>
<h4>2.6.1 IF...ELSE ๋ฌธ <small>IF...ELSE Statement</small></h4>
<p>IF...ELSE ๋ฌธ์€ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:</p>
<p><code><span style="color:black; text-decoration:underline;">Type I:</span><br />
if(<i>conditional_expression</i>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<i>if-block statement(s);</i><br />
}</code></p>
<p><code><span style="color:black; text-decoration:underline;">Type II:</span><br />
if(<i>conditional_expression</i>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<i>if-block statement(s);</i><br />
} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<i>else-block statement(s);</i><br />
}</code></p>
<ul>
<li>Type I์˜ ๊ฒฝ์šฐ, <i>conditional_expression</i>์ด ์ฐธ์ด๋ฉด ๊ทธ ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜๋ฉฐ, ๊ฑฐ์ง“์ด๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด ๊ฐ‘๋‹ˆ๋‹ค.</li>
<li>Type II์˜ ๊ฒฝ์šฐ, <i>conditional_expression</i>์ด ์ฐธ์ด๋ฉด ๊ทธ ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜๋ฉฐ, ๊ฑฐ์ง“์ด๋ฉด else ๋’ค์— ๋‚˜์˜ค๋Š” ๋ธ”๋ก์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.</li>
</ul>
<p>IF...ELSE ๋ฌธ๋„ ํ•˜๋‚˜์˜ ๋ธ”๋ก์ด๋ฏ€๋กœ exit() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.</p>
<h4>2.6.2 DO ๋ฌธ <small>DO Statement</small></h4>
<p>DO ๋ฌธ๋„ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:</p>
<p><code><span style="color:black; text-decoration:underline;">Type I:</span><br />
do {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<i>do-block statement(s);</i><br />
}</code></p>
<p><code><span style="color:black; text-decoration:underline;">Type II:</span><br />
do(<i>repeating_number</i>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<i>do-block statement(s);</i><br />
}</code></p>
<ul>
<li>Type I์˜ ๊ฒฝ์šฐ, do ๋ธ”๋ก ์•ˆ์˜ ๋ฌธ์žฅ์€ exit()๋‚˜ end()๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๋ฌดํ•œํžˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.</li>
<li>Type II์˜ ๊ฒฝ์šฐ, do ๋ธ”๋ก ์•ˆ์˜ ๋ฌธ์žฅ์€ <i>repeating_number</i>๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰๋˜๊ณ  ๋ธ”๋ก์„ ๋น ์ ธ ๋‚˜์˜ต๋‹ˆ๋‹ค. (๋ฌผ๋ก  ์ด ์•ˆ์—์„œ๋„ exit()๋‚˜ end()๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)</li>
</ul>
<p>Type II์˜ ๊ฒฝ์šฐ <i>repeating_number</i>๊ฐ€ -1์ด ๋˜๋ฉด Type I์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, <i>repeating_number</i>๋Š” do ๋ฃจํ”„๊ฐ€ ์‹œ์ž‘ํ•  ๋•Œ ๋ฐ”๋กœ ๊ณ„์‚ฐ๋˜๋ฏ€๋กœ C์˜ while๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋‹ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด์„ ๋‹ฌ๋ ค๋ฉด Type I๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.</p>
<h3>2.7 ํ•จ์ˆ˜ <small>Function</small></h3>
<p>ํ•จ์ˆ˜๋Š” 0๊ฐœ ์ด์ƒ์˜ ์‹์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ช…๋ น์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„ ์—ญ์‹œ ๋ณ€์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•ŒํŒŒ๋ฒณ๊ณผ _๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
<p>ํ•จ์ˆ˜๋Š” ์‹ ์ค‘๊ฐ„์—์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ๋˜์–ด ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
<h4>2.7.1 ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ <small>How to call function</small></h4>
<p>ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅผ ๋•Œ์—๋Š” abs()์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ์ด๋ฆ„ ๋’ค์— ๊ด„ํ˜ธ๋กœ ๋ฌถ์ธ ์ธ์ˆ˜(argument)๋“ค์„ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ธ์ˆ˜๊ฐ€ ์—†๋”๋ผ๋„ ๋นˆ ๊ด„ํ˜ธ -- () -- ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ์ธ์ˆ˜๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ,๋กœ ๊ตฌ๋ถ„ํ•ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ„ ์ธ์ˆ˜๋“ค์ด ํ•จ์ˆ˜์— ๋งž์ง€ ์•Š๋Š”๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.</p>
<p>ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ $RESULT = temp(); ์™€ ๊ฐ™์ด ์‹ ์ค‘๊ฐ„์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
<h4>2.7.2 ํ–‰๋ ฌ ํ•จ์ˆ˜๋“ค <small>Matrix Functions</small></h4>
<p><i>๊ธฐ์šธ์–ด์ง„ ์ธ์ˆ˜๋“ค</i>์€ ์ƒ๋žต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>
<dl>
<dt>start(<i>row, column</i>)</dt>
<dd>ํ˜„์žฌ ํ–‰์„ row, ์—ด์„ column์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. row์™€ column์ด ์ƒ๋žต๋˜๋ฉด ์ฒซ ํ–‰ ์ฒซ ์—ด๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.<br />์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>go_right(<i>num</i>), go_left(<i>num</i>), go_up(<i>num</i>), go_down(<i>num</i>)</dt>
<dd>num ๋งŒํผ ์˜ค๋ฅธ์ชฝ/์™ผ์ชฝ/์œ—์ชฝ/์•„๋žซ์ชฝ์œผ๋กœ ํ˜„์žฌ ์นธ์„ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. num์ด ์ƒ๋žต๋˜์—ˆ์„ ๊ฒฝ์šฐ ํ•œ ์นธ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.<br />
๋งŒ์•ฝ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด (์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํ–‰๋ ฌ ๋งจ ์˜ค๋ฅธ์ชฝ ๋์—์„œ go_right()๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ) <b>ํ˜„์žฌ ๋ธ”๋ก์„ ๋น ์ ธ ๋‚˜์˜ต๋‹ˆ๋‹ค.</b>
<span class="warning">์ด ๋•Œ ์ด๋™ํ•  ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ ํ˜„์žฌ ์นธ์€ ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</span><br /><br />
<code>// 1 x 8 ํ–‰๋ ฌ์ด ์ž…๋ ฅ๋˜์—ˆ์„ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค:<br />
do {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$RESULT++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;go_right(5);<br />
}<br />
$RESULT += 10000 * $_ROW + 100 * $_COLUMN;</code><br />
<code class="result">
returns 502 (error #0: Success)<br />
&nbsp;&nbsp;elasped time: 0 ms</code><br /><br />
$RESULT๊ฐ€ 2๊ฐ€ ๋œ ์ƒํƒœ์—์„œ go_right(5)๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์—ฌ์„ฏ ๋ฒˆ์งธ ์นธ์ด๋ฏ€๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ธ”๋ก์„ ๋น ์ ธ ๋‚˜์˜ค๊ณ  ์ด๋™์€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.<br />
์ด ํ•จ์ˆ˜๋Š” ๋ธ”๋ก์ด ์—†๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>add(), sub(), mul(), div(), mod()</dt>
<dd>ํ˜„์žฌ ์นธ์˜ ๋‚ด์šฉ์„ $RESULT์— ๋”ํ•˜๊ฑฐ๋‚˜, ๋นผ๊ฑฐ๋‚˜, ๊ณฑํ•˜๊ฑฐ๋‚˜, ๋‚˜๋ˆˆ ๋ชซ์ด๋‚˜ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.<br />
๊ฐ๊ฐ $RESULT += $CURRENT, $RESULT -= $CURRENT, $RESULT *= $CURRENT, $RESULT /= $CURRENT, $RESULT %= $CURRENT์™€ ๊ฐ™์€ ํ‘œ๊ธฐ์ž…๋‹ˆ๋‹ค.<br />
์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
</dl>
<h4>2.7.3 ์ผ๋ฐ˜ ํ•จ์ˆ˜๋“ค <small>General Functions</small></h4>
<dl>
<dt>_add(num), _sub(num), _mul(num), _div(num), _mod(num)</dt>
<dd>num์„ $RESULT์— ๋”ํ•˜๊ฑฐ๋‚˜, ๋นผ๊ฑฐ๋‚˜, ๊ณฑํ•˜๊ฑฐ๋‚˜, ๋‚˜๋ˆˆ ๋ชซ์ด๋‚˜ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.<br />
๊ฐ๊ฐ $RESULT += num, $RESULT -= num, $RESULT *= num, $RESULT /= num, $RESULT %= num์™€ ๊ฐ™์€ ํ‘œ๊ธฐ์ž…๋‹ˆ๋‹ค.<br />
์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>abs(num)</dt>
<dd>num์˜ ์ ˆ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>sign(num)</dt>
<dd>num์ด ์–‘์ˆ˜์ด๋ฉด 1, ์Œ์ˆ˜์ด๋ฉด -1, 0์ด๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>_random(<i>seed</i>)</dt>
<dd>๋‚œ์ˆ˜ ๋ฐœ์ƒ๊ธฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. seed๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ž๊ธฐ๊ฐ€ ์›ํ•˜๋Š” ์ˆซ์ž๋กœ ๋‚œ์ˆ˜ ๋ฐœ์ƒ๊ธฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋งŒ์•ฝ seed๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ƒ์„ฑ๋˜๋Š” ๋‚œ์ˆ˜๋“ค์€ ๋˜‘๊ฐ™์€ ์ˆœ์„œ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>random(num)</dt>
<dd>0๋ถ€ํ„ฐ num-1๊นŒ์ง€์˜ ์ •์ˆ˜ ๋‚œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
</dl>
<h4>2.7.4 ํŠน์ˆ˜ ํ•จ์ˆ˜๋“ค <small>Special Functions</small></h4>
<dl>
<dt>exit(<i>num</i>)</dt>
<dd>ํ˜„์žฌ ์†ํ•ด ์žˆ๋Š” ๋ธ”๋ก์„ ๋น ์ ธ ๋‚˜์˜ต๋‹ˆ๋‹ค. num์„ ์ง€์ •ํ•˜๋ฉด num ๊ฐœ ๋งŒํผ์˜ ๋ธ”๋ก์„ ๋น ์ ธ ๋‚˜์˜ค๋ฉฐ, ๋งŒ์•ฝ ๋ธ”๋ก์ด num๊ฐœ๋ณด๋‹ค ์ ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.<br />
C์˜ break์™€ ๋‹ค๋ฅธ ์ ์€ ๋ชจ๋“  {...}๊ฐ€ ๋ธ”๋ก์œผ๋กœ ์ธ์‹๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.<br /><br />
<code>
do {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$RESULT++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if($RESULT &gt;= 50) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code><br />
<code class="result">
returns 7164 (error #25: Timeout)<br />
&nbsp;&nbsp;elasped time: 454 ms</code><br /><br />
์ด ์ฝ”๋“œ๋Š” $RESULT๊ฐ€ 50์ด ๋˜๊ฑฐ๋‚˜ ์ปค์ง€๋ฉด do ๋ฃจํ”„๋ฅผ ๋น ์ ธ ๋‚˜์˜ค๋ ค ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ exit()๊ฐ€ ๋น ์ ธ ๋‚˜์˜ค๋Š” ๋ธ”๋ก์€ ๋‹จ์ง€ if ๋ธ”๋ก ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ธ”๋ก์€ ๋ฌดํ•œํžˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ฝ”๋“œ๋ฅผ ์ œ๋Œ€๋กœ ์‹คํ–‰์‹œํ‚ค๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.<br /><br />
<code>do {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$RESULT++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if($RESULT &gt;= 50) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code><br />
<code class="result">
returns 50 (error #0: Success)<br />
&nbsp;&nbsp;elasped time: 3 ms</code><br /><br />
์ด์ œ exit(2)๋Š” if ๋ธ”๋ก๊ณผ do ๋ธ”๋ก ๋‘ ๊ฐœ๋ฅผ ๋ชจ๋‘ ๋น ์ ธ ๋‚˜์˜ค๊ฒŒ ๋˜์–ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.<br />์ด ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.</dd>
<dt>end(), _error()</dt>
<dd>์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. _error()๋Š” ํŠน์ˆ˜ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ end()์™€ ๋‹ค๋ฅธ ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.<br /><br />
<code>$RESULT = 30;<br />
end();<br />
$RESULT++;</code><br />
<code class="result">
returns 30 (error #101: Script terminated)<br />
&nbsp;&nbsp;elasped time: 0 ms</code><br /><br />
end()๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UserScript ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์ด ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</dd>
</dl>
<h2>3. ์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๋ ˆํผ๋Ÿฐ์Šค <small>Script Engine Reference</small></h2>
<h2>4. ๋ณ€๊ฒฝ ์‚ฌํ•ญ <small>ChangeLog</small></h2>
<h3>UserScript 0.2.x</h3>
<h4>UserScript 0.2.4?</h4>
<ul>
<li><b>go_*()</b>๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํ–‰๋ ฌ ๊ด€๋ จ ํ•จ์ˆ˜๋“ค์ด $PREVIOUS์˜ ๊ฐ’์„ ๋‘ ๋ฒˆ(!) ๋ฐ”๊พธ๋Š” ๋ฒ„๊ทธ๋ฅผ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค.</li>
<li>๋‹จ ํ•œ ๋ฌธ์žฅ์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ์Šคํฌ๋ฆฝํŠธ์—์„œ ;๊ฐ€ ๋น ์กŒ์„ ๊ฒฝ์šฐ usEOpenedStatement๊ฐ€ ์•„๋‹Œ usEEmpty ์—๋Ÿฌ ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค.;;;</li>
<li>usEvaluateStatement์—์„œ๋งŒ ๋‚˜์˜ค๋˜ usEOverflow ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ usCallback* ํ•จ์ˆ˜๋„ ๋‚˜์˜ค๊ฒŒ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค. -_-;; (๊นŒ๋จน๊ณ  ์žˆ์—ˆ์Œ)</li>
<li><b>add()~mod(), _add()~_mod()</b> ํ•จ์ˆ˜๊ตฐ์ด 0์ด ์•„๋‹Œ $RESULT๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ณ ์ณค์Šต๋‹ˆ๋‹ค.</li>
<li>$TEMP ๋ณ€์ˆ˜ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์Šคํฌ๋ฆฝํŠธ ๋งจ ์ฒ˜์Œ์— <b>#pragma</b> ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์น  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.</li>
</ul>
<h4>UserScript 0.2.3 <small>(2003/12/22)</small></h4>
<ul>
<li><b>random(), _random()</b> ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</li>
<li><b>go_*()</b> ํ•จ์ˆ˜๊ฐ€ ๋ธ”๋ก์„ ๋น ์ ธ ๋‚˜์˜ค์ง€ ๋ชป ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. (0.2.2์—๋งŒ ์žˆ๋˜ ๋ฌธ์ œ)</li>
<li>usInitializeFunction ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.</li>
</ul>
<h4>UserScript 0.2.2 <small>(2003/12/22)</small></h4>
<ul>
<li><b>exit()</b> ํ•จ์ˆ˜์— ์ธ์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ๋น ์ ธ ๋‚˜์˜ฌ ๋ธ”๋ก์˜ ์ˆ˜๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</li>
<li>usExecuteScript ํ•จ์ˆ˜๋ฅผ usEvaluateScript์™€ usExecute ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.</li>
</ul>
<h4>UserScript 0.2.1 <small>(2003/12/21)</small></h4>
<ul>
<li><b>_error()</b> ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</li>
<li>๋‚ด๋ถ€์ ์œผ๋กœ if()๋‚˜ do() ๋ฌธ๊ณผ { ์‚ฌ์ด์— ์—‰๋šฑํ•œ ๋ฌธ์žฅ์ด ๋ผ์–ด ์žˆ๋Š” ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค.</li>
<li>$TEMP[0]++๊ณผ ๊ฐ™์€ ๋ฌธ์žฅ์—์„œ ํ›„์œ„ ์—ฐ์‚ฐ์ž ++์ด $TEMP[0]์ด ์•„๋‹Œ ์ˆซ์ž 0์— ๋‹ฌ๋ผ ๋ถ™๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.</li>
<li>๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋Œ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด์„œ usETimeout ์—๋Ÿฌ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์—๋Ÿฌ๋Š” ์ผ์ • ํšŸ์ˆ˜ ์ด์ƒ ๋ฌธ์žฅ์„ ์‹คํ–‰ํ•ด์„œ ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋  ๋–„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.</li>
<li>usEOverflow ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.</li>
<li>๊ทธ ์™ธ์— ์˜จ๊ฐ– ๋ฒ„๊ทธ๋“ค์„ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค. -_-;</li>
</ul>
<h4>UserScript 0.2.0 <small>(2003/12/21)</small></h4>
<ul>
<li><b>์ตœ์ดˆ์˜ ์•ˆ์ •ํ™” ๋ฒ„์ „</b></li>
<li>usMatchingBlock ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. -_-;</li>
<li>๋ธ”๋ก ์ฒ˜๋ฆฌ๋ฅผ ์™„์ „ํ•˜๊ฒŒ ์•ˆ์ •ํ™”์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.</li>
</ul>
<h3>UserScript 0.2.x-beta</h3>
<p>์—ฌ๊ธฐ ์žˆ๋Š” ๋ฒ„์ „๋“ค์€ ๊ฐœ๋ฐœ ๋ฒ„์ „์ด๋ฏ€๋กœ ChangeLog๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. -_-</p>
<h4>UserScript 0.2-beta17 <small>(2003/12/20)</small></h4>
<h4>UserScript 0.2-beta13 <small>(2003/12/19)</small></h4>
<h4>UserScript 0.2-beta9 <small>(2003/12/18)</small></h4>
<h4>UserScript 0.2-beta1 <small>(2003/12/17)</small></h4>
<h4>UserScript 0.2-alpha4 <small>(2003/12/16)</small></h4>
<h4>UserScript 0.2-alpha1 <small>(2003/12/15)</small></h4>
</body>
</html>
@lifthrasiir
Copy link
Author

@Korb Back in 2003 when I was still in a high school, my friend commissioned me to make a programming language for a puzzle game to be presented in a school festival. Basically the goal was to find a pattern for given pairs of inputs and outputs and write a program to express that pattern. Incidentally I was making what became the first programming language implementation I would ever make, so I retrofitted and finished my code. In retrospect the game should never had a programming element, but we went forward anyway and this "programming language" is a remnant of that game.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment