Class: Aurum::Grammar::DSL::LexicalRulesBuilder
- Inherits:
-
Object
- Object
- Aurum::Grammar::DSL::LexicalRulesBuilder
show all
- Defined in:
- lib/aurum/grammar/dsl/lexical_definition.rb
Instance Method Summary
collapse
Constructor Details
#initialize(lexical_rules, character_classes) ⇒ LexicalRulesBuilder
Returns a new instance of LexicalRulesBuilder.
34
35
36
37
|
# File 'lib/aurum/grammar/dsl/lexical_definition.rb', line 34
def initialize lexical_rules, character_classes
@lexical_rules, @character_classes = lexical_rules, character_classes
@named_patterns, @current_states = {}, [['initial']]
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *patterns, &semantic_action) ⇒ Object
81
82
83
84
85
86
87
88
89
90
|
# File 'lib/aurum/grammar/dsl/lexical_definition.rb', line 81
def method_missing name, *patterns, &semantic_action
name, pattern = name.to_s, concat(*patterns)
return match(pattern, :recognize => name, &semantic_action) if name =~ /^_/
if patterns.empty?
return @named_patterns[name] if @named_patterns.has_key? name
return Aurum::Grammar::LexicalRules::Pattern.character_set(@character_classes.__named_character_classes__[name]) if @character_classes.__named_character_classes__.has_key? name
raise "can not find pattern named '#{name}'"
end
@named_patterns[name] = concat(*patterns)
end
|
Instance Method Details
#concat(*patterns) ⇒ Object
#ignore(pattern, options = {}, &semantic_action) ⇒ Object
65
66
67
68
|
# File 'lib/aurum/grammar/dsl/lexical_definition.rb', line 65
def ignore pattern, options = {}, &semantic_action
options[:recognize] = '$ignored'
match(pattern, options, &semantic_action)
end
|
#match(pattern, options = {}, &semantic_action) ⇒ Object
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/aurum/grammar/dsl/lexical_definition.rb', line 70
def match pattern, options = {}, &semantic_action
event = options[:event].to_s if options.has_key?(:event)
token = options[:recognize].to_s if options.has_key?(:recognize)
lexical_state = options[:shift_to].to_s if options.has_key?(:shift_to)
action = Aurum::LexicalTable::Action.new(token, lexical_state, event, semantic_action)
pattern = string(pattern.to_s) unless pattern.is_a?(Aurum::Grammar::LexicalRules::Pattern)
for state in @current_states.last
@lexical_rules.add_lexical_action(state, pattern, action)
end
end
|
#range(first, last = first) ⇒ Object
#string(literal) ⇒ Object
#within(*states, &definition) ⇒ Object
57
58
59
60
61
62
63
|
# File 'lib/aurum/grammar/dsl/lexical_definition.rb', line 57
def within *states, &definition
@saved_named_patterns = @named_patterns.dup
@current_states << states.map {|state| state.to_s}
instance_eval(&definition)
@current_states.pop
@named_patterns = @saved_named_patterns
end
|