From: Josh Cheek Date: 2009-09-25T13:15:08+09:00 Subject: Re: Get functions names with regex --000e0cd2178e6fa46a04745f31dc Content-Type: text/plain; charset=ISO-8859-1 On Thu, Sep 24, 2009 at 9:17 PM, Ahmet Kilic wrote: > I have text file like this, > > str = "function ExecMain.GetApiErrorMessage(ApiErrCode :DWORD) :String; > var > Buf: array[0..511] of Char; > MsgCnt :DWORD; > begin > function THandle.SetPrivilege(PrivilegeName: String; > Enable: Boolean): Boolean; > var > tpPrev, > tp : TTokenPrivileges; > token : THandle; > dwRetLen : DWord; > begin > function Privileges.SetPrivilege(PrivilegeName: String; > Enable: Boolean): Boolean; > var > tpPrev, > tp : Privileges; > token : THandleTest; > dwRetLen : DWord; > begin" > > str =~ /(function)\s+(\w+)(.*);/ > func_names = $1 > puts "#{$'}" > while(str) # while(true) > str = $' #second function > str =~ /:(\w+);/m > args = $1 > # str.scan(/:(\w+);/m) do |d| > # puts $1 # private method error > # end > if args == func_names > puts func_names > end > puts "-----------------------------" > puts "#{$'}" > end > > I am writing this script for getting the function names and args names. > but there is some rules: > 1- if I want to scan one function name, next time I need scan second > function name.(because I need which args belongs to which functions > name) > 2- If args names same as functions names I want to print the function > name. > > with this code I am not get the args name. > please help me. > -- > Posted via http://www.ruby-forum.com/. > > #try this code (I'm on 1.8.6) #a function declaration that was parsed out of some text class ParsedFunction attr_accessor :name , :args #expects args to be in format [[name,type],[name,type]] def initialize( name , *args ) @name , @args = name , *args end #call like this: funct.each_arg{|arg_name,arg_type| ... } def each_arg args.each do |arg| yield *arg end end def to_s "function #{name}( #{args.map{|arg| arg.join(': ') }.join('; ')} )" end end functs = Array.new str.scan(/^\s*function\s*([^(]+)\(([^)]+)/).map do |name,args| name.gsub!(/\s/,'') args.gsub!(/\s/,'') functs << ParsedFunction.new( name , args.split(/;/).map{|arg| arg.split(/:/) } ) end puts "THE FUNCTIONS FOUND WERE: \n\n" functs.each do |f| puts "signature: #{f}" puts "name: #{f.name}" puts "number of args: #{f.args.size}" puts "list of args:" f.each_arg{|arg_name,arg_type| puts " #{arg_name} : #{arg_type}" } puts end __END__ I get the following output: THE FUNCTIONS FOUND WERE: signature: function ExecMain.GetApiErrorMessage( ApiErrCode: DWORD ) name: ExecMain.GetApiErrorMessage number of args: 1 list of args: ApiErrCode : DWORD signature: function THandle.SetPrivilege( PrivilegeName: String; Enable: Boolean ) name: THandle.SetPrivilege number of args: 2 list of args: PrivilegeName : String Enable : Boolean signature: function Privileges.SetPrivilege( PrivilegeName: String; Enable: Boolean ) name: Privileges.SetPrivilege number of args: 2 list of args: PrivilegeName : String Enable : Boolean --000e0cd2178e6fa46a04745f31dc--