Class: Glaemscribe::API::RuleGroup
- Inherits:
-
Object
- Object
- Glaemscribe::API::RuleGroup
- Defined in:
- lib/api/rule_group.rb
Constant Summary collapse
- VAR_NAME_REGEXP =
/{([0-9A-Z_]+)}/
- VAR_DECL_REGEXP =
/^\s*{([0-9A-Z_]+)}\s+===\s+(.+?)\s*$/
- RULE_REGEXP =
/^\s*(.*?)\s+-->\s+(.+?)\s*$/
- CROSS_RULE_REGEXP =
/^\s*(.*?)\s+-->\s+([\s0-9,]+)\s+-->\s+(.+?)\s*$/
Instance Attribute Summary collapse
-
#in_charset ⇒ Object
readonly
Returns the value of attribute in_charset.
-
#mode ⇒ Object
readonly
Returns the value of attribute mode.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#root_code_block ⇒ Object
readonly
Returns the value of attribute root_code_block.
-
#rules ⇒ Object
readonly
Returns the value of attribute rules.
Instance Method Summary collapse
- #add_var(var_name, value) ⇒ Object
-
#apply_vars(line, string) ⇒ Object
Replace all vars in expression.
- #descend_if_tree(code_block, trans_options) ⇒ Object
- #finalize(trans_options) ⇒ Object
- #finalize_code_line(code_line) ⇒ Object
- #finalize_rule(line, match_exp, replacement_exp, cross_schema = nil) ⇒ Object
-
#initialize(mode, name) ⇒ RuleGroup
constructor
A new instance of RuleGroup.
Constructor Details
Instance Attribute Details
#in_charset ⇒ Object (readonly)
Returns the value of attribute in_charset.
32 33 34 |
# File 'lib/api/rule_group.rb', line 32 def in_charset @in_charset end |
#mode ⇒ Object (readonly)
Returns the value of attribute mode.
32 33 34 |
# File 'lib/api/rule_group.rb', line 32 def mode @mode end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
32 33 34 |
# File 'lib/api/rule_group.rb', line 32 def name @name end |
#root_code_block ⇒ Object (readonly)
Returns the value of attribute root_code_block.
32 33 34 |
# File 'lib/api/rule_group.rb', line 32 def root_code_block @root_code_block end |
#rules ⇒ Object (readonly)
Returns the value of attribute rules.
32 33 34 |
# File 'lib/api/rule_group.rb', line 32 def rules @rules end |
Instance Method Details
#add_var(var_name, value) ⇒ Object
40 41 42 |
# File 'lib/api/rule_group.rb', line 40 def add_var(var_name, value) @vars[var_name] = value end |
#apply_vars(line, string) ⇒ Object
Replace all vars in expression
45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/api/rule_group.rb', line 45 def apply_vars(line, string) ret = string.gsub(VAR_NAME_REGEXP) { |cap_var| rep = @vars[$1] if !rep @mode.errors << Glaeml::Error.new(line, "In expression: #{string}: failed to evaluate variable: #{cap_var}.") return nil end rep } ret end |
#descend_if_tree(code_block, trans_options) ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/api/rule_group.rb', line 57 def descend_if_tree(code_block, ) code_block.terms.each{ |term| if(term.is_code_lines?) term.code_lines.each{ |cl| finalize_code_line(cl) } else term.if_conds.each{ |if_cond| if_eval = Eval::Parser.new() begin if(if_eval.parse(if_cond.expression,) == true) descend_if_tree(if_cond.child_code_block, ) break end rescue IfEvalError => e @mode.errors << Glaeml::Error.new(if_cond.line, "Failed to evaluate condition '#{if_cond.expression}' (#{e})") end } end } end |
#finalize(trans_options) ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/api/rule_group.rb', line 137 def finalize() @vars = {} @in_charset = {} @rules = [] add_var("NULL","") descend_if_tree(@root_code_block, ) # Now that we have selected our rules, create the in_charset of the rule_group rules.each{ |r| r.sub_rules.each { |sr| sr.src_combination.join("").split(//).each{ |inchar| # Add the character to the map of input characters # Ignore '_' (bounds of word) and '|' (word breaker) @in_charset[inchar] = self if inchar != WORD_BREAKER && inchar != WORD_BOUNDARY } } } end |
#finalize_code_line(code_line) ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/api/rule_group.rb', line 98 def finalize_code_line(code_line) begin if code_line.expression =~ VAR_DECL_REGEXP var_name = $1 var_value_ex = $2 var_value = apply_vars(code_line.line, var_value_ex) if !var_value @mode.errors << Glaeml::Error.new(code_line.line, "Thus, variable {#{var_name}} could not be declared.") return end add_var(var_name,var_value) elsif code_line.expression =~ CROSS_RULE_REGEXP match = $1 cross = $2 replacement = $3 finalize_rule(code_line.line, match, replacement, cross) elsif code_line.expression =~ RULE_REGEXP match = $1 replacement = $2 finalize_rule(code_line.line, match, replacement) elsif code_line.expression.empty? # puts "Empty" else @mode.errors << Glaeml::Error.new(code_line.line,"Cannot understand: #{code_line.expression}") end end end |
#finalize_rule(line, match_exp, replacement_exp, cross_schema = nil) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/api/rule_group.rb', line 82 def finalize_rule(line, match_exp, replacement_exp, cross_schema = nil) match = apply_vars(line, match_exp) replacement = apply_vars(line, replacement_exp) return if !match || !replacement # Failed rule = Rule.new(line, self) rule.src_sheaf_chain = SheafChain.new(rule,match,true) rule.dst_sheaf_chain = SheafChain.new(rule,replacement,false) rule.finalize(cross_schema) self.rules << rule end |