skywalk wrote:@Danilo, can you elaborate on your approach to parse the asm to build a table?
I would start with collecting informations from the ASM output:
- Find procedure macros
- Inside procedure macros, find: PB labels, Calls to other PB procedures, References to PB procedures
- Outside procedures, find: References to PB labels, Calls to PB procedures, References to PB procedures
Code: Select all
EnableExplicit
Procedure ProcessASM(inputFileName.s)
Protected inputFile
Protected currentLine$, trimmedLine$, currentLineNum
Protected inProcedure, currentProcedureName$, regExResultCount, i
Protected regExLabels, regExPBLabels, regExPBLabelsRef, regExProcedureLabels, regExProcedureCall, regExProcedureRef, regExProcedureMacroUsed
Protected Dim regExResult.s(0)
regExLabels = CreateRegularExpression(#PB_Any,"^( )*([a-z]|[A-Z]|[0-9]|_)+:.*",#PB_RegularExpression_NoCase) ; GENERAL LABELS
regExPBLabels = CreateRegularExpression(#PB_Any,"^( )*l_([a-z]|[A-Z]|[0-9]|_)+:.*",#PB_RegularExpression_NoCase) ; PB labels, starting with 'l_'
regExPBLabelsRef = CreateRegularExpression(#PB_Any,"^( )*l_([a-z]|[A-Z]|[0-9]|_)+.*",#PB_RegularExpression_NoCase) ; PB label reference, using 'l_'
regExProcedureLabels = CreateRegularExpression(#PB_Any,"^( )*_Procedure([0-9])+:.*",#PB_RegularExpression_NoCase) ; PB procedure labels, starting with '_Procedure'
regExProcedureCall = CreateRegularExpression(#PB_Any,"^.*CALL.*_Procedure([0-9])+.*",#PB_RegularExpression_NoCase) ; PB procedure call, using 'CALL _ProcedureXXX' labels
regExProcedureRef = CreateRegularExpression(#PB_Any,"^.*_Procedure([0-9])+.*",#PB_RegularExpression_NoCase) ; PB procedure reference, using '_ProcedureXXX' labels
regExProcedureMacroUsed = CreateRegularExpression(#PB_Any,"^( )*MP([0-9])+.*",#PB_RegularExpression_NoCase) ; PB procedure macro used, starting with 'MP'
inputFile = ReadFile(#PB_Any,inputFileName)
If inputFile = 0
Debug "File '"+inputFileName+"' not found."
ProcedureReturn
EndIf
currentProcedureName$ = "GLOBAL"
Protected stringFormat = ReadStringFormat(inputFile)
While Not Eof(inputFile)
currentLineNum + 1
currentLine$ = ReadString(inputFile,stringFormat)
trimmedLine$ = Trim(currentLine$)
If Left(trimmedLine$,8) = "macro MP"
Debug "(line: "+Str(currentLineNum)+") Found procedure macro: "+Right(trimmedLine$,Len(trimmedLine$)-6)
inProcedure = #True
ElseIf inProcedure = #True And Left(trimmedLine$,1) = "}"
Debug "(line: "+Str(currentLineNum)+") End procedure macro"
Debug ""
currentProcedureName$ = "GLOBAL"
inProcedure = #False
ElseIf inProcedure = #True
If MatchRegularExpression(regExProcedureLabels,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExProcedureLabels,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug " (line: "+Str(currentLineNum)+") Found PB procedure label inside procedure: "+regExResult(i)
currentProcedureName$ = Trim(Trim(regExResult(i),":"))
Debug " current Procedure is: "+currentProcedureName$
Next
EndIf
ElseIf MatchRegularExpression(regExPBLabels,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExPBLabels,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug " (line: "+Str(currentLineNum)+") Found PB label inside procedure: "+regExResult(i)
Next
EndIf
ElseIf MatchRegularExpression(regExLabels,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExLabels,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
;Debug " (line: "+Str(currentLineNum)+") Found label: "+regExResult(i)
Next
EndIf
ElseIf MatchRegularExpression(regExProcedureCall,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExProcedureCall,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug " (line: "+Str(currentLineNum)+") Found procedure call: "+regExResult(i)
Next
EndIf
ElseIf MatchRegularExpression(regExProcedureRef,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExProcedureRef,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug " (line: "+Str(currentLineNum)+") Found reference to procedure: "+regExResult(i)
Next
EndIf
ElseIf MatchRegularExpression(regExPBLabelsRef,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExPBLabelsRef,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug " (line: "+Str(currentLineNum)+") Found reference to PB label inside procedure: "+regExResult(i)
Next
EndIf
EndIf
Else
If MatchRegularExpression(regExProcedureCall,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExProcedureCall,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug "(line: "+Str(currentLineNum)+") Found procedure call: "+regExResult(i)
Next
EndIf
ElseIf MatchRegularExpression(regExProcedureRef,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExProcedureRef,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug "(line: "+Str(currentLineNum)+") Found reference to procedure: "+regExResult(i)
Next
EndIf
ElseIf MatchRegularExpression(regExPBLabelsRef,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExPBLabelsRef,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug "(line: "+Str(currentLineNum)+") Found reference To PB label outside Procedure: "+regExResult(i)
Next
EndIf
ElseIf MatchRegularExpression(regExProcedureMacroUsed,trimmedLine$)
regExResultCount = ExtractRegularExpression(regExProcedureMacroUsed,trimmedLine$,regExResult())
If regExResultCount
regExResultCount - 1
For i = 0 To regExResultCount
Debug "(line: "+Str(currentLineNum)+") Including procedure macro: "+regExResult(i)
Next
EndIf
EndIf
EndIf
Wend
CloseFile(inputFile)
EndProcedure
ProcessASM("PureBasic.asm")