Code archives/File Utilities/In game scripting (UPDATED!)
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Added a few more features to this source code. Made it so <br>you can run multiple scripts and you can import <br>variables as well as functions from other active script <br>files. Just copy the following code to its appropriate <br>places and run it.<br><br> Oh yes and i also added a nifty GUI function that allows you <br> take a text area filled with script and colorize the commands and strings like your normal IDE. <br><br> usage <br><br> colorizescript(mytextarea:TGadget) So make sure to cut and paste the following to txt files commands.txt 0 U&U%%U&U 1 var 2 int 3 string 4 float 5 if 6 and 7 or 8 then 9 else 10 endif 11 end 12 function 13 endfunction 14 print 15 select 16 case 17 default 18 endselect 19 exit 20 return 21 for 22 to 23 next 24 callfunction 25 callvariable script.txt var string myvar var int myvar2 var int myvar3 var int forlooper var function curse var function test myvar3 = 100 myvar = 'mwhahahaha you bastage' myvar2 = 1 + 1 if myvar2 + 1 = 3 and 10 > myvar2 then curse curse select myvar3 case 100 print 'ok this one found 100' case 200 print 'ok this one found 200' default print 'ok this one found what the other cases didnt' endselect else print 'if on the groovy then' endif function test print 'poop' for forlooper = 0 to 10 print forlooper next endfunction function curse test myvar3 = myvar3 + 100 print myvar3 endfunction script2.txt var string myvar myvar = callvariable myscript QWERTYUIOP myvar print myvar callfunction myscript QWERTYUIOP curse | |||||
Rem ****************************************************************************************** Ingame Scripting Lib v0.1.20 Written by:Leon Drake a.k.a Landon Ritchie Free for Commercial Use! Enjoy!! Few bugs i need to let you know about in the scripting side. Currently Everything is case sensitive so when writing scripts keep everything lowercase I'll be fixing that soon. Also make sure everything is spaced. My tokenizer is still just a baby so if you put in var3=var1+var2 , it will think that whole block is a value so use val3 = val1 + val2 you have to declare all variables and the types. Example var int var1 you must do the same for any functions you wish to use. var function myfunc I havent added the ability to cast parameters to functions yet, so dont put a () after your function when calling it. use myfunc instead of myfunc() note on if statements. I'm pretty sure i got it to run right so far if tested it and it seems to return if statements fine. however curently you can only use math operators before it compares the IF. for example if myval + myval2 = myval3 then works, but... if myval = myval2 + myval3 then doesn't work at the moment. probably best to assign that stuff before you call an if, for now anyways. You can use and & or in your if statement and its not limited on how complex that part may be. you can also use else in your if statement. so far it works good. I'll try to keep updating this as often as i can , which should be often enough since i'm using this code for a 2d rpg engine. Just added the ability to write select statements works pretty much the same as blitz usage select myval3 case 100 case 200 default endselect you can also put select statements inside other select statements and it works fine select myval3 case 100 select myval4 case 20 end select default endselect added for loops ..yet to be upgraded its still very touchy it must be run with a variable like so: for myvar3 = 0 to 100 next you can however replace the 0 or the 100 with variables. doesnt have to start with 0 or end with 100 i was merely using that as an example. Added new function callfunction scriptname functionname What this does is allows you to call a function from a different active script. meaning you have already used runscript on that script. which makes the script active and its functions available. Use call function from another script to run a function from a different script using the other scripts variables and what not. Also you dont have to worry about 2 scripts running using the same variable names i made sure it differentiates them. Added new function callvariable scriptname variablename Just like callfunction this allows you to access the contents of a variable in another active script. So far its only usage is for variable assignment. you cant use it in if statements or anything else like that so you'll have to pre grab the variable contents before hand like this: myvar = callvariable myscript varname you can also do this if you want to myvar = callvariable myscript varname + callvariable myscript varname2 and that works with all the math operators i've added so far. ****************************************************************************************** End Rem Import "bin\bbtype.bmx" Import "bin\bbvkey.bmx" Global declare_list:TList = New TList Global dtokens_list:TList = New TList Global commands_list:TList = New TList Global arguement_list:TList = New TList Global ifbool_list:TList = New TList Global ftokens_list:TList = New TList Global script_list:TList = New TList 'token types Const OPERATORS$ = "*/+-=><" Type script Extends TBBType Method New() Add(script_list) End Method Method After:script() Local t:TLink t=_link.NextLink() If t Return script(t.Value()) End Method Method Before:script() Local t:TLink t=_link.PrevLink() If t Return script(t.Value()) End Method Field scriptname$,scripthandle$,scriptdata$ End Type Type ifbool Extends TBBType Method New() Add(ifbool_list) End Method Method After:ifbool() Local t:TLink t=_link.NextLink() If t Return ifbool(t.Value()) End Method Method Before:ifbool() Local t:TLink t=_link.PrevLink() If t Return ifbool(t.Value()) End Method Field bool,boolexp,parentscrpt:script End Type Type arguement Extends TBBType Method New() Add(arguement_list) End Method Method After:arguement() Local t:TLink t=_link.NextLink() If t Return arguement(t.Value()) End Method Method Before:arguement() Local t:TLink t=_link.PrevLink() If t Return arguement(t.Value()) End Method Field arguementtype$,argvalue$,argnextoperator$,expecting$,parentscrpt:script End Type Type commands Extends TBBType Method New() Add(commands_list) End Method Method After:commands() Local t:TLink t=_link.NextLink() If t Return commands(t.Value()) End Method Method Before:commands() Local t:TLink t=_link.PrevLink() If t Return commands(t.Value()) End Method Field commandname$,commandtype End Type Type declare Extends TBBType Method New() Add(declare_list) End Method Method After:declare() Local t:TLink t=_link.NextLink() If t Return declare(t.Value()) End Method Method Before:declare() Local t:TLink t=_link.PrevLink() If t Return declare(t.Value()) End Method Field dtype$,ddata$,dataarray$[999],dname$,parentscript$,pscript,sindex,parentscrpt:script End Type Type dtokens Extends TBBType Method New() Add(dtokens_list) End Method Method After:dtokens() Local t:TLink t=_link.NextLink() If t Return dtokens(t.Value()) End Method Method Before:dtokens() Local t:TLink t=_link.PrevLink() If t Return dtokens(t.Value()) End Method Field dname$,parentscript$,pscript,index,line,tokentype,parentfunction:declare,parentscrpt:script End Type Type ftokens Extends TBBType Method New() Add(ftokens_list) End Method Method After:ftokens() Local t:TLink t=_link.NextLink() If t Return ftokens(t.Value()) End Method Method Before:ftokens() Local t:TLink t=_link.PrevLink() If t Return ftokens(t.Value()) End Method Field dname$,parentscript$,pscript,index,line,tokentype,parentfunction:declare,parentscrpt:script End Type loadcommands() tokenizescript() tokenizescript("myscript2","ASDFGH","script2.txt") processtokens() runscript() runscript("myscript2","ASDFGH") Function runscript(scriptname$="myscript",scripthandle$="QWERTYUIOP") Local tok:dtokens,com:commands,scr:script scr = getscript:script(scriptname$,scripthandle$) If scr = Null Then If SCRIPTDEBUG = True Then Notify "invalid script name" EndIf Return EndIf tok = gettoken:dtokens(scr) Repeat 'For tok:dtokens = EachIn dtokens_list Print tok.dname$+" object? " If tok = Null Then Return 'If tok2 <> Null And tok = tok2 Continue 'For com:commands = EachIn commands_list com = checkcommands:commands(tok.tokentype) If com <> Null Then tok = processcommands(tok:dtokens,com:commands) 'Exit EndIf If tok <> Null Then tok = tok.After() EndIf Until tok = Null Or tok.parentscrpt <> scr 'Next End Function Function getscript:script(scriptname$,scripthandle$) For scr:script = EachIn script_list If scr.scriptname$ = scriptname$ And scr.scripthandle$ = scripthandle$ Then Return scr EndIf Next Return Null End Function Function gettoken:dtokens(scr:script) For tok:dtokens = EachIn dtokens_list If tok.parentscrpt = scr Then Return tok EndIf Next Return Null End Function Function getarguement:arguement(obj:Object) For arg:arguement = EachIn arguement_list If arg = obj Then Return arg EndIf Next Return Null End Function Function getifbool:ifbool(obj:Object) For ifo:ifbool = EachIn ifbool_list If ifo = obj Then Return ifo EndIf Next Return Null End Function Function processcommands:dtokens(tok:dtokens,com:commands) Select com.commandtype Case 0 dtype$ = checktoken$(tok) Select dtype$ Case "" If SCRIPTDEBUG = True Then Notify "Sorry have no idea what this is Line:"+tok.line EndIf 'Print "I dunno what that is" Return Null 'Case "function" 'tok = runfunction(tok) 'Return tok Default Print "Let's assign a var" tok = assignvar(tok) Return tok End Select Case 1 tok = declarevar(tok) Return tok Case 5 tok = runifstate(tok) Return tok Case 14 tok = Printfunc(tok) Return tok Case 15 tok = runselectstate(tok) Return tok Case 21 tok = runforloop(tok) Return tok Case 24 tok = callfunction(tok) Return tok End Select End Function Function callvariable$(tok:dtokens) Local scr:script,oldtok:dtokens,tokdata$,dec:declare,dnameo$ tok = tok.After() If tok = Null Then If SCRIPTDEBUG = True Then Notify "Unexpected End of File" EndIf 'Print "unexpected End of file" Return Null EndIf dnameo$ = tok.dname$ tok = tok.After() If tok = Null Then 'Print "unexpected End of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return Null EndIf scr = getscript:script(dnameo$,tok.dname$) If scr = Null Then 'Print "Source Script does not exist" If SCRIPTDEBUG = True Then Notify "Source Script does not exist line:"+tok.line EndIf Return Null EndIf tok = tok.After() If tok = Null Then 'Print "unexpected End of file" If SCRIPTDEBUG = True Then Notify "Unexpected End of File" EndIf Return Null EndIf oldtok = tok tok:dtokens = New dtokens tok.dname$ = oldtok.dname$ tok.index = 0 tok.line = 0 tok.parentscrpt = scr dec = finddeclaration:declare(tok) If dec = Null Then If SCRIPTDEBUG = True Then Notify "Variable does not exist Line:"+oldtok.line EndIf 'Print "Variable does not exist" Return "" EndIf dtokens_list.remove tok tok.Remove() tok = oldtok Return dec.ddata$ End Function Function callfunction:dtokens(tok:dtokens) Local scr:script,oldtok:dtokens,dnameo$ tok = tok.After() If tok = Null Then 'Print "unexpected End of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return Null EndIf dnameo$ = tok.dname$ tok = tok.After() If tok = Null Then 'Print "unexpected End of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file "+tok.line EndIf Return Null EndIf scr = getscript:script(dnameo$,tok.dname$) If scr = Null Then 'Print "Source Script does not exist" If SCRIPTDEBUG = True Then Notify "Source Script does not exist Line:"+tok.line EndIf Return Null EndIf tok = tok.After() If tok = Null Then 'Print "unexpected End of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return Null EndIf Print "CALLING FUNCTION "+tok.dname$ oldtok = tok tok:dtokens = New dtokens tok.dname$ = oldtok.dname$ tok.index = 0 tok.line = 0 tok.parentscrpt = scr tok = runfunction(tok) dtokens_list.remove tok tok.Remove() tok = oldtok Return tok End Function Function runforloop:dtokens(tok:dtokens) Local com:commands,loopvar,valuebegin$,valueend$ Local firstok:dtokens,lastok:dtokens Local dec:declare,dec2:declare,dec3:declare tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null 'Print "Must be variable in for loop" If SCRIPTDEBUG = True Then Notify "Missing Variable after For, Line:"+tok.line EndIf Return Null EndIf tok = tok.After() If tok.dname$ <> "=" Then 'Print "Expecting = after For (VAR)" If SCRIPTDEBUG = True Then Notify "Expecting operator after For Variable, Line:"+tok.line EndIf Return Null EndIf tok = tok.After() dec2 = finddeclaration:declare(tok) If dec2 = Null Then Print "not a variable must be a value" valuebegin$ = tok.dname$ Else valuebegin$ = dec2.ddata$ EndIf tok = tok.After() If tok.dname$ <> "to" Then 'Print "expecting to after (VAR)" If SCRIPTDEBUG = True Then Notify "Expecting To, Line:"+tok.line EndIf Return Null EndIf tok = tok.After() dec3 = finddeclaration:declare(tok) If dec3 = Null Then Print "not a variable must be a value" valueend$ = tok.dname$ Else valueend$ = dec3.ddata$ EndIf tok = tok.After() firstok = tok dec.ddata$ = Int(valuebegin$) Repeat 'For tok:dtokens = EachIn dtokens_list Print tok.dname$+" object? " If tok = Null Then Return Null 'If tok2 <> Null And tok = tok2 Continue 'For com:commands = EachIn commands_list com = checkcommands:commands(tok.tokentype) If com <> Null Then tok = processcommands(tok:dtokens,com:commands) 'Exit EndIf If tok = Null Then Return Null If tok <> Null Then tok = tok.After() EndIf If tok.dname$ = "next" And Int(dec.ddata$) < Int(valueend$) Then dec.ddata$ = Int(dec.ddata$) + 1 tok = firstok EndIf Until tok.dname$ = "next" And Int(dec.ddata$) = Int(valueend$) Return tok End Function Function runselectstate:dtokens(tok:dtokens) Local valcompare$,valtype$,tempval$,deftok:dtokens,oldtok:dtokens Local com:commands,selectstates,hasdefaultstate,defaulted=True tok = tok.After() Local dec:declare = finddeclaration:declare(tok) If dec = Null 'Print "Must be variable in select statement" If SCRIPTDEBUG = True Then Notify "Must be a variable after Select, Line:"+tok.line EndIf Return Null EndIf valcompare$ = dec.ddata$ valtype$ = dec.dtype$ tok = tok.After() Repeat Print "select debug current token is: "+tok.dname$ If tok = Null Then 'Print "unexpected end of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return Null EndIf com = checkcommands(tok.tokentype) If com = Null Then 'Print "expected case statement" If SCRIPTDEBUG = True Then Notify "Expected Case statement, Line:"+tok.line EndIf Return Null EndIf Select com.commandtype Case 16 selectstates = 0 tok = tok.After() dec:declare = finddeclaration:declare(tok) If dec = Null Then Print "Must be just a value" If Instr(tok.dname$,"'",1) <> 0 Then tempval$ = Replace(tok.dname$,"'","") Else tempval$ = tok.dname$ EndIf If valcompare$ = tempval$ Then defaulted = False tok = tok.After() Repeat 'For tok:dtokens = EachIn dtokens_list Print tok.dname$+" object? " If tok = Null Then Return Null 'If tok2 <> Null And tok = tok2 Continue 'For com:commands = EachIn commands_list com = checkcommands:commands(tok.tokentype) If com <> Null Then tok = processcommands(tok:dtokens,com:commands) 'Exit EndIf If tok = Null Then Return Null If tok <> Null Then tok = tok.After() EndIf If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Print "INSIDE SELECT NEXT TOKEN IS :"+tok.dname$ Until tok.dname$ = "case" Or tok.dname$ = "exit" Or tok.dname$ = "Default" Or tok.dname$ = "EndSelect" And selectstates = 0 'If tok.dname$ = "else" Then 'tok = getendstatement(tok) 'Return tok If tok.dname$ = "exit" Then Repeat tok = tok.After() If tok = Null Then Print "expecting end select" If SCRIPTDEBUG = True Then Notify "Expecting Endselect" EndIf Return Null EndIf Print "INSIDE DEFAULT NEXT TOKEN IS: "+tok.dname$ If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Until tok.dname$ = "endselect" And selectstates = 0 EndIf Else 'defaulted = True selectstates = 0 Repeat tok = tok.After() If tok = Null Then Print "expecting end select" If SCRIPTDEBUG = True Then Notify "Expecting endselect" EndIf Return Null EndIf If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Until tok.dname$ = "case" Or tok.dname$ = "default" Or tok.dname$ = "endselect" And selectstates = 0 EndIf Else Print "found variable now compare case" tempval$ = tok.dname$ If valcompare$ = tempval$ Then defaulted = False tok = tok.After() Repeat 'For tok:dtokens = EachIn dtokens_list Print tok.dname$+" object? " If tok = Null Then Return Null 'If tok2 <> Null And tok = tok2 Continue 'For com:commands = EachIn commands_list com = checkcommands:commands(tok.tokentype) If com <> Null Then tok = processcommands(tok:dtokens,com:commands) 'Exit EndIf If tok = Null Then Return Null If tok <> Null Then tok = tok.After() EndIf If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Print "INSIDE SELECT NEXT TOKEN IS :"+tok.dname$ Until tok.dname$ = "case" Or tok.dname$ = "exit" Or tok.dname$ = "default" Or tok.dname$ = "endselect" And selectstates = 0 'If tok.dname$ = "else" Then 'tok = getendstatement(tok) 'Return tok If tok.dname$ = "exit" Then Repeat tok = tok.After() If tok = Null Then Print "expecting end select" If SCRIPTDEBUG = True Then Notify "Expecting endselect" EndIf Return Null EndIf Print "INSIDE DEFAULT NEXT TOKEN IS: "+tok.dname$ If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Until tok.dname$ = "endselect" And selectstates = 0 EndIf Else 'defaulted = True selectstates = 0 Repeat tok = tok.After() If tok = Null Then Print "expecting end select" If SCRIPTDEBUG = True Then Notify "Expecting endselect" EndIf Return Null EndIf If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Until tok.dname$ = "case" Or tok.dname$ = "default" Or tok.dname$ = "endselect" And selectstates = 0 EndIf EndIf Case 17 Print "found default" hasdefaultstate = True deftok = tok selectstates = 0 Repeat tok = tok.After() If tok = Null Then 'Print "expecting end select" If SCRIPTDEBUG = True Then Notify "Expecting endselect" EndIf Return Null EndIf Print "INSIDE DEFAULT NEXT TOKEN IS: "+tok.dname$ If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Until tok.dname$ = "case" Or tok.dname$ = "default" Or tok.dname$ = "endselect" And selectstates = 0 If tok.dname$ = "default" Then Print "Select Cannot contain multiple Default Cases" If SCRIPTDEBUG = True Then Notify "Cannot have more than one Default in select statement~n Line:"+tok.line EndIf Return Null EndIf Case 18 Print "OK now im checking the default status here : "+defaulted If hasdefaultstate = True And defaulted = True Then If deftok = Null Then Print "unknown error occured in select statement" If SCRIPTDEBUG = True Then Notify "unknown error occured in select statement" EndIf Return Null EndIf oldtok = tok tok = deftok selectstates = 0 tok = tok.After() Repeat 'For tok:dtokens = EachIn dtokens_list Print tok.dname$+" object? " If tok = Null Then Return Null 'If tok2 <> Null And tok = tok2 Continue 'For com:commands = EachIn commands_list com = checkcommands:commands(tok.tokentype) If com <> Null Then tok = processcommands(tok:dtokens,com:commands) 'Exit EndIf If tok = Null Then Return Null If tok <> Null Then tok = tok.After() EndIf If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Until tok.dname$ = "case" Or tok.dname$ = "exit" Or tok.dname$ = "default" Or tok.dname$ = "endselect" And selectstates = 0 'If tok.dname$ = "else" Then 'tok = getendstatement(tok) tok = oldtok 'Return tok If tok.dname$ = "exit" Then Repeat tok = tok.After() If tok = Null Then Print "expecting end select" If SCRIPTDEBUG = True Then Notify "Expecting endselect" EndIf Return Null EndIf Print "INSIDE DEFAULT NEXT TOKEN IS: "+tok.dname$ If tok.dname$ = "select" Then selectstates = selectstates + 1 If tok.dname$ = "endselect" Then selectstates = selectstates - 1 If selectstates < 0 Then selectstates = 0 EndIf Until tok.dname$ = "endselect" And selectstates = 0 EndIf Else Print "wasnt default returning "+tok.dname$ Return tok EndIf Print "looks like it went through returning tok: "+tok.dname$ Return tok End Select Until tok = Null Print "unexpected end of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return Null End Function Function Printfunc:dtokens(tok:dtokens) tok = tok.After() Local dec:declare = finddeclaration:declare(tok) If dec = Null Then Print "just Print value" Print tok.dname$ 'tok = tok.After() Else Print dec.ddata$ EndIf Return tok End Function Function runfunction:dtokens(tok:dtokens) 'tok = tok.After() Print "and the magical function name is "+tok.dname$ Local dec:declare = finddeclaration:declare(tok) Local oldtok:dtokens,com:commands,scr:script oldtok = tok scr = tok.parentscrpt If dec = Null Then 'Print "Function does not exist" If SCRIPTDEBUG = True Then Notify "Function does not exist, Line:"+tok.line EndIf Return Null EndIf tok = invokefunctiontokens(dec) Repeat 'For tok:dtokens = EachIn dtokens_list Print tok.dname$+" object? " If tok = Null Then Return Null 'If tok2 <> Null And tok = tok2 Continue 'For com:commands = EachIn commands_list com = checkcommands:commands(tok.tokentype) If tok.dname$ = "return" Then tok = oldtok Return tok EndIf If com <> Null Then tok = processcommands(tok,com) 'Exit EndIf If tok <> Null Then tok = tok.After() EndIf Until tok = Null Or tok.parentscrpt <> scr tok = oldtok dismissfunctiontokens(dec) Print "end function returning next token "+tok.dname$ Return tok End Function Function dismissfunctiontokens(dec:declare) For tok:dtokens = EachIn dtokens_list If tok.parentfunction = dec And tok.parentscrpt = dec.parentscrpt Then dtokens_list.remove tok tok.Remove() EndIf Next End Function Function invokefunctiontokens:dtokens(dec:declare) Local firstok:dtokens,gotfirst=False For fok:ftokens = EachIn ftokens_list If fok.parentfunction = dec And fok.parentscrpt = dec.parentscrpt Then tok:dtokens = New dtokens tok.dname$ = fok.dname$ Print "adding function token "+tok.dname$ tok.index = fok.index tok.line = fok.line tok.tokentype = fok.tokentype tok.parentfunction = fok.parentfunction tok.parentscrpt = dec.parentscrpt If gotfirst = False Then firstok = tok gotfirst = True EndIf EndIf Next Return firstok End Function Function checktoken$(tok:dtokens) Print "checking token "+tok.dname$ If tok.parentscrpt = Null Then Print "This token has no parent script" EndIf Local olddec:declare Local dec:declare = finddeclaration:declare(tok) If dec = Null Then Print "Expecting variable Assignment" Return "" Else Print "found the variable of type "+dec.dtype$ Return dec.dtype$ EndIf End Function Function checkcommands:commands(data) Print "checking the commands" For com:commands = EachIn commands_list If data = com.commandtype Then Return com EndIf Next Return Null End Function Function checkspecificcommands:commands(data$) Print "checking the commands" For com:commands = EachIn commands_list If data$ = com.commandname$ Then Return com EndIf Next Return Null End Function Function runifstate:dtokens(tok:dtokens) Local olddec:declare,oldtok:dtokens,com:commands Local dec:declare,arg:arguement,foundcompare=False Local foundthen = False Repeat tok = tok.After() com = checkcommands(tok.tokentype) If com <> Null Then If com.commandtype = 0 Then com = Null EndIf If com = Null Then dec = finddeclaration:declare(tok) If dec = Null Then Print "Not a variable.. must be just an argument" arg = checkarg(tok.dname$) Else Print "found variable "+dec.dname$ arg:arguement = New arguement arg.arguementtype$ = dec.dtype$ arg.argvalue$ = dec.ddata$ EndIf Print "lets find the operator" tok = tok.After() Print "operator given is "+tok.dname$ check = validateoperator(tok.dname$) If check <> 0 Then arg.argnextoperator$ = tok.dname$ If check = 2 And foundcompare = False Then foundcompare = True Else If check = 2 And foundcompare = True Then Print "Expecting Command" If SCRIPTDEBUG = True Then Notify "Expecting command Line:"+tok.line EndIf Return Null EndIf Else com = checkcommands(tok.tokentype) If com <> Null Then If com.commandtype = 0 Then com = Null EndIf If com = Null Then Print "Expected Operator" If SCRIPTDEBUG = True Then Notify "Expecting operator Line:"+tok.line EndIf Return Null Else Print "looks as though we hit a command. lets back track one token" arg.argnextoperator$ = tok.dname$ tok = tok.Before() foundcompare = False EndIf EndIf Else Select com.commandtype Case 6 foundcompare = False Case 7 foundcompare = False Case 8 foundcompare = False foundthen = True Default Print "invalid command" If SCRIPTDEBUG = True Then Notify "Invalid command Line:"+tok.line EndIf Return Null End Select EndIf Until foundthen = True Print "found then" Print "lets see if the if statement is true" Print "Print all arguements" For arg:arguement = EachIn arguement_list Print "arguement: "+arg.arguementtype$+" value: "+arg.argvalue$+" next operator: "+arg.argnextoperator$ Next processarguments() ifboolean = processifbooleans() Print "if statement is "+ifboolean killbools() killargs() Select ifboolean Case False oldtok = tok tok = getelsestatement:dtokens(tok) If tok = Null Then tok = getendstatement(oldtok) Return tok Else tok = tok.After() Repeat 'For tok:dtokens = EachIn dtokens_list Print tok.dname$+" object? " If tok = Null Then Return Null 'If tok2 <> Null And tok = tok2 Continue 'For com:commands = EachIn commands_list com = checkcommands:commands(tok.tokentype) If com <> Null Then tok = processcommands(tok:dtokens,com:commands) 'Exit EndIf If tok <> Null Then tok = tok.After() EndIf Until tok.dname$ = "endif" Return tok EndIf Case True tok = tok.After() Repeat 'For tok:dtokens = EachIn dtokens_list Print tok.dname$+" object? " If tok = Null Then Return Null 'If tok2 <> Null And tok = tok2 Continue 'For com:commands = EachIn commands_list com = checkcommands:commands(tok.tokentype) If com <> Null Then tok = processcommands(tok:dtokens,com:commands) 'Exit EndIf If tok = Null Then Return Null If tok <> Null Then tok = tok.After() EndIf Until tok.dname$ = "endif" Or tok.dname$ = "else" If tok.dname$ = "else" Then Print "found else going to endif" tok = getendstatement(tok) Return tok EndIf End Select End Function Function getelsestatement:dtokens(tok:dtokens) Local statescount = 0 Repeat tok = tok.After() If tok = Null Then Print "unepected end of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return Null EndIf If tok.dname$ = "if" Then statescount = statescount + 1 If tok.dname$ = "endif" And statescount > 0 Then statescount = statescount - 1 If tok.dname$ = "endif" And statescount = 0 Then Return Null Until tok.dname$ = "else" And statescount = 0 End Function Function getendstatement:dtokens(tok:dtokens) Local statescount=0 Repeat tok = tok.After() If tok = Null Then Print "unexpected end of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return Null EndIf If tok.dname$ = "if" Then statescount = statescount + 1 If tok.dname$ = "endif" And statescount > 0 Then statescount = statescount - 1 Until tok.dname$ = "endif" And statescount = 0 Return tok End Function Function processarguments() Local arg:arguement,oldvalue$,oldvaluetype$,arguementbool=False Local nextoperator$,com:commands,narg:arguement arg = getarguement(arguement_list.First()) If arg = Null Then Print "I dont know how the hell it happened but i lost my arguements" If SCRIPTDEBUG = True Then Notify "Really, some weird way the error is my fault!" EndIf Return False EndIf oldvalue$ = arg.argvalue$ oldvaluetype$ = arg.arguementtype$ nextoperator$ = arg.argnextoperator$ Repeat nextoperator$ = arg.argnextoperator$ arg = arg.After() operationtype = validateoperator(nextoperator$) Select operationtype Case 1 Print "old value "+oldvalue$ oldvalue$ = mathoperation$(oldvalue$,arg.argvalue$,oldvaluetype$,arg.arguementtype$,nextoperator$) Print "new value "+oldvalue$ Case 2 Print "before bool argvalue is "+arg.argvalue$+" vs "+oldvalue$ arguementbool = booloperation(oldvalue$,arg.argvalue$,oldvaluetype$,arg.arguementtype$,nextoperator$) Print "bool "+arguementbool Default Print "may be an operative command" com = checkspecificcommands(nextoperator$) If com = Null Then Print "Somehow it got screwed up" Return False EndIf Print "Ok it is a command. now to see which one" Select com.commandtype Case 6 Print "found "+com.commandname$ ifo:ifbool = New ifbool ifo.bool = arguementbool ifo.boolexp = com.commandtype 'arg = arg.After() oldvalue$ = arg.argvalue$ oldvaluetype$ = arg.arguementtype$ Print "AFTER AND NEXT OPERATOR IS "+arg.argnextoperator$ Case 7 Print "found "+com.commandname$ ifo:ifbool = New ifbool ifo.bool = arguementbool ifo.boolexp = com.commandtype 'arg = arg.After() oldvalue$ = arg.argvalue$ oldvaluetype$ = arg.arguementtype$ Case 8 Print "found "+com.commandname$ ifo:ifbool = New ifbool ifo.bool = arguementbool ifo.boolexp = com.commandtype arg = Null Default Print "invalid expression in if statement" Return False Exit End Select End Select Until arg = Null End Function Function killargs() For arg:arguement = EachIn arguement_list arguement_list.remove arg arg.Remove() Next End Function Function killbools() For ifo:ifbool = EachIn ifbool_list ifbool_list.remove ifo ifo.Remove() Next End Function Function processifbooleans() Local ifo:ifbool,locbool=True Local oldifo:ifbool ifo = getifbool(ifbool_list.First()) If ifo = Null Then Print "Oh man this must be Stupid to lose the booleans" Return False EndIf oldifo = ifo If oldifo.bool = False Then locbool = False Repeat oldifo = ifo ifo = ifo.After() If ifo = Null Then Return locbool If ifo <> Null Then Select oldifo.boolexp Case 6 If ifo.bool = False locbool = False Case 7 If ifo.bool = True locbool = True Case 8 Return locbool Default Print "Expecting Expression" Return False End Select EndIf Until oldifo.boolexp = 8 Return locbool End Function Function booloperation(destvar$,sourcevar$,desttype$,sourcetype$,operator$) Select operator$ Case "=" Select desttype$ Case "string" Select sourcetype$ Case "string" If destvar$ = sourcevar$ Then Return True Else Return False EndIf Case "int" If destvar$ = sourcevar$ Then Return True Else Return False EndIf Case "float" If destvar$ = sourcevar$ Then Return True Else Return False EndIf Default Return False End Select Case "int" Select sourcetype$ Case "string" If destvar$ = sourcevar$ Then Return True Else Return False EndIf Case "int" If Int(destvar$) = Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) = Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "float" Select sourcetype$ Case "string" If destvar$ = sourcevar$ Then Return True Else Return False EndIf Case "int" If Float(destvar$) = Float(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) = Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Default Return False End Select Case ">" Select desttype$ Case "string" Select sourcetype$ Case "string" If Len(destvar$) > Len(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) > Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) > Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "int" Select sourcetype$ Case "string" If Int(destvar$) > Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) > Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) > Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "float" Select sourcetype$ Case "string" If Int(destvar$) > Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Float(destvar$) > Float(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) > Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Default Return False End Select Case ">=" Select desttype$ Case "string" Select sourcetype$ Case "string" If Len(destvar$) >= Len(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) >= Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) >= Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "int" Select sourcetype$ Case "string" If Int(destvar$) >= Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) >= Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) >= Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "float" Select sourcetype$ Case "string" If Int(destvar$) >= Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Float(destvar$) >= Float(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) >= Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Default Return False End Select Case "<" Select desttype$ Case "string" Select sourcetype$ Case "string" If Len(destvar$) < Len(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) < Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) < Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "int" Select sourcetype$ Case "string" If Int(destvar$) < Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) < Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) < Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "float" Select sourcetype$ Case "string" If Int(destvar$) < Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Float(destvar$) < Float(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) < Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Default Return False End Select Case "<=" Select desttype$ Case "string" Select sourcetype$ Case "string" If Len(destvar$) <= Len(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) <= Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <= Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "int" Select sourcetype$ Case "string" If Int(destvar$) <= Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) <= Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <= Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "float" Select sourcetype$ Case "string" If Int(destvar$) <= Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Float(destvar$) <= Float(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <= Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Default Return False End Select Case "<>" Select desttype$ Case "string" Select sourcetype$ Case "string" If Len(destvar$) <> Len(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) <> Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <> Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "int" Select sourcetype$ Case "string" If Int(destvar$) <> Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) <> Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <> Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "float" Select sourcetype$ Case "string" If Int(destvar$) <> Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Float(destvar$) <> Float(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <> Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Default Return False End Select Case "><" Select desttype$ Case "string" Select sourcetype$ Case "string" If Len(destvar$) <> Len(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) <> Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <> Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "int" Select sourcetype$ Case "string" If Int(destvar$) <> Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Int(destvar$) <> Int(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <> Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Case "float" Select sourcetype$ Case "string" If Int(destvar$) <> Int(sourcevar$) Then Return True Else Return False EndIf Case "int" If Float(destvar$) <> Float(sourcevar$) Then Return True Else Return False EndIf Case "float" If Float(destvar$) <> Float(sourcevar$) Then Return True Else Return False EndIf Default Return False End Select Default Return False End Select Default Return False End Select End Function Function mathoperation$(destvar$,sourcevar$,desttype$,sourcetype$,operator$) Select operator$ Case "+" Select sourcetype$ Case "string" Select desttype$ Case "string" destvar$ = destvar$ + sourcevar$ Return destvar$ Case "int" destvar$ = destvar$ + sourcevar$ Return destvar$ Case "float" destvar$ = destvar$ + sourcevar$ Return destvar$ Default Return "" End Select Case "int" Select desttype$ Case "string" destvar$ = destvar$ + Int(sourcevar$) Return destvar$ Case "int" destvar$ = Int(destvar$) + Int(sourcevar$) Return destvar$ Case "float" destvar$ = Float(destvar$) + Int(sourcevar$) Return destvar$ Default Return "" End Select Case "float" Select desttype$ Case "string" destvar$ = destvar$ + Float(sourcevar$) Return destvar$ Case "int" destvar$ = Int(destvar$) + Float(sourcevar$) Return destvar$ Case "float" destvar$ = Float(destvar$) + Float(sourcevar$) Return destvar$ Default Return "" End Select Default Return "" End Select Case "-" Select sourcetype$ Case "string" Select desttype$ Case "string" destvar$ = Replace(destvar$,sourcevar$,1) Return destvar$ Case "int" destvar$ = Replace(destvar$,sourcevar$,1) Return destvar$ Case "float" destvar$ = Replace(destvar$,sourcevar$,1) Return destvar$ Default Return "" End Select Case "int" Select desttype$ Case "string" destvar$ = Replace(destvar$,sourcevar$,1) Return destvar$ Case "int" destvar$ = Int(destvar$) - Int(sourcevar$) Return destvar$ Case "float" destvar$ = Float(destvar$) - Int(sourcevar$) Return destvar$ Default Return "" End Select Case "float" Select desttype$ Case "string" destvar$ = Replace(destvar$,sourcevar$,1) Return destvar$ Case "int" destvar$ = Int(destvar$) - Float(sourcevar$) Return destvar$ Case "float" destvar$ = Float(destvar$) - Float(sourcevar$) Return destvar$ Default Return "" End Select Default Return "" End Select Case "/" Select sourcetype$ Case "string" Select desttype$ Case "string" Return destvar$ Case "int" Return destvar$ Case "float" Return destvar$ Default Return "" End Select Case "int" Select desttype$ Case "string" Return destvar$ Case "int" destvar$ = Int(destvar$) / Int(sourcevar$) Return destvar$ Case "float" destvar$ = Float(destvar$) / Int(sourcevar$) Return destvar$ Default Return "" End Select Case "float" Select desttype$ Case "string" Return destvar$ Case "int" destvar$ = Int(destvar$) / Float(sourcevar$) Return destvar$ Case "float" destvar$ = Float(destvar$) / Float(sourcevar$) Return destvar$ Default Return "" End Select Default Return "" End Select Case "*" Select sourcetype$ Case "string" Select desttype$ Case "string" Return destvar$ Case "int" Return destvar$ Case "float" Return destvar$ Default Return "" End Select Case "int" Select desttype$ Case "string" Return destvar$ Case "int" destvar$ = Int(destvar$) * Int(sourcevar$) Return destvar$ Case "float" destvar$ = Float(destvar$) * Int(sourcevar$) Return destvar$ Default Return "" End Select Case "float" Select desttype$ Case "string" Return destvar$ Case "int" destvar$ = Int(destvar$) * Float(sourcevar$) Return destvar$ Case "float" destvar$ = Float(destvar$) * Float(sourcevar$) Return destvar$ Default Return "" End Select Default Return "" End Select Default Return "" End Select EndFunction Function validateoperator(data$) Local validated = False Local expect = 0 If Instr(OPERATORS$,data$,1) <> 0 Then Select data$ Case "=" Return 2 Case ">" Return 2 Case ">=" Return 2 Case "<" Return 2 Case "<=" Return 2 Case "<>" Return 2 Case "><" Return 2 Default Return 1 End Select Else Return 0 EndIf End Function Function checkarg:arguement(data$) If Instr(data$,"'",1) <> 0 Then arg:arguement = New arguement arg.arguementtype$ = "string" arg.argvalue$ = Replace(data$,"'","") Return arg EndIf If Instr(data$,".",1) <> 0 Then arg:arguement = New arguement arg.arguementtype$ = "float" arg.argvalue$ = data$ Return arg EndIf arg:arguement = New arguement arg.arguementtype$ = "int" arg.argvalue$ = data$ Return arg End Function Function assignvar:dtokens(tok:dtokens) Local olddec:declare,oldtok:dtokens,com:commands Local dec:declare = finddeclaration:declare(tok) oldtok = tok Print "assinging var data to "+tok.dname$ tok = tok.After() If tok = Null Then Print "may possibly be just a function" If dec.dtype$ = "function" Then Print "found function running script" tok = tok.Before() tok = runfunction(tok) Return tok Else Print "Unexprected end of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return Null EndIf EndIf Print oldtok.dname$ Print "next field after "+oldtok.dname$+" is "+tok.dname$ If tok.dname$ = "=" Then Print "found =" olddec = dec Select olddec.dtype$ Case "int" Repeat tok = tok.After() If tok.line = oldtok.line Then Print "found integer next "+tok.dname$ Select tok.dname$ Case "+" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Int(olddec.ddata$)+Int(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Int(olddec.ddata$) + Int(callvariable$(tok)) tok = tok.After() tok = tok.After() Print olddec.dname$+" int = "+olddec.ddata$ End Select EndIf Else olddec.ddata$ = Int(olddec.ddata$)+Int(dec.ddata$) Print olddec.dname$+" int = "+olddec.ddata$ EndIf Case "-" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Int(olddec.ddata$)-Int(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Int(olddec.ddata$) - Int(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = Int(olddec.ddata$)-Int(dec.ddata$) EndIf Case "*" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Int(olddec.ddata$)*Int(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Int(olddec.ddata$) * Int(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = Int(olddec.ddata$)*Int(dec.ddata$) EndIf Case "/" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Int(olddec.ddata$)/Int(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Int(olddec.ddata$) / Int(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = Int(olddec.ddata$)/Int(dec.ddata$) EndIf Default Print "found numerical expression of "+tok.dname$ dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Int(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Int(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Print olddec.dname$+" int = "+olddec.ddata$ Else olddec.ddata$ = Int(dec.ddata$) Print olddec.dname$+" int = "+olddec.ddata$ EndIf End Select EndIf Until tok.line > oldtok.line Case "float" Repeat tok = tok.After() If tok.line = oldtok.line Then Select tok.dname$ Case "+" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Float(olddec.ddata$)+Float(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Float(olddec.ddata$) + Float(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = Float(olddec.ddata$)+Float(dec.ddata$) EndIf Case "-" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Float(olddec.ddata$)-Float(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Float(olddec.ddata$) - Float(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = Float(olddec.ddata$)-Float(dec.ddata$) EndIf Case "*" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Float(olddec.ddata$)*Float(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Float(olddec.ddata$) * Float(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = Float(olddec.ddata$)*Float(dec.ddata$) EndIf Case "/" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Float(olddec.ddata$)/Float(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Float(olddec.ddata$) / Float(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = Float(olddec.ddata$)/Float(dec.ddata$) EndIf Default dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = Int(tok.dname$) Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = Int(callvariable$(tok)) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = Float(dec.ddata$) EndIf End Select EndIf Until tok.line > oldtok.line Case "string" Print "assinging string data to "+olddec.dname$ Repeat tok = tok.After() Print tok.dname$+" line is "+tok.line+" "+oldtok.dname$+" line is "+oldtok.line If tok.line = oldtok.line Then Select tok.dname$ Case "+" tok = tok.After() dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = olddec.ddata$ + tok.dname$ Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = olddec.ddata$ + callvariable$(tok) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = olddec.ddata$+dec.ddata$ EndIf olddec.ddata$ = Replace(olddec.ddata$,"'","") Default dec = finddeclaration:declare(tok) If dec = Null Then com = checkcommands(tok.tokentype) If com <> Null Then Select com.commandtype Case 0 olddec.ddata$ = tok.dname$ Print olddec.dname$+" int = "+olddec.ddata$ Case 25 olddec.ddata$ = callvariable$(tok) Print olddec.dname$+" int = "+olddec.ddata$ tok = tok.After() tok = tok.After() End Select EndIf Else olddec.ddata$ = dec.ddata$ EndIf olddec.ddata$ = Replace(olddec.ddata$,"'","") Print olddec.ddata$ End Select EndIf Until tok.line > oldtok.line End Select Print "next item is "+tok.dname$ Return tok.Before() Else If dec.dtype$ = "function" Then Print "found function running script" tok = tok.Before() tok = runfunction(tok) Return tok Else Print "expecting operator" If SCRIPTDEBUG = True Then Notify "Expecting operator Line:"+tok.line EndIf Return Null EndIf EndIf End Function Function declarevar:dtokens(tok:dtokens) Local oldtok:dtokens dec:declare = New declare tok = tok.After() If tok = Null Then Print "Expecting VAR type" If SCRIPTDEBUG = True Then Notify "Expecting Var type" EndIf Return Null EndIf dec.dtype$ = tok.dname$ dec.parentscrpt = tok.parentscrpt tok = tok.After() If tok = Null Then Print "Expecting Var Name" If SCRIPTDEBUG = True Then Notify "Expecting Var name" EndIf Return EndIf dec.dname$ = tok.dname$ oldtok = tok If dec.dtype$ = "function" Then addfunctiontokens(dec,tok) Print "added new function "+dec.dname$ EndIf Print "Found Variable type "+dec.dtype$+" var name "+dec.dname$ Return tok End Function Function addfunctiontokens(dec:declare,tok:dtokens) Local fok:ftokens Local killtok:dtokens tok = findfunction(dec,tok) killtok = tok tok = tok.After() Print "about to kill token "+killtok.dname$ dtokens_list.remove killtok killtok.Remove() dtokens_list.remove killtok Repeat fok:ftokens = New ftokens fok.dname$ = tok.dname$ fok.index = tok.index fok.line = tok.line fok.tokentype = tok.tokentype fok.parentfunction = dec fok.parentscrpt = tok.parentscrpt killtok = tok tok = tok.After() Print "about to kill token "+killtok.dname$ dtokens_list.remove killtok killtok.Remove() If tok = Null Then Print "unexpected end of file" If SCRIPTDEBUG = True Then Notify "Unexpected end of file" EndIf Return EndIf Until tok.dname$ = "endfunction" dtokens_list.remove tok tok.Remove() End Function Function findfunction:dtokens(dec:declare,tok:dtokens) Local foundfunc = False Local killtok:dtokens Repeat tok = tok.After() If tok.dname$ = "function" Then tok = tok.After() If tok.dname$ = dec.dname$ Then killtok = tok.Before() dtokens_list.remove killtok killtok.Remove() Return tok EndIf EndIf Until tok = Null Return Null End Function Function tokenizescript(scriptname$="myscript",shandle$="QWERTYUIOP",scriptfile$="script.txt") Local templine$,toffset,temptoken$ Local Stream:TStream = OpenFile(scriptfile$) Local index = 0,gotstring = False,gotendstring = False Local line = 0 scr:script = New script scr.scriptname$ = scriptname$ scr.scripthandle$ = shandle$ While Not Eof(Stream) templine$ = ReadLine(Stream) line = line + 1 Print "line: "+line 'Print "len: "+Len(templine$) For tempfor = 1 To Len(templine$) 'Print tempfor If Mid$( templine$,tempfor,1 ) = "'" Then If gotstring = False Then gotstring = True Else gotstring = False gotendstring = True EndIf EndIf If gotstring = False If Mid$( templine$,tempfor,1 ) <> " " And tempfor <> Len(templine$) And gotendstring = False Then temptoken$ = temptoken$ + Mid$( templine$,tempfor,1 ) Else temptoken$ = temptoken$ + Mid$( templine$,tempfor,1 ) tok:dtokens = New dtokens tok.dname$ = Trim(temptoken$) tok.index = index tok.line = line tok.parentscrpt = scr If tok.parentscrpt = Null Then Print "Uh oh this has no parent script" End EndIf index = index + 1 For com:commands = EachIn commands_list If Lower(tok.dname$) = Lower(com.commandname$) Then tok.tokentype = com.commandtype EndIf Next tok.index = index index = index + 1 temptoken$ = "" gotendstring = False EndIf Else temptoken$ = temptoken$ + Mid$( templine$,tempfor,1 ) EndIf Next Wend CloseFile(Stream) For tok:dtokens = EachIn dtokens_list Print tok.dname$ Next End Function Function tokenizescriptin$(scr:script,viewing=True) Local templine$,toffset,temptoken$ 'Local Stream:TStream = OpenFile(scriptfile$) Local index = 0,gotstring = False,gotendstring = False Local line = 0 'scr:script = New script 'scr.scriptname$ = scriptname$ 'scr.scripthandle$ = shandle$ 'While Not Eof(Stream) templine$ = scr.scriptdata$ line = line + 1 Print "line: "+line 'Print "len: "+Len(templine$) For tempfor = 1 To Len(templine$) 'Print tempfor If Mid$( templine$,tempfor,1 ) = "'" Then If gotstring = False Then gotstring = True Else gotstring = False gotendstring = True EndIf EndIf If gotstring = False If Mid$( templine$,tempfor,1 ) <> " " And tempfor <> Len(templine$) And gotendstring = False And Mid$( templine$,tempfor,2 ) <> "~n" Then temptoken$ = temptoken$ + Mid$( templine$,tempfor,1 ) 'Print "char - "+Mid$( templine$,tempfor,1 ) Else temptoken$ = temptoken$ + Mid$( templine$,tempfor,1 ) tok:dtokens = New dtokens tok.dname$ = Trim(temptoken$) Print tok.dname$ tok.index = index tok.line = line tok.parentscrpt = scr If Mid$( templine$,tempfor,2 ) = "~n" Then line = line + 1 If tok.parentscrpt = Null Then Print "Uh oh this has no parent script" End EndIf index = index + 1 For com:commands = EachIn commands_list If Lower(tok.dname$) = Lower(com.commandname$) Then tok.tokentype = com.commandtype 'Select com.commandtype 'Case 0 'Replace(scriptdata$,tok.dname$,"\cf4 "+tok.dname$) 'Default 'Replace(scriptdata$,tok.dname$,"\cf3 "+tok.dname$) 'End Select EndIf Next tok.index = index index = index + 1 temptoken$ = "" gotendstring = False EndIf Else temptoken$ = temptoken$ + Mid$( templine$,tempfor,1 ) EndIf Next 'Wend 'CloseFile(Stream) For tok:dtokens = EachIn dtokens_list Print tok.dname$ Next 'scriptdata$ = "{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}"+"{\colortbl ;\red0\green0\blue255;\red0\green255\blue0;\red255\green255\blue0;\red0\green0\blue0;}"+scriptdata$ Return scriptdata$ End Function Function loadcommands() Local tempfor,templine$,temptoken$ Local Stream:TStream = OpenFile("commands.txt") While Not Eof(Stream) templine$ = ReadLine(Stream) For tempfor = 1 To Len(templine$) If Mid$( templine$,tempfor,1 ) <> " " Then temptoken$ = temptoken$ + Mid$( templine$,tempfor,1 ) 'Print temptoken$ Else 'temptoken$ = temptoken$ + Mid$( templine$,tempfor,1 ) com:commands = New commands com.commandtype = Int(temptoken$) com.commandname$ = Trim(Replace(templine$,temptoken$,"")) 'Print com.commandtype Print com.commandname$ temptoken$ = "" Exit EndIf Next Wend CloseFile(Stream) End Function Function finddeclaration:declare(tok:dtokens) Local foundit = False For dec:declare = EachIn declare_list If dec.dname$ = tok.dname$ And tok.parentscrpt = dec.parentscrpt Then Return dec foundit = True EndIf Next Return Null End Function Function colorizescript(listgadget:TGadget) Local com:commands,tok:dtokens,abool:Int,aboolcursor Local keyword:String,myword:String Local textlen:Int,cursorpos:Int For com:commands = EachIn commands_list If com.commandtype <> 0 Then keyword = keyword + com.commandname$+"|" EndIf Next Print "COMMANDS ARE :"+keyword textlen = TextAreaLen( listgadget ) Print "length of text is "+textlen cursorpos = 0 For tempfor = 0 To textlen 'If abool = False If TextAreaText(listgadget,tempfor,1) <> " " And Instr(TextAreaText(listgadget,tempfor,1),"~n") = 0 Then 'If Instr(TextAreaText(listgadget,tempfor,1),"~n") <> 0 Then Print "FOUND SPACER at "+myword myword = myword + TextAreaText(listgadget,tempfor,1) 'EndIf If TextAreaText(listgadget,tempfor,1) = "'" And abool = False Then abool = True 'myword = "" aboolcursor = tempfor Else If TextAreaText(lis |
Comments
| ||
it might runa bit faster if you comment out all the print commands except whats in the printfunc function |
| ||
Does this work in Blitz3D? Would it require massive rewrite? |
| ||
ya it would require a fairly large rewrite. im guessing if you replace the eachin and the obj.Next() with some other function that can grab the next item in the list. I can try rewriting it for B3d and posting it in here. |
| ||
Seems this deed is done! Great job. |
| ||
.. Else If TextAreaText(lisYour code was cut off because it was too long. Also, you didn't mention it needs the bbtype.bmx and bbvkey.bmx files for Blitz legacy support. |
Code Archives Forum