Tulostaa QBasic-tiedoston sisällön syntaksiväritettynä. Värit täysin määriteltävissä.
'****************************************************************************
'**
'** Syntaksivärittäjä
'**
'** Ulostaa annetun BASIC-tiedoston sisällön syntaksiväritettynä
'**
'** Varattujen sanojen lista ei taida olla läheskään täydellinen,
'** eli sinne voi lisäillä sanoja, joita huomaa sieltä puuttuvan
'**
'** Kohtuu pienellä vaivalla saat liitettyä tämän vaikka omaan
'** tekstieditoriisi tjsp. jos kiinnostaa.
'**
'** Aliohjelmista/funktioista:
'**
'** Is<jotain> näitä käytetään syötteen luokitteluun.
'** esim. IsBracket(merkki$) palauttaa <> 0,
'** jos merkki$ on kaarisulku ( tai )
'**
'** SyntaxPrint tulostaan yhden rivin väritettynä
'** (tai useamman, jos rivi sisältää useampia
'** rivejä kaksoispisteellä eroteltuna)
'**
'****************************************************************************
DECLARE FUNCTION Attr% (f%, b%)
DECLARE FUNCTION IsBracket% (c$)
DECLARE FUNCTION IsAlpha% (c$)
DECLARE FUNCTION IsAlphaNum% (c$)
DECLARE FUNCTION IsSpace% (c$)
DECLARE SUB SyntaxPrint (t$)
DECLARE FUNCTION VariableType% (c$)
DECLARE FUNCTION IsKeyword% (c$)
DECLARE FUNCTION IsDigit% (c$)
DECLARE FUNCTION IsHexDigit% (c$)
DECLARE FUNCTION IsOperator% (c$)
DECLARE FUNCTION IsDelim% (c$)
' sisällön luokittelua varten
CONST TTINVALID = 0
CONST TTWHITESPACE = 10, TTKEYWORD = 11, TTVARIABLE = 12
CONST TTSTRING = 20
CONST TTHEX = 30, TTSHORTINT = 31, TTLONGINT = 32, TTFLOAT = 33, TTDOUBLE = 34, TTOCTAL = 35
CONST TTOPERATOR = 40, TTBRACKET = 41, TTCOMMENT = 42, TTDELIM = 43, TTLAST = 44
' tulostetaanko tietyn tyyppinen muuttuja tietyllä värillä,
' vai kaikki muuttujat samalla värillä?
CONST VarColorByType% = 1
DIM SHARED SyntaxColor%(TTINVALID TO TTLAST)
' näitä voi vaihdella mieleisekseen, oletuksena hieman BC++3.11 tyyliset
' värit.
CONST DefBg% = &H10 ' oletustaustaväri, sininen tausta
' väri ylemmät 4 bittiä ovat taustalle, alemmat 4 tekstille
' vari = (tausta AND 15) * 16 + (teksti AND 15)
' tai heksana: esim. &H26 on taustaväri 2, tekstinväri 6
SyntaxColor%(TTINVALID) = DefBg% OR 0
SyntaxColor%(TTWHITESPACE) = DefBg% OR 0
SyntaxColor%(TTKEYWORD) = DefBg% OR 15
SyntaxColor%(TTVARIABLE) = DefBg% OR 14
SyntaxColor%(TTSTRING) = DefBg% OR 10
SyntaxColor%(TTHEX) = DefBg% OR 10
SyntaxColor%(TTOCTAL) = DefBg% OR 12
SyntaxColor%(TTSHORTINT) = DefBg% OR 11
SyntaxColor%(TTLONGINT) = DefBg% OR 11
SyntaxColor%(TTFLOAT) = DefBg% OR 13
SyntaxColor%(TTDOUBLE) = DefBg% OR 13
SyntaxColor%(TTOPERATOR) = DefBg% OR 15
SyntaxColor%(TTBRACKET) = DefBg% OR 15
SyntaxColor%(TTCOMMENT) = DefBg% OR 7
SyntaxColor%(TTDELIM) = DefBg% OR 15
DIM SHARED KW$
' varatut sanat. tästä puuttuu ainaki muutamia. ehkä paljon. evt, evkpk.
KW$ = ""
KW$ = KW$ + "/DATA/DO/LOOP/END/EXIT/FOR/NEXT/IF"
KW$ = KW$ + "/THEN/ELSE/GOSUB/RETURN/GOTO/GOTO"
KW$ = KW$ + "/SELECT/CASE/STOP/SYSTEM/CONST/DIM"
KW$ = KW$ + "/DATA/ERASE/OPTION/BASE/READ/REDIM"
KW$ = KW$ + "/REM/RESTORE/SWAP/TYPE/CALL/DECLARE"
KW$ = KW$ + "/EXIT/FUNCTION/RUN/SHELL/SHARED/STATIC"
KW$ = KW$ + "/SUB/CLS/CSRLIN/INKEY$/INP/KEY/LINE/INPUT"
KW$ = KW$ + "/LOCATE/LPOS/LPRINT/USING/COM/OUTPOS/PRINT"
KW$ = KW$ + "/SPC/SCREEN/TAB/VIEW/WAIT/WIDTH/CIRCLE"
KW$ = KW$ + "/COLOR/GET/PAINT/PALETTE/PCOPY/PMAP/POINT"
KW$ = KW$ + "/PRESET/PSET/WINDOW/CHDIR/KILL/MKDIR/NAME"
KW$ = KW$ + "/RMDIR/CLOSE/EOF/FILEATTR/FREEFILE/INPUT$"
KW$ = KW$ + "/LOC/LOCK/LOF/OPEN/PUT/SEEK/UNLOCK"
KW$ = KW$ + "/WRITE/CLEAR/FRE/PEEK/POKE/ASC/CHR$/HEX$"
KW$ = KW$ + "/INSTR/LCASE$/LEFT$/LEN/LSET/LTRIM$/MID$"
KW$ = KW$ + "/OCT$/RIGHT$/RSET/RTRIM$/SPACE$/STR$"
KW$ = KW$ + "/STRING$/UCASE$/VAL/ABS/ASC/ATN/CDBL/CINT"
KW$ = KW$ + "/CLNG/COS/CSNG/CVDMBF/CVSMBF/EXP"
KW$ = KW$ + "/INT/LOG/RANDOMIZE/RND/SGN/SIN/SQR/TAN"
KW$ = KW$ + "/TIME$/COM/ERDEV/ERDEV$/ERL/ERR/ERROR"
KW$ = KW$ + "/KEY/ON/KEY/PEN/PLAY/STRIG/TIMER"
KW$ = KW$ + "/RESUME/RETURN/WEND/ELSEIF/AND/OR/WHILE/"
KW$ = KW$ + "/MOD/EQV/XOR/NOT/IMP/ENVIRON$/ENVIRON/"
CLOSE
' tähän voipi itse määritellä tiedoston nimen
CONST BASFilename$ = "SYNPRINT.BAS"
n% = FREEFILE
OPEN BASFilename$ FOR INPUT AS #n%
l% = 0
WHILE NOT EOF(n%)
LINE INPUT #n%, K$
CALL SyntaxPrint(LEFT$(K$ + SPACE$(80), 73))
PRINT
l% = l% + 1
IF ((l% MOD 24) = 0) THEN
COLOR 0, 6
PRINT "-- LISSŽŽ --";
i$ = ""
WHILE i$ = "": i$ = INKEY$: WEND
LOCATE CSRLIN, 1: PRINT " ";
LOCATE CSRLIN, 1
END IF
WEND
CLOSE #n%
FUNCTION IsAlpha% (c$)
IsAlpha% = (c$ >= "a" AND c$ <= "z") OR (c$ >= "A" AND c$ <= "Z")
END FUNCTION
FUNCTION IsAlphaNum% (c$)
IsAlphaNum% = IsAlpha%(c$) OR IsDigit%(c$)
END FUNCTION
FUNCTION IsBracket% (c$)
IsBracket% = (c$ = "(") OR (c$ = ")")
END FUNCTION
FUNCTION IsDelim% (c$)
IsDelim% = (c$ = ".") OR (c$ = ",") OR (c$ = ":") OR (c$ = ";") OR (c$ = "#")
END FUNCTION
FUNCTION IsDigit% (c$)
IsDigit% = (c$ >= "0" AND c$ <= "9")
END FUNCTION
FUNCTION IsHexDigit% (c$)
IsHexDigit% = IsDigit%(c$) OR (c$ >= "A" AND c$ <= "F") OR (c$ >= "a" AND c$ <= "f")
END FUNCTION
FUNCTION IsKeyword% (c$)
IsKeyword% = INSTR(KW$, "/" + UCASE$(c$) + "/") > 0
END FUNCTION
FUNCTION IsOperator% (c$)
IsOperator% = INSTR("+-/\*^<>=", c$) > 0
END FUNCTION
FUNCTION IsSpace% (c$)
IsSpace% = (c$ = " ") OR (c$ = CHR$(9))
END FUNCTION
SUB SyntaxPrint (t$)
Length% = LEN(t$)
StartPos% = 1
EndPos% = 1
TokenType% = 0
WHILE (EndPos% <= Length%)
IF (IsSpace%(MID$(t$, EndPos%, 1))) THEN ' tyhjyydet
EndPos% = EndPos% + 1
WHILE (EndPos% <= Length%) AND (IsSpace%(MID$(t$, EndPos%, 1)))
EndPos% = EndPos% + 1
WEND
TokenType% = TTWHITESPACE
ELSEIF (IsAlpha%(MID$(t$, EndPos%, 1))) THEN ' muuttujat/käskyt
EndPos% = EndPos% + 1
WHILE (EndPos% <= Length%) AND (IsAlphaNum%(MID$(t$, EndPos%, 1)))
EndPos% = EndPos% + 1
WEND
TokenType% = TTVARIABLE
IF (EndPos% <= Length%) THEN ' muuttujan tyyppi
V% = VariableType%(MID$(t$, EndPos%, 1))
IF (V% <> TTVARIABLE) THEN EndPos% = EndPos% + 1
IF (VarColorByType%) THEN TokenType% = V%
END IF
' tarkista vielä, onko varattu sana
IF (IsKeyword%(MID$(t$, StartPos%, EndPos% - StartPos%))) THEN TokenType% = TTKEYWORD
ELSEIF (IsDigit%(MID$(t$, EndPos%, 1))) THEN '
EndPos% = EndPos% + 1
WHILE (EndPos% <= Length%) AND (IsDigit%(MID$(t$, EndPos%, 1)))
EndPos% = EndPos% + 1
WEND
TokenType% = TTFLOAT
IF (EndPos% <= Length%) AND (MID$(t$, EndPos%, 1) = ".") THEN
EndPos% = EndPos% + 1
WHILE (EndPos% <= Length%) AND (IsDigit%(MID$(t$, EndPos%, 1)))
EndPos% = EndPos% + 1
WEND
END IF
IF (EndPos% <= Length%) THEN ' muuttujan tyyppi
V% = VariableType%(MID$(t$, EndPos%, 1))
IF (V% <> TTVARIABLE) THEN
EndPos% = EndPos% + 1
TokenType% = V%
END IF
END IF
ELSEIF MID$(t$, EndPos%, 1) = CHR$(34) THEN
EndPos% = EndPos% + 1 '
WHILE (EndPos% <= Length%) AND (MID$(t$, EndPos%, 1) <> CHR$(34))
EndPos% = EndPos% + 1
WEND
EndPos% = EndPos% + 1 '
TokenType% = TTSTRING
ELSEIF MID$(t$, EndPos%, 1) = "'" THEN
TokenType% = TTCOMMENT
EndPos% = Length% + 1
ELSEIF IsOperator%(MID$(t$, EndPos%, 1)) THEN
EndPos% = EndPos% + 1
TokenType% = TTOPERATOR
ELSEIF IsDelim%(MID$(t$, EndPos%, 1)) THEN
EndPos% = EndPos% + 1
TokenType% = TTDELIM
ELSEIF IsBracket%(MID$(t$, EndPos%, 1)) THEN
EndPos% = EndPos% + 1
TokenType% = TTBRACKET
ELSEIF MID$(t$, EndPos%, 1) = "&" THEN
EndPos% = EndPos% + 1
IF (EndPos% <= Length%) THEN
SELECT CASE UCASE$(MID$(t$, EndPos%, 1))
CASE "O":
EndPos% = EndPos% + 1
TokenType% = TTOCTAL
WHILE (EndPos% <= Length%) AND (IsDigit%(MID$(t$, EndPos%, 1)))
EndPos% = EndPos% + 1
WEND
CASE "H":
EndPos% = EndPos% + 1
TokenType% = TTHEX
WHILE (EndPos% <= Length%) AND (IsHexDigit%(MID$(t$, EndPos%, 1)))
EndPos% = EndPos% + 1
WEND
END SELECT
ELSE
TokenType% = TTINVALID
END IF
ELSE
TokenType% = TTINVALID
EndPos% = EndPos% + 1
END IF
COLOR SyntaxColor%(TokenType%) AND &HF, (SyntaxColor%(TokenType%) AND &HF0) \ 16
PRINT MID$(t$, StartPos%, EndPos% - StartPos%);
StartPos% = EndPos%
WEND
END SUB
FUNCTION VariableType% (c$)
VariableType% = TTVARIABLE
IF (c$ = "$") THEN VariableType% = TTSTRING
IF (c$ = "!") THEN VariableType% = TTFLOAT
IF (c$ = "#") THEN VariableType% = TTDOUBLE
IF (c$ = "%") THEN VariableType% = TTSHORTINT
IF (c$ = "&") THEN VariableType% = TTLONGINT
END FUNCTIONookko sää tehny to?
Tottakai olen. Enkai sitä nyt muuten tänne postailis?
Tosi upea!!!
hieno!
ei huoh!!!
tää on niinku todella hieno
itse olen yrittäny jotain vastaavaa huonoilla tuloksilla
nytten voin vertailla että missä olen tehnyt virheen
ja tää tulee olemaan käytössä
kiitän!!!
Todella hyvä!
meni kolme kertaa toi yks kommentti ;\
hmm...mää en nyt saanut pelittämään tätä :-/
Jos nyt tällä kertaa jätän väliin, kun ei oo toistaseks tarvetta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.