diff options
| author | Matthew Hall <hallmatthew314@gmail.com> | 2022-09-04 00:34:09 +1200 |
|---|---|---|
| committer | Matthew Hall <hallmatthew314@gmail.com> | 2022-09-04 00:34:09 +1200 |
| commit | e449c3c866b0c91a0bc34d5cb462c47b5fa43ce1 (patch) | |
| tree | bb4318c89ed75fefeeaeff7dcb4ae274c16772e6 | |
| parent | 00755963fe8d688733ae55a774d72e04de5981b4 (diff) | |
Able to interpret Thue
| -rw-r--r-- | src/thue/program.cr | 12 | ||||
| -rw-r--r-- | src/thue/rule.cr | 12 |
2 files changed, 17 insertions, 7 deletions
diff --git a/src/thue/program.cr b/src/thue/program.cr index c59780b..f449f5a 100644 --- a/src/thue/program.cr +++ b/src/thue/program.cr @@ -6,8 +6,16 @@ class Thue::Program end def interpret - something = @parser.parse - puts something + rules, state = @parser.parse + + loop do + r = rules.find { |r| r.matches?(state) } + break if r.nil? + + state = state.sub(r.pattern, r.replacement) + end + + puts state end end diff --git a/src/thue/rule.cr b/src/thue/rule.cr index 34c2396..cd45adc 100644 --- a/src/thue/rule.cr +++ b/src/thue/rule.cr @@ -1,14 +1,16 @@ require "./thue.cr" abstract struct Thue::Rule - @pattern : Regex + @regex : Regex - def initialize(pattern : String) - @pattern = Regex.new(pattern) + getter pattern : String + + def initialize(@pattern : String) + @regex = Regex.new(Regex.escape(@pattern)) end def matches?(str : String) : Bool - str.matches?(@pattern) + str.matches?(@regex) end abstract def replacement : String @@ -26,7 +28,7 @@ end struct Thue::InputRule < Thue::Rule def replacement : String - gets + gets || "" end end |
