Created
July 22, 2012 13:47
-
-
Save lifthrasiir/3159760 to your computer and use it in GitHub Desktop.
UserScript: a forgotten programming language from the hell (2003)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <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>% ^ * ( ) - + = [ ] < > , /</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 <> b, a >< b</dt> <dd>a์ b๊ฐ ๋ค๋ฅด๋ฉด -1(์ฐธ), ๊ฐ์ผ๋ฉด 0(๊ฑฐ์ง)์ ๋ฐํํฉ๋๋ค.</dd> | |
| <dt>a > b</dt> <dd>a๊ฐ b๋ณด๋ค ํฌ๋ฉด -1(์ฐธ), ๋ค๋ฅด๋ฉด 0(๊ฑฐ์ง)์ ๋ฐํํฉ๋๋ค.</dd> | |
| <dt>a => b, a >= b</dt> <dd>a๊ฐ b๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด -1(์ฐธ), ๋ค๋ฅด๋ฉด 0(๊ฑฐ์ง)์ ๋ฐํํฉ๋๋ค.</dd> | |
| <dt>a < b</dt> <dd>a๊ฐ b๋ณด๋ค ์์ผ๋ฉด -1(์ฐธ), ๋ค๋ฅด๋ฉด 0(๊ฑฐ์ง)์ ๋ฐํํฉ๋๋ค.</dd> | |
| <dt>a <= b, a =< 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>>, >=, <, <=</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 /> | |
| <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 /> | |
| <i>if-block statement(s);</i><br /> | |
| } else {<br /> | |
| <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 /> | |
| <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 /> | |
| <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 /> | |
| $RESULT++;<br /> | |
| go_right(5);<br /> | |
| }<br /> | |
| $RESULT += 10000 * $_ROW + 100 * $_COLUMN;</code><br /> | |
| <code class="result"> | |
| returns 502 (error #0: Success)<br /> | |
| 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 /> | |
| $RESULT++;<br /> | |
| if($RESULT >= 50) {<br /> | |
| exit();<br /> | |
| }<br /> | |
| }</code><br /> | |
| <code class="result"> | |
| returns 7164 (error #25: Timeout)<br /> | |
| elasped time: 454 ms</code><br /><br /> | |
| ์ด ์ฝ๋๋ $RESULT๊ฐ 50์ด ๋๊ฑฐ๋ ์ปค์ง๋ฉด do ๋ฃจํ๋ฅผ ๋น ์ ธ ๋์ค๋ ค ๋ง๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง exit()๊ฐ ๋น ์ ธ ๋์ค๋ ๋ธ๋ก์ ๋จ์ง if ๋ธ๋ก ๋ฟ์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ธ๋ก์ ๋ฌดํํ ์คํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด ์ฝ๋๋ฅผ ์ ๋๋ก ์คํ์ํค๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํด์ผ ํฉ๋๋ค.<br /><br /> | |
| <code>do {<br /> | |
| $RESULT++;<br /> | |
| if($RESULT >= 50) {<br /> | |
| exit(2);<br /> | |
| }<br /> | |
| }</code><br /> | |
| <code class="result"> | |
| returns 50 (error #0: Success)<br /> | |
| 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 /> | |
| 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> |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@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.