document.write('<link rel="stylesheet" href="http://gist.github.com/stylesheets/gist/embed.css"/>')





document.write('<div id=\"gist-229783\" class=\"gist\">\n  \n  \n    \n            \n\n      <div class=\"gist-file\">\n        <div class=\"gist-data gist-syntax\">\n          \n          \n          \n            <div class=\"gist-highlight\"><pre><div class=\"line\" id=\"LC1\"><span class=\"nb\">require<\/span> <span class=\"s2\">&quot;string_reader&quot;<\/span><\/div><div class=\"line\" id=\"LC2\"><span class=\"nb\">require<\/span> <span class=\"s2\">&quot;state_builder&quot;<\/span><\/div><div class=\"line\" id=\"LC3\">&nbsp;<\/div><div class=\"line\" id=\"LC4\"><span class=\"k\">class<\/span> <span class=\"nc\">StringMatcher<\/span><\/div><div class=\"line\" id=\"LC5\">&nbsp;&nbsp;<span class=\"k\">def<\/span> <span class=\"nf\">is_match<\/span><span class=\"p\">(<\/span><span class=\"n\">pattern<\/span><span class=\"p\">,<\/span> <span class=\"n\">test_string<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC6\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">state_builder<\/span> <span class=\"o\">=<\/span> <span class=\"no\">StateBuilder<\/span><span class=\"o\">.<\/span><span class=\"n\">new<\/span><\/div><div class=\"line\" id=\"LC7\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">graph<\/span> <span class=\"o\">=<\/span> <span class=\"n\">state_builder<\/span><span class=\"o\">.<\/span><span class=\"n\">create_from<\/span><span class=\"p\">(<\/span><span class=\"n\">pattern<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC8\">&nbsp;<\/div><div class=\"line\" id=\"LC9\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">reader<\/span> <span class=\"o\">=<\/span> <span class=\"no\">StringReader<\/span><span class=\"o\">.<\/span><span class=\"n\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">test_string<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC10\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">next_states<\/span> <span class=\"o\">=<\/span> <span class=\"o\">[<\/span><span class=\"n\">graph<\/span><span class=\"o\">]<\/span><\/div><div class=\"line\" id=\"LC11\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">while<\/span> <span class=\"o\">!<\/span><span class=\"n\">reader<\/span><span class=\"o\">.<\/span><span class=\"n\">end_of_string<\/span><\/div><div class=\"line\" id=\"LC12\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">test_states<\/span> <span class=\"o\">=<\/span> <span class=\"n\">next_states<\/span><\/div><div class=\"line\" id=\"LC13\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">next_states<\/span> <span class=\"o\">=<\/span> <span class=\"o\">[]<\/span><\/div><div class=\"line\" id=\"LC14\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">current_character<\/span> <span class=\"o\">=<\/span> <span class=\"n\">reader<\/span><span class=\"o\">.<\/span><span class=\"n\">read<\/span><\/div><div class=\"line\" id=\"LC15\">&nbsp;<\/div><div class=\"line\" id=\"LC16\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">test_states<\/span><span class=\"o\">.<\/span><span class=\"n\">each<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">state<\/span><span class=\"o\">|<\/span><\/div><div class=\"line\" id=\"LC17\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">state<\/span><span class=\"o\">.<\/span><span class=\"n\">transitions<\/span><span class=\"o\">.<\/span><span class=\"n\">each<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">transition<\/span><span class=\"o\">|<\/span><\/div><div class=\"line\" id=\"LC18\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"n\">transition<\/span><span class=\"o\">.<\/span><span class=\"n\">can_do<\/span><span class=\"p\">(<\/span><span class=\"n\">current_character<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC19\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">next_states<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"n\">transition<\/span><span class=\"o\">.<\/span><span class=\"n\">destination<\/span><\/div><div class=\"line\" id=\"LC20\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC21\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC22\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC23\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC24\">&nbsp;<\/div><div class=\"line\" id=\"LC25\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">next_states<\/span><span class=\"o\">.<\/span><span class=\"n\">each<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">state<\/span><span class=\"o\">|<\/span><\/div><div class=\"line\" id=\"LC26\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">state<\/span><span class=\"o\">.<\/span><span class=\"n\">transitions<\/span><span class=\"o\">.<\/span><span class=\"n\">each<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">transition<\/span><span class=\"o\">|<\/span><\/div><div class=\"line\" id=\"LC27\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"n\">transition<\/span><span class=\"o\">.<\/span><span class=\"n\">class<\/span> <span class=\"o\">==<\/span> <span class=\"no\">AlwaysTransition<\/span> <span class=\"ow\">and<\/span> <span class=\"n\">transition<\/span><span class=\"o\">.<\/span><span class=\"n\">destination<\/span><span class=\"o\">.<\/span><span class=\"n\">class<\/span> <span class=\"o\">==<\/span> <span class=\"no\">TerminalState<\/span><\/div><div class=\"line\" id=\"LC28\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"kp\">true<\/span><\/div><div class=\"line\" id=\"LC29\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC30\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC31\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC32\">&nbsp;<\/div><div class=\"line\" id=\"LC33\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"kp\">false<\/span><\/div><div class=\"line\" id=\"LC34\">&nbsp;&nbsp;<span class=\"k\">end<\/span><\/div><div class=\"line\" id=\"LC35\"><span class=\"k\">end<\/span><\/div><\/pre><\/div>\n          \n        <\/div>\n\n        <div class=\"gist-meta\">\n          <a href=\"http://gist.github.com/raw/229783/4499844c33848a7c9535c2ff7a64a2d501e394cb/gistfile1.rb\" style=\"float:right;\">view raw<\/a>\n          <a href=\"http://gist.github.com/229783#file_gistfile1.rb\" style=\"float:right;margin-right:10px;color:#666\">gistfile1.rb<\/a>\n          <a href=\"http://gist.github.com/229783\">This Gist<\/a> brought to you by <a href=\"http://github.com\">GitHub<\/a>.\n        <\/div>\n      <\/div>\n    \n  \n<\/div>\n')
