depager 0.1.9 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +4 -0
- data/bin/depager +1 -0
- data/data/depager/misc/depager-mode.el +35 -24
- data/data/depager/pre-setup.rb +3 -0
- data/examples/Rakefile +36 -0
- data/examples/c89/c89.dr +496 -0
- data/examples/c89/c89.tab.rb +2197 -0
- data/examples/c89/test.c89 +10 -0
- data/{data/depager/sample → examples}/extension/paction.dr +0 -0
- data/{data/depager/sample → examples}/extension/pactiontest.dr +0 -0
- data/{data/depager/sample → examples}/pl0d/pl0ds.dr +0 -0
- data/examples/pl0d/pl0ds.tab.rb +1702 -0
- data/{data/depager/sample/pl0d/pl0test.pl0 → examples/pl0d/test.pl0ds} +0 -0
- data/{data/depager/sample → examples}/sample_calc/calc.action.dr +0 -0
- data/examples/sample_calc/calc.action.tab.rb +283 -0
- data/{data/depager/sample → examples}/sample_calc/calc.astdf.dr +0 -0
- data/examples/sample_calc/calc.astdf.tab.rb +476 -0
- data/{data/depager/sample → examples}/sample_calc/calc.astl.action.dr +0 -0
- data/examples/sample_calc/calc.astl.action.tab.rb +593 -0
- data/{data/depager/sample → examples}/sample_calc/calc.astl.dr +0 -0
- data/examples/sample_calc/calc.astl.tab.rb +501 -0
- data/{data/depager/sample → examples}/sample_calc/calc.atree.dr +0 -0
- data/examples/sample_calc/calc.atree.tab.rb +277 -0
- data/{data/depager/sample → examples}/sample_calc/calc.cst.dr +0 -0
- data/examples/sample_calc/calc.cst.tab.rb +478 -0
- data/{data/depager/sample → examples}/sample_calc/calc.dr +0 -0
- data/{data/depager/sample → examples}/sample_calc/calc.lex.dr +0 -0
- data/examples/sample_calc/calc.lex.tab.rb +192 -0
- data/{data/depager/sample → examples}/sample_calc/calc.nvaction.dr +0 -0
- data/examples/sample_calc/calc.nvaction.tab.rb +291 -0
- data/examples/sample_calc/calc.tab.rb +183 -0
- data/{data/depager/sample → examples}/sample_calc/calc_prec.nvaction.dr +0 -0
- data/examples/sample_calc/calc_prec.nvaction.tab.rb +257 -0
- data/examples/sample_calc/test.calc +1 -0
- data/{data/depager/sample/slex_test/slextest1.dr → examples/slex_test/divreg.slex.dr} +3 -11
- data/examples/slex_test/divreg.slex.tab.rb +227 -0
- data/{data/depager/sample/slex_test/slextest2.dr → examples/slex_test/ljoin.slex.dr} +10 -7
- data/examples/slex_test/ljoin.slex.tab.rb +277 -0
- data/examples/slex_test/test.divreg +1 -0
- data/examples/slex_test/test.ljoin +3 -0
- data/lib/depager.rb +194 -127
- data/lib/depager/Rakefile +8 -4
- data/lib/depager/ast_base.dr +3 -3
- data/lib/depager/ast_base.rb +197 -144
- data/lib/depager/atree.rb +55 -36
- data/lib/depager/cst.dr +6 -4
- data/lib/depager/cst.rb +69 -49
- data/lib/depager/grammar.rb +136 -0
- data/lib/depager/lex.dr +22 -8
- data/lib/depager/lex.rb +94 -53
- data/lib/depager/lr.rb +101 -167
- data/lib/depager/parse_action.rb +1 -1
- data/lib/depager/parser.rb +34 -7
- data/lib/depager/slex.dr +76 -36
- data/lib/depager/slex.rb +345 -151
- data/lib/depager/srp.rb +3 -2
- data/lib/depager/template/extension_lalr_slave.erb +1 -1
- data/lib/depager/template/single_lalr_parser.erb +1 -1
- data/lib/depager/utils.rb +2 -1
- data/lib/depager/version.rb +2 -2
- metadata +42 -28
- data/Manifest.txt +0 -52
- data/lib/depager/psrtmpl.rb +0 -33
@@ -0,0 +1 @@
|
|
1
|
+
/aaa/ / /bbb/
|
data/lib/depager.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'erb'
|
2
|
-
require "depager/lr.rb"
|
3
2
|
require "depager/parser.rb"
|
3
|
+
require "depager/grammar.rb"
|
4
4
|
require "depager/utils.rb"
|
5
5
|
|
6
6
|
module Depager
|
7
|
-
Tmpldir = "#{File.dirname(__FILE__)}/depager/template"
|
7
|
+
Tmpldir = File.expand_path "#{File.dirname(__FILE__)}/depager/template"
|
8
|
+
|
8
9
|
#
|
9
10
|
# file manager
|
10
11
|
#
|
@@ -60,17 +61,23 @@ module Depager
|
|
60
61
|
case line = files.getline
|
61
62
|
when /^\s*(#.*)?$/
|
62
63
|
#skip space and comment.
|
63
|
-
when /^%class\s
|
64
|
+
when /^%class\s+(\S+)\s+based_on\s+(\S+)\s+\(\s*'(.+)'\s*\)\s*$/
|
64
65
|
@target_name = $1
|
65
|
-
|
66
|
+
require $3
|
67
|
+
ns = $2.split(/::/)
|
68
|
+
ge = ns.pop
|
69
|
+
m = ns.inject(Object){|c,name| c.const_get(name) }
|
70
|
+
@generator = m.const_get("#{ge}Generator").new(self)
|
66
71
|
break
|
67
|
-
when /^%class\s
|
72
|
+
when /^%class\s+(\S+)\s*$/
|
73
|
+
require 'depager/lr.rb'
|
68
74
|
@target_name = $1
|
69
|
-
@generator =
|
75
|
+
@generator = LALR::SingleParserGenerator.new(self)
|
70
76
|
break
|
71
|
-
when /^%defext\s
|
77
|
+
when /^%defext\s+(\S+)\s*$/
|
78
|
+
require 'depager/lr.rb'
|
72
79
|
@target_name = $1
|
73
|
-
@generator =
|
80
|
+
@generator = LALR::ExtensionParserGenerator.new(self)
|
74
81
|
break
|
75
82
|
else
|
76
83
|
error_exit "%class not found."
|
@@ -78,6 +85,9 @@ module Depager
|
|
78
85
|
end
|
79
86
|
@generator.parse_decl
|
80
87
|
end
|
88
|
+
def parsing_method
|
89
|
+
@generator.parsing_method
|
90
|
+
end
|
81
91
|
def error_exit msg, lineno=nil
|
82
92
|
lineno ||= files.lineno
|
83
93
|
warn "#{files.path}:#{lineno}: #{msg}"
|
@@ -126,7 +136,8 @@ module Depager
|
|
126
136
|
end
|
127
137
|
def parse_rule
|
128
138
|
if @token[0] == :NT
|
129
|
-
@
|
139
|
+
@lhs = @token.value
|
140
|
+
|
130
141
|
gettoken
|
131
142
|
postLhs
|
132
143
|
|
@@ -153,7 +164,7 @@ module Depager
|
|
153
164
|
@optval = Array.new(@nparam)
|
154
165
|
preRhs
|
155
166
|
parse_syms
|
156
|
-
@
|
167
|
+
add_rule(@lhs, @rhs, @prec)
|
157
168
|
postRhs
|
158
169
|
@nrhs += 1
|
159
170
|
|
@@ -164,9 +175,7 @@ module Depager
|
|
164
175
|
end
|
165
176
|
def parse_syms
|
166
177
|
if @token.tag == :NT || @token.tag == :T
|
167
|
-
@
|
168
|
-
@rhsni[@token.name] = @rhs.size - 1
|
169
|
-
|
178
|
+
rhs_insert_sym(-1, @token.value, @token.name)
|
170
179
|
gettoken
|
171
180
|
|
172
181
|
postSymbol
|
@@ -266,11 +275,22 @@ module Depager
|
|
266
275
|
# add nonterm
|
267
276
|
# sym:: symbol
|
268
277
|
def add_nonterm sym
|
278
|
+
sym = sym.to_s.intern
|
269
279
|
isym = @nonterms[sym] = @nonterms.size
|
270
280
|
@i2s[isym] = sym
|
271
281
|
return isym
|
272
282
|
end
|
273
283
|
|
284
|
+
#
|
285
|
+
# add rule
|
286
|
+
#
|
287
|
+
def add_rule lhs, rhs, prec=nil
|
288
|
+
@lhs_syms[lhs] = true
|
289
|
+
rule = @parsing_method::Rule[lhs, rhs, prec]
|
290
|
+
@g.push rule
|
291
|
+
return rule
|
292
|
+
end
|
293
|
+
|
274
294
|
# get rhs index by name
|
275
295
|
# name :: name
|
276
296
|
def name_to_rhs_index name
|
@@ -278,41 +298,60 @@ module Depager
|
|
278
298
|
end
|
279
299
|
alias n2ri name_to_rhs_index
|
280
300
|
|
281
|
-
#
|
282
|
-
def
|
283
|
-
|
301
|
+
# insert sym into rhs
|
302
|
+
def rhs_insert_sym pos, token_value, token_name
|
303
|
+
if pos < 0
|
304
|
+
@rhs.push token_value
|
305
|
+
@rhsni[token_name] = @rhs.size - 1
|
306
|
+
@rhs_syms[token_value] = true
|
307
|
+
else
|
308
|
+
@rhsni.each{|k, v| @rhsni[k] += 1 if v >= pos }
|
309
|
+
@rhs.insert(pos, token_value)
|
310
|
+
@rhsni[token_name] = pos
|
311
|
+
@rhs_syms[token_value] = true
|
312
|
+
end
|
284
313
|
end
|
285
314
|
|
286
315
|
attr_accessor :g, :terms, :nonterms, :precs
|
287
316
|
attr_accessor :line, :line0, :oldline, :token
|
288
317
|
attr_accessor :optouter, :optinner, :optmain, :mixin
|
289
|
-
attr_accessor :nparams, :rhs, :nrhs, :rhsni, :nparam, :
|
318
|
+
attr_accessor :nparams, :lhs, :rhs, :nrhs, :rhsni, :nparam, :nrules
|
290
319
|
attr_accessor :prerulelist, :postrulelist, :prerule, :postrule
|
291
320
|
attr_accessor :postlhs, :prerhslist, :postrhslist
|
292
321
|
attr_accessor :prerhs, :postrhs, :postsymbol
|
293
|
-
attr_reader :d_parser, :target_name, :table
|
322
|
+
attr_reader :d_parser, :target_name, :table, :parsing_method
|
294
323
|
|
295
324
|
def initialize d_parser
|
296
325
|
@yydebug = true
|
297
326
|
@d_parser = d_parser
|
298
327
|
|
299
|
-
@i2s = {}
|
300
|
-
|
301
|
-
@g = [Rule[0 , [1]]]
|
302
|
-
@terms = { nil => -1, false => -2 }
|
303
|
-
@nonterms = {'$start' => 0}
|
304
|
-
|
305
328
|
@optinner = []
|
306
329
|
@optouter = []
|
307
330
|
@optmain = []
|
308
|
-
|
309
331
|
@nparams = {}
|
310
332
|
@nparam = 1
|
311
|
-
|
312
333
|
init_hook
|
313
334
|
end
|
314
335
|
|
315
336
|
private
|
337
|
+
# check grammar
|
338
|
+
def check_grammar
|
339
|
+
lhs_warns = []
|
340
|
+
@lhs_syms.each do |s, _|
|
341
|
+
lhs_warns << s if s != 1 and !@rhs_syms[s]
|
342
|
+
end
|
343
|
+
rhs_warns = []
|
344
|
+
@rhs_syms.each do |s, _|
|
345
|
+
rhs_warns << s if s > 0 and !@lhs_syms[s]
|
346
|
+
end
|
347
|
+
lhs_warns.uniq.each do |s|
|
348
|
+
warning "the lhs '#{@i2s[s]}' is not used"
|
349
|
+
end
|
350
|
+
rhs_warns.uniq.each do |s|
|
351
|
+
warning "the symbol '#{@i2s[s]}' is undefined"
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
316
355
|
# make grammar object
|
317
356
|
# precs:: prec infos
|
318
357
|
def make_grammar precs
|
@@ -356,6 +395,15 @@ module Depager
|
|
356
395
|
@postsymbol = []
|
357
396
|
end
|
358
397
|
|
398
|
+
def init_grammar
|
399
|
+
@g = [@parsing_method::Rule[0 , [1]]]
|
400
|
+
@terms = { nil => -1, false => -2 }
|
401
|
+
@nonterms = {'$start' => 0}
|
402
|
+
@i2s = {}
|
403
|
+
@rhs_syms = {}
|
404
|
+
@lhs_syms = {}
|
405
|
+
end
|
406
|
+
|
359
407
|
public
|
360
408
|
# extend paser
|
361
409
|
# ext:: extension name
|
@@ -378,18 +426,29 @@ module Depager
|
|
378
426
|
# mixin:: mixin modules
|
379
427
|
# precs:: prec infos
|
380
428
|
# return:: LALRTable
|
381
|
-
def parse(target_name = nil, mixin = [], precs = [])
|
429
|
+
def parse(target_name = nil, mixin = [], precs = [], pm=nil)
|
382
430
|
@line = @line0 = ''
|
383
431
|
@oldline = nil
|
384
432
|
@target_name = target_name
|
385
433
|
@mixin = mixin
|
434
|
+
@parsing_method = pm || @d_parser.generator.parsing_method
|
386
435
|
|
436
|
+
init_grammar
|
387
437
|
parse_grammar
|
438
|
+
check_grammar
|
388
439
|
make_grammar precs
|
389
|
-
@table =
|
440
|
+
@table = @parsing_method::Table.new(
|
441
|
+
@parsing_method::Grammar.new(@g, @terms, @nonterms, @precs))
|
442
|
+
@table.check_table @d_parser
|
443
|
+
@table
|
390
444
|
end
|
391
445
|
end
|
392
446
|
|
447
|
+
#
|
448
|
+
# generators
|
449
|
+
#
|
450
|
+
|
451
|
+
# Generator base
|
393
452
|
class Generator
|
394
453
|
include FileUtils
|
395
454
|
def files
|
@@ -403,11 +462,12 @@ module Depager
|
|
403
462
|
def tmplf
|
404
463
|
self.class::Tmplfile
|
405
464
|
end
|
406
|
-
attr_reader :d_parser
|
465
|
+
attr_reader :d_parser, :parsing_method
|
407
466
|
attr_accessor :optouter, :optinner, :optmain
|
408
467
|
attr_accessor :basis_name, :deco, :req
|
409
468
|
def initialize d_parser
|
410
469
|
@d_parser = d_parser
|
470
|
+
@parsing_method = nil
|
411
471
|
@basis_name = nil
|
412
472
|
|
413
473
|
@deco = []
|
@@ -488,121 +548,128 @@ module Depager
|
|
488
548
|
end
|
489
549
|
end
|
490
550
|
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
551
|
+
|
552
|
+
module Simple
|
553
|
+
class G
|
554
|
+
def initialize *args
|
555
|
+
end
|
495
556
|
end
|
496
|
-
|
497
|
-
|
557
|
+
class Table
|
558
|
+
def initialize *args
|
559
|
+
end
|
498
560
|
end
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
561
|
+
class SingleGenerator < Generator
|
562
|
+
Tmplfile = 'simple.erb'
|
563
|
+
def initialize d_parser
|
564
|
+
super
|
565
|
+
@parsing_method = Simple
|
566
|
+
end
|
567
|
+
def out_code g_parser
|
568
|
+
ERB.new(File.read("#{tmpldir}/#{tmplf}")).result(binding)
|
569
|
+
end
|
570
|
+
def parse_decl
|
571
|
+
until eof?
|
572
|
+
line = getline
|
573
|
+
case line
|
574
|
+
when /^%%\s*$/
|
575
|
+
g_parser = GrammarParser.new(@d_parser)
|
576
|
+
g_parser.extend_paser @ext
|
577
|
+
g_parser.parse(@d_parser.target_name, @mixin, @precs)
|
578
|
+
@optmain.push parse_block
|
579
|
+
return out_code(g_parser)
|
580
|
+
else
|
581
|
+
parse_common(line)
|
582
|
+
end
|
511
583
|
end
|
584
|
+
return nil
|
512
585
|
end
|
513
|
-
return nil
|
514
586
|
end
|
515
|
-
end
|
516
587
|
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
@basis_name = 'self'
|
530
|
-
@paramkey = nil
|
531
|
-
@regs = {
|
532
|
-
"prerulelist" => nil,
|
533
|
-
"postrulelist" => nil,
|
588
|
+
class ExtensionGenerator < Generator
|
589
|
+
TmplfileMaster = '**NOTHING**'
|
590
|
+
TmplfileSlave = '**NOTHING**'
|
591
|
+
attr_accessor :regs, :paramkey
|
592
|
+
def initialize d_parser
|
593
|
+
super
|
594
|
+
@parsing_method = Simple
|
595
|
+
@basis_name = 'self'
|
596
|
+
@paramkey = nil
|
597
|
+
@regs = {
|
598
|
+
"prerulelist" => nil,
|
599
|
+
"postrulelist" => nil,
|
534
600
|
|
535
|
-
|
536
|
-
|
601
|
+
"prerule" => nil,
|
602
|
+
"postrule" => nil,
|
537
603
|
|
538
|
-
|
604
|
+
"postlhs" => nil,
|
539
605
|
|
540
|
-
|
541
|
-
|
606
|
+
"postrhslist" => nil,
|
607
|
+
"prerhslist" => nil,
|
542
608
|
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
609
|
+
"prerhs" => nil,
|
610
|
+
"postrhs" => nil,
|
611
|
+
}
|
612
|
+
end
|
547
613
|
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
614
|
+
def parse_decl
|
615
|
+
until eof?
|
616
|
+
line = getline
|
617
|
+
case line
|
618
|
+
when /^%hook\s*(.*?)\s*$/
|
619
|
+
hs = $1
|
620
|
+
mtsk = if hs =~ /\/(([^\/\\]+|\\.)*)\/\s*(skip)?$/
|
621
|
+
hs = $`
|
622
|
+
[$1, $3 ? true : false]
|
623
|
+
end
|
624
|
+
hook = hs.split(' ')
|
625
|
+
hookname = hook.join('_')
|
626
|
+
hook.each{|i| @regs[i] = [i, "#{@d_parser.target_name}_#{hookname}"]}
|
627
|
+
@optouter.push(parse_hook(hookname, mtsk))
|
628
|
+
when /^%param\s*(.*)\s*$/
|
629
|
+
@paramkey = $1
|
630
|
+
else
|
631
|
+
parse_common(line)
|
632
|
+
end
|
566
633
|
end
|
634
|
+
return out_master_code
|
567
635
|
end
|
568
|
-
return out_master_code
|
569
|
-
end
|
570
636
|
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
637
|
+
def parse_hook hookname, mtsk
|
638
|
+
inner = ''
|
639
|
+
precs = []
|
640
|
+
banner = nil
|
641
|
+
mixin = [].concat(@mixin)
|
642
|
+
target_name = "#{@d_parser.target_name}_#{hookname}"
|
643
|
+
until eof?
|
644
|
+
line = getline
|
645
|
+
case line
|
646
|
+
when /^%banner\s*'(([^'\\]+|\\.)*)'\s*$/
|
647
|
+
banner = $1
|
648
|
+
when /^%inner\s*\{\s*$/
|
649
|
+
inner = parse_block
|
650
|
+
when /^%mixin\s*(.+?)\s*(\((.+)\)\s*)?$/
|
651
|
+
mixin.push $1
|
652
|
+
@req.push $3 if $3
|
653
|
+
when /^%prec\s*(.*?)\s*$/
|
654
|
+
precs = parse_prec
|
655
|
+
when /^%%\s*$/
|
656
|
+
g_parser = GrammarParser.new(@d_parser)
|
657
|
+
g_parser.extend_paser @ext
|
658
|
+
g_parser.parse(target_name, mixin, precs)
|
659
|
+
g_parser.optinner.push inner
|
660
|
+
return out_slave_code(g_parser, mixin, mtsk, banner)
|
661
|
+
else
|
662
|
+
warning "syntax error(declaration).\n> #{line}", lineno
|
663
|
+
end
|
597
664
|
end
|
598
665
|
end
|
599
|
-
end
|
600
666
|
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
667
|
+
def out_slave_code g_parser, mixin, mtsk, banner
|
668
|
+
ERB.new(File.read(self.class::TmplfileSlave)).result(binding)
|
669
|
+
end
|
670
|
+
def out_master_code
|
671
|
+
ERB.new(File.read(self.class::TmplfileMaster)).result(binding)
|
672
|
+
end
|
606
673
|
end
|
607
674
|
end
|
608
675
|
end
|