Nicht jemand aber selbst mestnyi.im englischen forum war vor kurzem eine aehnliche frage, da wollte jemand sowas parsen (leerzeichen-getrennte liste aus [geschachtelten] funtionsaufrufen) :
Vielleicht war ich zu spät, ich war weg.
mit einem regulären Ausdruck:
Code: Alles auswählen
EnableExplicit
Enumeration RegularExpression
#RegEx_Function
#RegEx_Arguments
EndEnumeration
#RegEx_Pattern_Function = ~"(?:(\\w*)\\s*\\(((?>[^()]|(?R))*)\\))"
#RegEx_Pattern_Arguments = ~"((?:(?:(;).*|\".*?\"|(\\().*?\\))|\\s*\\=\\s*|[^,\\s])+)"
Define Create_Reg_Flag = #PB_RegularExpression_NoCase | #PB_RegularExpression_MultiLine | #PB_RegularExpression_Extended| #PB_RegularExpression_DotAll
If CreateRegularExpression(#RegEx_Function, #RegEx_Pattern_Function, Create_Reg_Flag) And
CreateRegularExpression(#RegEx_Arguments, #RegEx_Pattern_Arguments, Create_Reg_Flag)
EndIf
Procedure.s Extract(String$)
With *This
If ExamineRegularExpression(#RegEx_Function, String$)
While NextRegularExpressionMatch(#RegEx_Function)
String$ = Trim(RegularExpressionGroup(#RegEx_Function, 2))
If ExamineRegularExpression(#RegEx_Arguments, String$)
While NextRegularExpressionMatch(#RegEx_Arguments)
Debug RegularExpressionMatchString(#RegEx_Arguments)
Wend
EndIf
Wend
EndIf
EndWith
EndProcedure
;Extract(~"ProcedureDLL myProcedure(p1, p2, p3.s = \"4,2\") ; just a comment, one, two, three")
;Extract(~"ProcedureDLL myProcedure(p1, p2, p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
;Extract(~"ProcedureDLL myProcedure(p1, p2 = 3.14, p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
Extract(~"ProcedureDLL myProcedure(p1, p2 = GetString(\"3,14\", \"Test\", 42), p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
Code: Alles auswählen
EnableExplicit
Enumeration RegularExpression
#RegEx_Function
#RegEx_Arguments
EndEnumeration
#RegEx_Pattern_Function = ~"(?:(\\w*)\\s*\\(((?>[^()]|(?R))*)\\))"
#RegEx_Pattern_Arguments = "("+#RegEx_Pattern_Function+~"|\".*?\"|\\w*\\.*\\w*\\s*\\=*\\s*\\w*)+"
Define Create_Reg_Flag = #PB_RegularExpression_NoCase | #PB_RegularExpression_MultiLine | #PB_RegularExpression_Extended| #PB_RegularExpression_DotAll
If CreateRegularExpression(#RegEx_Function, #RegEx_Pattern_Function, Create_Reg_Flag) And
CreateRegularExpression(#RegEx_Arguments, #RegEx_Pattern_Arguments, Create_Reg_Flag)
EndIf
Procedure.s Extract(String$)
Protected Result$, ID, Index, Value.f, Param1, Param2, Param3, Param1$
Protected operand$, val$
With *This
If ExamineRegularExpression(#RegEx_Function, String$)
While NextRegularExpressionMatch(#RegEx_Function)
String$ = Trim(RegularExpressionGroup(#RegEx_Function, 2))
If ExamineRegularExpression(#RegEx_Arguments, String$)
While NextRegularExpressionMatch(#RegEx_Arguments)
If RegularExpressionMatchString(#RegEx_Arguments)
Debug Trim(RegularExpressionMatchString(#RegEx_Arguments))
EndIf
Wend
EndIf
Wend
EndIf
EndWith
ProcedureReturn Result$
EndProcedure
;Extract(~"ProcedureDLL myProcedure(p1, p2, p3.s = \"4,2\") ; just a comment, one, two, three")
;Extract(~"ProcedureDLL myProcedure(p1, p2, p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
;Extract(~"ProcedureDLL myProcedure(p1, p2 = 3.14, p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")
Extract(~"ProcedureDLL myProcedure(p1, p2 = GetString(\"3,14\", a(b(),c()), 42), p3.s = \"4,2\", p4.s = GetValue(8)) ; just a comment, one, two, three")