Class: JSGF::Parser

Inherits:
Racc::Parser
  • Object
show all
Defined in:
lib/jsgf/parser.rb

Constant Summary collapse

Racc_arg =
[
racc_action_table,
racc_action_check,
racc_action_default,
racc_action_pointer,
racc_goto_table,
racc_goto_check,
racc_goto_default,
racc_goto_pointer,
racc_nt_base,
racc_reduce_table,
racc_token_table,
racc_shift_n,
racc_reduce_n,
racc_use_result_var ]
Racc_token_to_s_table =
[
"$end",
"error",
"GRAMMAR",
"HEADER",
"IMPORT",
"PUBLIC",
"TAG",
"TOKEN",
"WEIGHT",
"\";\"",
"\"<\"",
"\">\"",
"\"=\"",
"\"|\"",
"\"(\"",
"\")\"",
"\"[\"",
"\"]\"",
"\"*\"",
"\"+\"",
"$start",
"grammar",
"header",
"rule_list",
"import_header",
"jsgf_header",
"grammar_header",
"import_statement",
"rule_name",
"rule",
"alternation",
"atom_list",
"alternation_item",
"rule_atom",
"weighted_item",
"tagged_atom",
"group_list",
"rule_group",
"rule_optional" ]
Racc_debug_parser =
false

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tokenizer) ⇒ Parser

Returns a new instance of Parser.



23
24
25
26
27
28
29
30
# File 'lib/jsgf/parser.rb', line 23

def initialize(tokenizer)
    @private_rules = {}
    @public_rules = {}
    @rules = {}
    tokenizer = JSGF::Tokenizer.new(tokenizer) if tokenizer.is_a?(String)
    @tokenizer = tokenizer
    super()
end

Instance Attribute Details

#grammar_nameObject (readonly)

Returns the value of attribute grammar_name.



20
21
22
# File 'lib/jsgf/parser.rb', line 20

def grammar_name
  @grammar_name
end

#handlerObject (readonly)

Returns the value of attribute handler.



21
22
23
# File 'lib/jsgf/parser.rb', line 21

def handler
  @handler
end

Instance Method Details

#_reduce_15(val, _values, result) ⇒ Object

reduce 14 omitted



319
320
321
322
# File 'lib/jsgf/parser.rb', line 319

def _reduce_15(val, _values, result)
 result = val[1] 
    result
end

#_reduce_16(val, _values, result) ⇒ Object



324
325
326
327
# File 'lib/jsgf/parser.rb', line 324

def _reduce_16(val, _values, result)
 result = define_rule(val[0], :private, *(val[2..-2])) 
    result
end

#_reduce_17(val, _values, result) ⇒ Object



329
330
331
332
# File 'lib/jsgf/parser.rb', line 329

def _reduce_17(val, _values, result)
 result = define_rule(val[0], :private, *(val[2..-2])) 
    result
end

#_reduce_18(val, _values, result) ⇒ Object



334
335
336
337
# File 'lib/jsgf/parser.rb', line 334

def _reduce_18(val, _values, result)
 val[1][:visibility] = :public 
    result
end

#_reduce_19(val, _values, result) ⇒ Object



339
340
341
342
# File 'lib/jsgf/parser.rb', line 339

def _reduce_19(val, _values, result)
 result = val.first 
    result
end

#_reduce_20(val, _values, result) ⇒ Object



344
345
346
347
# File 'lib/jsgf/parser.rb', line 344

def _reduce_20(val, _values, result)
 result = define_alternation(*val) 
    result
end

#_reduce_24(val, _values, result) ⇒ Object

reduce 23 omitted



355
356
357
358
# File 'lib/jsgf/parser.rb', line 355

def _reduce_24(val, _values, result)
 val[0][:tags].push(val[1]); result = val[0] 
    result
end

#_reduce_26(val, _values, result) ⇒ Object

reduce 25 omitted



362
363
364
365
# File 'lib/jsgf/parser.rb', line 362

def _reduce_26(val, _values, result)
 result = val; 
    result
end

#_reduce_27(val, _values, result) ⇒ Object



367
368
369
370
# File 'lib/jsgf/parser.rb', line 367

def _reduce_27(val, _values, result)
 val[1][:weight] = val.first[1..-2].to_f; result = val[1] 
    result
end

#_reduce_30(val, _values, result) ⇒ Object

reduce 29 omitted



