Module: RailroadDiagrams::DSL

Included in:
Builder
Defined in:
lib/railroad_diagrams/builder.rb

Overview

Helpers for building node trees with short grammar expressions.

Examples:

RailroadDiagrams.build { seq('SELECT', :column) }

Instance Method Summary collapse

Instance Method Details

#alt(first, second) ⇒ Object

Examples:

alt('a', 'b')


120
121
122
# File 'lib/railroad_diagrams/builder.rb', line 120

def alt(first, second)
  AlternatingSequence.new(coerce(first), coerce(second))
end

#block(**options) ⇒ Object

Examples:

block(width: 40)


161
162
163
# File 'lib/railroad_diagrams/builder.rb', line 161

def block(**options)
  Block.new(**options)
end

#char_class(text, **options) ⇒ Object

Examples:

char_class('[a-z]')


167
168
169
# File 'lib/railroad_diagrams/builder.rb', line 167

def char_class(text, **options)
  CharClass.new(text.to_s, **options)
end

#choice(*items, default: 0) ⇒ Object

Examples:

choice('yes', 'no', default: 1)


78
79
80
# File 'lib/railroad_diagrams/builder.rb', line 78

def choice(*items, default: 0)
  Choice.new(default, *items.map { |item| coerce(item) })
end

#comment(text, **options) ⇒ Object

Examples:

comment('optional')


60
61
62
# File 'lib/railroad_diagrams/builder.rb', line 60

def comment(text, **options)
  Comment.new(text.to_s, **options)
end

#diagram(*items, **options) ⇒ Object

Examples:

diagram('a', :rule)


40
41
42
# File 'lib/railroad_diagrams/builder.rb', line 40

def diagram(*items, **options)
  Diagram.new(*items.map { |item| coerce(item) }, **options)
end

#except(item, excluded, **options) ⇒ Object

Examples:

except('letter', 'x')


155
156
157
# File 'lib/railroad_diagrams/builder.rb', line 155

def except(item, excluded, **options)
  Except.new(coerce(item), excluded.is_a?(String) ? excluded : coerce(excluded), **options)
end

#group(item, label = nil, **options) ⇒ Object

Examples:

group('a', label: 'group')

Raises:



126
127
128
129
130
131
132
# File 'lib/railroad_diagrams/builder.rb', line 126

def group(item, label = nil, **options)
  raise InvalidArgument, 'unknown group option' unless (options.keys - [:label]).empty?
  raise InvalidArgument, 'label specified twice' if !label.nil? && options.key?(:label)

  label = options[:label] if options.key?(:label)
  Group.new(coerce(item), label: label.is_a?(String) || label.nil? ? label : coerce(label))
end

#hchoice(*items) ⇒ Object

Examples:

hchoice('yes', 'no')


84
85
86
# File 'lib/railroad_diagrams/builder.rb', line 84

def hchoice(*items)
  HorizontalChoice.new(*items.map { |item| coerce(item) })
end

#list(item, sep: ',', **options) ⇒ Object

Examples:

list(:column, sep: ',')


149
150
151
# File 'lib/railroad_diagrams/builder.rb', line 149

def list(item, sep: ',', **options)
  SeparatedList.new(coerce(item), coerce(sep), **options)
end

#mchoice(type, *items, default: 0) ⇒ Object

Examples:

mchoice('any', 'a', 'b')


90
91
92
# File 'lib/railroad_diagrams/builder.rb', line 90

def mchoice(type, *items, default: 0)
  MultipleChoice.new(default, type.to_s, *items.map { |item| coerce(item) })
end

#nt(text, **options) ⇒ Object Also known as: non_terminal

Examples:

nt('expression')


53
54
55
# File 'lib/railroad_diagrams/builder.rb', line 53

def nt(text, **options)
  NonTerminal.new(text.to_s, **options)
end

#one_or_more(item, sep = nil) ⇒ Object

Examples:

one_or_more('digit', ',')


108
109
110
# File 'lib/railroad_diagrams/builder.rb', line 108

def one_or_more(item, sep = nil)
  OneOrMore.new(coerce(item), sep.nil? ? nil : coerce(sep))
end

#opt(item, skip: false) ⇒ Object

Examples:

opt('DISTINCT')


96
97
98
# File 'lib/railroad_diagrams/builder.rb', line 96

def opt(item, skip: false)
  Optional.new(coerce(item), skip: skip)
end

#oseq(*items) ⇒ Object

Examples:

oseq('a', 'b')


114
115
116
# File 'lib/railroad_diagrams/builder.rb', line 114

def oseq(*items)
  OptionalSequence.new(*items.map { |item| coerce(item) })
end

#repeat(item, **options) ⇒ Object

Examples:

repeat('digit', min: 2, max: 4)


142
143
144
145
# File 'lib/railroad_diagrams/builder.rb', line 142

def repeat(item, **options)
  options[:separator] = coerce(options[:separator]) if options.key?(:separator) && !options[:separator].nil?
  Repeat.new(coerce(item), **options)
end

#seq(*items) ⇒ Object

Examples:

seq('SELECT', :column)


66
67
68
# File 'lib/railroad_diagrams/builder.rb', line 66

def seq(*items)
  Sequence.new(*items.map { |item| coerce(item) })
end

#skip ⇒ Object

Examples:

skip


136
137
138
# File 'lib/railroad_diagrams/builder.rb', line 136

def skip
  Skip.new
end

#special(text, **options) ⇒ Object

Examples:

special('EOF')


173
174
175
# File 'lib/railroad_diagrams/builder.rb', line 173

def special(text, **options)
  Special.new(text.to_s, **options)
end

#stack(*items) ⇒ Object

Examples:

stack('first', 'second')


72
73
74
# File 'lib/railroad_diagrams/builder.rb', line 72

def stack(*items)
  Stack.new(*items.map { |item| coerce(item) })
end

#t(text, **options) ⇒ Object Also known as: terminal

Examples:

t('SELECT')


46
47
48
# File 'lib/railroad_diagrams/builder.rb', line 46

def t(text, **options)
  Terminal.new(text.to_s, **options)
end

#zero_or_more(item, sep = nil, skip: false) ⇒ Object

Examples:

zero_or_more('digit', ',')


102
103
104
# File 'lib/railroad_diagrams/builder.rb', line 102

def zero_or_more(item, sep = nil, skip: false)
  ZeroOrMore.new(coerce(item), sep.nil? ? nil : coerce(sep), skip: skip)
end