Code archives/Miscellaneous/BlitzBeautifier
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This code uses the Blitz Lexer to parse an input file and create a new version with nice layout and spacing. At least it creates code that looks nice to me. It may not suit all tastes. Note also that if your code is already beautiful, it will probably uglify it. | |||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; BB.bb
;
; Blitz Beautifier -- reformats your Blitz program to look nice ... to me
;
; Steve Hill, 2003
;
; RESTRICTIONS
; + doesn't like If <cond> <statement> -- use If <cond> Then <statement>
;
; Versions
; 0.1 Initial version 27 Aug 2003
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Include "Lexer.bb"
Type TPState
Field indent
Field spacePending
Field indentPending
Field previousArithOp
Field thenFound
End Type
Function Tabs$(n)
Return String$(Chr$(TAB), n)
End Function
Function PrintEOL(out, pState.TPState)
pState\indentPending = True
WriteByte(out, CR)
WriteByte(out, LF)
End Function
Function PrintFile(out, s$, pState.TPState)
If pState\indentPending Then
s$ = Tabs$(pState\indent) + s$
pState\indentPending = False
pState\spacePending = False
EndIf
If pState\spacePending Then
s$ = " " + s$
EndIf
For i = 1 To Len(s$)
WriteByte(out, Asc(Mid$(s$, i, 1)))
Next
End Function
Function PrintWord(outFile, tok$, pState.TPState)
outdent = tok$ = "EndIf" Or tok$ = "Wend" Or tok$ = "Until"
outdent = outdent Or tok$ = "Next" Or tok$ = "End Type"
outdent = outdent Or tok$ = "End Select" Or tok$ = "Case" Or tok$ = "Default"
outdent = outdent Or tok$ = "ElseIf" Or tok$ = "Else"
If tok$ = "End Function" Or tok$ = "Function"
pState\indent = 0
ElseIf outdent
pState\indent = pState\indent - 1
If tok$ = "End Select" Then
pState\indent = pState\indent - 1
EndIf
If pState\indent < 0 Then
pState\indent = 0
EndIf
EndIf
PrintFile(outFile, tok$, pState)
pState\spacePending = True
indent = tok$ = "If" Or tok$ = "While" Or tok$ = "Repeat"
indent = indent Or tok$ = "For" Or tok$ = "Function" Or tok$ = "Type"
indent = indent Or tok$ = "Select" Or tok$ = "Case" Or tok$ = "Default"
indent = indent Or tok$ = "ElseIf" Or tok$ = "Else"
If indent Then
pState\indent = pState\indent + 1
If tok$ = "Select"
pState\indent = pState\indent + 1
EndIf
EndIf
End Function
Function PrintOperator(outFile, tok$, pState.TPState)
If tok$ = "(" Or tok$ = ")"
spaceBefore = pState\previousArithOp
Else
spaceBefore = Instr("[].$#%\,", tok$) = 0
EndIf
pState\spacePending = spaceBefore
PrintFile(outFile, tok$, pState)
; Special case for prefix + and -
If pState\previousArithOp And (tok$ = "+" Or tok$ = "-") Then
pState\spacePending = False
Else
spaceAfter = Instr("[()].$#%\", tok$) = 0
pState\spacePending = spaceAfter
EndIf
End Function
Function Parse(outFile)
state.TState = Last TState
pState.TPstate = New TPState
pState\indent = 0
pState\spacePending = False
pState\indentPending = False
pState\previousArithOp = False
pState\thenFound = False
While state\tok$ <> ""
tokType = state\tokType
tok$ = state\tok$
wasArithOp = False
wasComment = False
GetToken(state)
Select tokType
Case TOK_WORD
; Special case nasties
If tok$ = "End" Then
If state\tok$ = "Function" Or state\tok$ = "Type" Or state\tok$ = "Select" Then
tok$ = tok$ + " " + state\tok$
GetToken(state)
ElseIf state\tok$ = "If" Then
tok$ = "EndIf"
GetToken(state)
EndIf
ElseIf tok$ = "Else" And state\tok$ = "If" Then
tok$ = "ElseIf"
GetToken(state)
EndIf
PrintWord(outFile, tok$, pState)
Case TOK_OPERATOR
PrintOperator(outFile, tok$, pState)
wasArithOp = Instr("#%$.()", tok$) = 0
Case TOK_COMMENT
PrintFile(outFile, tok$, pState)
wasComment = True
Case TOK_DEC_NUMBER
PrintFile(outFile, tok$, pState)
pState\spacePending = True
Case TOK_HEX_NUMBER
PrintFile(outFile, tok$, pState)
pState\spacePending = True
Case TOK_BIN_NUMBER
PrintFile(outFile, tok$, pState)
pState\spacePending = True
Case TOK_STRING
PrintFile(outFile, tok$, pState)
pState\spacePending = True
Case TOK_EOL
pState\thenFound = False
PrintEOL(outFile, pState)
Case TOK_EOF
Default
PrintFile(outFile, tok$, pState)
End Select
pState\previousArithOp = wasArithOp
; HACK to try to cope with nasty if usage
If pState\thenFound And (Not wasComment) Then
pState\indent = pState\indent - 1
pState\thenFound = False
EndIf
If tok$ = "Then" Then
pState\thenFound = True
EndIf
Wend
Delete pState
End Function
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MAIN PROGRAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
inFile$ = Input$("Input file: ")
outFile$ = Input$("Output file (or return): ")
If outFile$ = ""
outFile$ = "Beautiful.bb"
EndIf
out = WriteFile(outFile$)
If out <> 0 Then
OpenState(inFile$)
Parse(out)
CloseState()
EndIf
Print "Done"
Print "Press a key"
WaitKey
End |
Comments
None.
Code Archives Forum