Hi, I'm beginning with Ragel. For now I've readed the documentation and try to do some easy examples with Ruby host language (no C extensions for now).
I just want to parse a SIP URI like this: sip:[email protected] and extract the following data into a Ruby SIP_URI class instance: @protocol => "sip" @user => "alice" @host => "mydomain.org" I've already done this easy parser but I don't know how to extract the parsed data into the Ruby attributes. The code I've done for now is: ---------------------------------------------------------- class SIP_URI attr_accessor :protocol, :user, :host def initialize @protocol = "" @user = "" @host = "" end def to_s #puts @protocol.to_s + ':' + @user.to_s + '@' + @host.to_s # puts "Not implemented yet..." end end @my_sip_uri = SIP_URI.new %%{ machine sip_uri; protocol = ('sip'|'sips'); user = [a-zA-Z0-9]+; host = [a-zA-Z0-9]+; main := protocol ':' user '@' host; }%% %% write data; def run_machine(data) puts "Running Ragel the state machine with input #{data}..." # Initialization data = data.unpack("c*") if data.is_a?(String) p = 0 pe = data.length tag = nil %% write init; %% write exec; puts "Finished. The state of the machine is: #{cs}" puts "p: #{p} pe: #{pe}" end run_machine ARGV[0] puts @my_sip_uri ---------------------------------------------------------- It works, of course, but it's not very useful as it is now :) To get the parsed data fragments I've readed about the usage of: %%{ action _tag { mark_tag = p } action tag { tag = data[mark_tag..p-1] } machine sip_uri; protocol = ('sip'|'sips') >_tag %tag ; user = [a-zA-Z0-9]+ >_tag %tag ; host = [a-zA-Z0-9]+ >_tag %tag ; main := protocol ':' user '@' host; }%% I understand that "tag" will be a data array fragment starting by "p" and finishing in each found expression. But I have no idea (and have found no doc) about how to get that info into Ruby variables. If I compile the above code with the new block I get an error anyway: example02.rl:21:2: there is no previous specification name example02.rl:28: action lookup of "_tag" failed example02.rl:28: action lookup of "tag" failed In the documentation I read about a variable "ts": ts - This must be a pointer to character data. In Java and Ruby code this must be an integer. but have no idea of how to use it. Any help or explanation please? Thanks a lot. -- Iñaki Baz Castillo _______________________________________________ ragel-users mailing list [email protected] http://www.complang.org/mailman/listinfo/ragel-users
