diff --git a/lib/imbecile.rb b/lib/imbecile.rb index 8ab70f6..99c56f0 100644 --- a/lib/imbecile.rb +++ b/lib/imbecile.rb @@ -3,6 +3,7 @@ require "set" require_relative "imbecile/cli" require_relative "imbecile/code_point_range" require_relative "imbecile/grammar" +require_relative "imbecile/grammar/rule" require_relative "imbecile/grammar/token" require_relative "imbecile/regex" require_relative "imbecile/regex/fa" diff --git a/lib/imbecile/grammar.rb b/lib/imbecile/grammar.rb index 62fa707..d9c1dfa 100644 --- a/lib/imbecile/grammar.rb +++ b/lib/imbecile/grammar.rb @@ -15,6 +15,7 @@ module Imbecile def initialize(input) @tokens = [] + @rules = [] @token_names = Set.new input = input.gsub("\r\n", "\n") while !input.empty? @@ -49,6 +50,9 @@ module Imbecile elsif input.slice!(/\Adrop\s+(\S+)\n/) pattern = $1 @tokens << Token.new(nil, pattern, @tokens.size) + elsif input.slice!(/\Arule\s+(\S+)\s+\[(.*?)\] <<\n(.*?)^>>\n/m) + rule_name, rule, code = $1, $2, $3 + @rules << Rule.new(rule_name, rule, code) else if input.size > 25 input = input.slice(0..20) + "..." diff --git a/lib/imbecile/grammar/rule.rb b/lib/imbecile/grammar/rule.rb new file mode 100644 index 0000000..00218bf --- /dev/null +++ b/lib/imbecile/grammar/rule.rb @@ -0,0 +1,16 @@ +module Imbecile + class Grammar + + class Rule + + def initialize(name, rule, code) + @name = name + rule_components = rule.split(/\s+/) + @components = rule_components + @code = code + end + + end + + end +end