376
377
378
379
# File 'lib/jsgf/parser.rb', line 376

def _reduce_30(val, _values, result)
 result = val[1] 
    result
end

#_reduce_31(val, _values, result) ⇒ Object



381
382
383
384
# File 'lib/jsgf/parser.rb', line 381

def _reduce_31(val, _values, result)
 result = define_optional(val[1]) 
    result
end

#_reduce_32(val, _values, result) ⇒ Object



386
387
388
389
# File 'lib/jsgf/parser.rb', line 386

def _reduce_32(val, _values, result)
 result = define_atom(val.first) 
    result
end

#_reduce_33(val, _values, result) ⇒ Object



391
392
393
394
# File 'lib/jsgf/parser.rb', line 391

def _reduce_33(val, _values, result)
 result = rule_reference(val[0]) 
    result
end

#_reduce_36(val, _values, result) ⇒ Object

reduce 35 omitted



400
401
402
403
# File 'lib/jsgf/parser.rb', line 400

def _reduce_36(val, _values, result)
 result = JSGF::Repetition.new(val[0], 0) 
    result
end

#_reduce_37(val, _values, result) ⇒ Object



405
406
407
408
# File 'lib/jsgf/parser.rb', line 405

def _reduce_37(val, _values, result)
 result = JSGF::Repetition.new(val[0], 1) 
    result
end

#_reduce_6(val, _values, result) ⇒ Object

reduce 5 omitted



289
290
291
292
# File 'lib/jsgf/parser.rb', line 289

def _reduce_6(val, _values, result)
 @version = val[1]; 
    result
end

#_reduce_7(val, _values, result) ⇒ Object



294
295
296
297
# File 'lib/jsgf/parser.rb', line 294

def _reduce_7(val, _values, result)
 @version = val[1]; @charset = val[2]; 
    result
end

#_reduce_8(val, _values, result) ⇒ Object



299
300
301
302
# File 'lib/jsgf/parser.rb', line 299

def _reduce_8(val, _values, result)
 @version = val[1]; @charset = val[2]; @locale = val[3]; 
    result
end

#_reduce_9(val, _values, result) ⇒ Object



304
305
306
307
# File 'lib/jsgf/parser.rb', line 304

def _reduce_9(val, _values, result)
 @grammar_name = val[1] 
    result
end

#_reduce_none(val, _values, result) ⇒ Object



410
411
412
# File 'lib/jsgf/parser.rb', line 410

def _reduce_none(val, _values, result)
  val[0]
end

#define_alternation(*args) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/jsgf/parser.rb', line 32

def define_alternation(*args)
    if args.first.is_a?(JSGF::Alternation)
  args.first.push *(args.drop(2))
  args.first
    else
  JSGF::Alternation.new(*(args.each_slice(2).map {|a,b| a}))
    end
end

#define_atom(atom, weight = 1.0, tags = []) ⇒ Object



50
51
52
# File 'lib/jsgf/parser.rb', line 50

def define_atom(atom, weight=1.0, tags=[])
   {atom:atom, weight:weight, tags:[]}
end

#define_optional(*args) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/jsgf/parser.rb', line 41

def define_optional(*args)
    if args.first.respond_to?(:optional)
  args.first.optional = true
  args.first
    else
  JSGF::Optional.new(*args)
    end
end

#define_rule(name, visibility = :private, *args) ⇒ Object



54
55
56
57
58
# File 'lib/jsgf/parser.rb', line 54

def define_rule(name, visibility=:private, *args)
    r = {name: name, visibility:visibility, atoms:args.flatten}
    @rules[name] = r
    r
end

#next_tokenObject



64
65
66
# File 'lib/jsgf/parser.rb', line 64

def next_token
  @tokenizer.next_token
end

#parseObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/jsgf/parser.rb', line 68

def parse
    do_parse

    @rules.each do |(k,v)|
  if v[:visibility] == :private
      @private_rules[k] = v[:atoms]
  else
      @public_rules[k] = v[:atoms]
  end
    end

    JSGF::Grammar.new(  name:@grammar_name,
      character_encoding:@charset,
      locale:@locale,
      private_rules:@private_rules,
      public_rules:@public_rules,
      version:@version)
end

#rule_reference(name) ⇒ Object



60
61
62
# File 'lib/jsgf/parser.rb', line 60

def rule_reference(name)
    {name:name, weight:1.0, tags:[]}
end