Class RDoc::Fortran95parser
In: parsers/parse_f95.rb
Parent: Object

See rdoc/parsers/parse_f95.rb

Methods

new   scan  

Classes and Modules

Class RDoc::Fortran95parser::Fortran95Definition

Constants

COMMENTS_ARE_UPPER = false  
"false":Comments are below source code
"true" :Comments are upper source code
INTERNAL_ALIAS_MES = "Alias for"   Internal alias message
EXTERNAL_ALIAS_MES = "The entity is"   External alias message

Public Class methods

prepare to parse a Fortran 95 file

[Source]

     # File parsers/parse_f95.rb, line 386
386:     def initialize(top_level, file_name, body, options, stats)
387:       @body = body
388:       @stats = stats
389:       @file_name  = file_name
390:       @options = options
391:       @top_level = top_level
392:       @progress = $stderr unless options.quiet
393:     end

Public Instance methods

devine code constructs

[Source]

     # File parsers/parse_f95.rb, line 396
396:     def scan
397: 
398:       # remove private comment
399:       remaining_code = remove_private_comments(@body)
400: 
401:       # continuation lines are united to one line
402:       remaining_code = united_to_one_line(remaining_code)
403: 
404:       # collect comment for file entity
405:       whole_comment, remaining_code = collect_first_comment(remaining_code)
406:       @top_level.comment = whole_comment
407: 
408:       # "module" parts are parsed
409:       #
410:       while remaining_code =~ /^\s*?module\s+(\w+)\s*?(!.*?)?$(.*?)^\s*?end\s+module.*?$/im
411:         remaining_code = $~.pre_match
412:         remaining_code << $~.post_match
413:         module_code = remove_empty_head_lines($&)
414:         module_name = $1
415:         f9x_trailing = find_comments($2)
416:         next if f9x_trailing =~ /^:nodoc:/
417:         progress "m"
418:         @stats.num_modules += 1
419:         f9x_module = @top_level.add_module NormalClass, module_name
420:         f9x_module.record_location @top_level
421: 
422:         f9x_comment = COMMENTS_ARE_UPPER ? 
423:           find_comments($~.pre_match)  + "\n" + f9x_trailing :
424:             f9x_trailing + "\n" + find_comments(module_code.sub(/^.*$\n/i, ''))
425:         f9x_module.comment = f9x_comment
426:         parse_program_or_module(f9x_module, module_code)
427: 
428:         TopLevel.all_files.each do |name, toplevel|
429:           if toplevel.include_includes?(module_name, @options.ignore_case)
430:             if !toplevel.include_requires?(@file_name, @options.ignore_case)
431:               toplevel.add_require(Require.new(@file_name, ""))
432:             end
433:           end
434:           toplevel.each_classmodule{|m|
435:             if m.include_includes?(module_name, @options.ignore_case)
436:               if !m.include_requires?(@file_name, @options.ignore_case)
437:                 m.add_require(Require.new(@file_name, ""))
438:               end
439:             end
440:           }
441:         end
442:       end
443: 
444:       # "program" parts are parsed
445:       #
446:       # contains 以下の内部サブルーチンが存在するなど,
447:       # サブプログラムの集まりとは少々違うため.
448:       #
449:       while remaining_code =~ /^\s*?program\s+(\w+)\s*?(!.*?)?$(.*?)^\s*?end\s+program.*?$/im
450:         remaining_code = $~.pre_match
451:         remaining_code << $~.post_match
452:         program_code = remove_empty_head_lines($&)
453:         progress "p"
454:         program_name = $1
455:         program_trailing = find_comments($2)
456:         program_comment = COMMENTS_ARE_UPPER ? 
457:           find_comments($~.pre_match) + "\n" + program_trailing : 
458:             program_trailing + "\n" + find_comments(program_code.sub(/^.*$\n/i, ''))
459:         program_comment = "\n\n= <i>Program</i> <tt>#{program_name}</tt>\n\n" \
460:                           + program_comment
461:         @top_level.comment << program_comment
462:         parse_program_or_module(@top_level, program_code, :private)
463:       end
464: 
465:       # External subprograms and functions are parsed
466:       #
467:       # 単一のファイル内において program や module に格納されない,
468:       # 外部サブルーチン, 外部関数部分の解析.
469:       #
470:       parse_program_or_module(@top_level, remaining_code, :public, true)
471: 
472:       @top_level
473:     end

[Validate]