Changeset cb9fc3d121e39e788a2874d98bcb25256263d7ff
- Timestamp:
- 06/30/2008 02:18:05 AM (2 months ago)
- git-parent:
- Files:
-
- ext/ohcount_native/ragel_parser.c (modified) (10 diffs)
- ext/ohcount_native/ragel_parsers/classic_basic.rl (added)
- ext/ohcount_native/ragel_parsers/eiffel.rl (added)
- ext/ohcount_native/ragel_parsers/haml.rl (added)
- ext/ohcount_native/ragel_parsers/haskell.rl (modified) (2 diffs)
- ext/ohcount_native/ragel_parsers/ocaml.rl (added)
- ext/ohcount_native/ragel_parsers/structured_basic.rl (added)
- ext/ohcount_native/ragel_parsers/visual_basic.rl (modified) (1 diff)
- lib/ohcount/detector.rb (modified) (6 diffs)
- lib/ohcount/sloc_info.rb (modified) (4 diffs)
- test/detect_files/basic/structured_basic.bas (added)
- test/detect_files/classic_basic.b (added)
- test/detect_files/eiffel.e (added)
- test/detect_files/frx1.frx (added)
- test/detect_files/ocaml.ml (added)
- test/detect_files/structured_basic.b (added)
- test/detect_files/visual_basic.bas (added)
- test/expected_dir/classic_basic.b/classic_basic/blanks (added)
- test/expected_dir/classic_basic.b/classic_basic/code (added)
- test/expected_dir/classic_basic.b/classic_basic/comment (added)
- test/expected_dir/classic_basic.bas/classic_basic/blanks (added)
- test/expected_dir/classic_basic.bas/classic_basic/code (added)
- test/expected_dir/classic_basic.bas/classic_basic/comment (added)
- test/expected_dir/eiffel.e/eiffel/blanks (added)
- test/expected_dir/eiffel.e/eiffel/code (added)
- test/expected_dir/eiffel.e/eiffel/comment (added)
- test/expected_dir/haml.haml/haml/blanks (added)
- test/expected_dir/haml.haml/haml/code (added)
- test/expected_dir/haml.haml/haml/comment (added)
- test/expected_dir/haskell3.hs/haskell/blanks (added)
- test/expected_dir/haskell3.hs/haskell/code (added)
- test/expected_dir/haskell3.hs/haskell/comment (added)
- test/expected_dir/ocaml.ml/ocaml/blanks (added)
- test/expected_dir/ocaml.ml/ocaml/code (added)
- test/expected_dir/ocaml.ml/ocaml/comment (added)
- test/expected_dir/structured_basic.b/structured_basic/blanks (added)
- test/expected_dir/structured_basic.b/structured_basic/code (added)
- test/expected_dir/structured_basic.b/structured_basic/comment (added)
- test/expected_dir/structured_basic.bas/structured_basic/blanks (added)
- test/expected_dir/structured_basic.bas/structured_basic/code (added)
- test/expected_dir/structured_basic.bas/structured_basic/comment (added)
- test/expected_dir/visual_basic.bas/visualbasic/blanks (added)
- test/expected_dir/visual_basic.bas/visualbasic/code (added)
- test/expected_dir/visual_basic.bas/visualbasic/comment (added)
- test/src_dir/classic_basic.b (added)
- test/src_dir/classic_basic.bas (added)
- test/src_dir/eiffel.e (added)
- test/src_dir/haml.haml (added)
- test/src_dir/haskell3.hs (added)
- test/src_dir/ocaml.ml (added)
- test/src_dir/structured_basic.b (added)
- test/src_dir/structured_basic.bas (added)
- test/src_dir/visual_basic.bas (added)
- test/unit/basic_test.rb (added)
- test/unit/detector_test.rb (modified) (3 diffs)
- test/unit/eiffel_test.rb (added)
- test/unit/haml_test.rb (added)
- test/unit/haskell_test.rb (modified) (1 diff)
- test/unit/ocaml_test.rb (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
ext/ohcount_native/ragel_parser.c
r676dc44 rcb9fc3d 14 14 #include "boo_parser.h" 15 15 #include "c_parser.h" 16 #include "classic_basic_parser.h" 16 17 #include "clearsilver_parser.h" 17 18 #include "clearsilverhtml_parser.h" … … 21 22 #include "dylan_parser.h" 22 23 #include "ebuild_parser.h" 24 #include "eiffel_parser.h" 23 25 #include "erlang_parser.h" 24 26 #include "exheres_parser.h" … … 27 29 #include "groovy_parser.h" 28 30 #include "haskell_parser.h" 31 #include "haml_parser.h" 29 32 #include "html_parser.h" 30 33 #include "java_parser.h" … … 40 43 #include "mxml_parser.h" 41 44 #include "objective_c_parser.h" 45 #include "ocaml_parser.h" 42 46 #include "pascal_parser.h" 43 47 #include "perl_parser.h" … … 51 55 #include "shell_parser.h" 52 56 #include "smalltalk_parser.h" 57 #include "structured_basic_parser.h" 53 58 #include "sql_parser.h" 54 59 #include "tcl_parser.h" … … 82 87 { "boo", parse_boo }, 83 88 { "c", parse_c }, 89 { "classic_basic", parse_classic_basic }, 84 90 { "clearsilver", parse_clearsilver }, 85 91 { "clearsilver_template", parse_cshtml }, … … 91 97 { "dylan", parse_dylan }, 92 98 { "ebuild", parse_ebuild }, 99 { "eiffel", parse_eiffel }, 93 100 { "erlang", parse_erlang }, 94 101 { "exheres", parse_exheres }, … … 98 105 { "groovy", parse_groovy }, 99 106 { "haskell", parse_haskell }, 107 { "haml", parse_haml }, 100 108 { "html", parse_html }, 101 109 { "java", parse_java }, … … 111 119 { "mxml", parse_mxml }, 112 120 { "objective_c", parse_objective_c }, 121 { "ocaml", parse_ocaml }, 113 122 { "pascal", parse_pascal }, 114 123 { "perl", parse_perl }, … … 123 132 { "shell", parse_shell }, 124 133 { "smalltalk", parse_smalltalk }, 134 { "structured_basic", parse_structured_basic }, 125 135 { "sql", parse_sql }, 126 136 { "tcl", parse_tcl }, ext/ohcount_native/ragel_parsers/haskell.rl
r0b4bd62 rcb9fc3d 45 45 } 46 46 47 action haskell_comment_nc_res { nest_count = 0; } 48 action haskell_comment_nc_inc { nest_count++; } 49 action haskell_comment_nc_dec { nest_count--; } 50 47 51 # TODO: |-- is not a comment 48 52 haskell_line_comment = '--' [^>] @{ fhold; } @comment nonnewline*; 49 haskell_ block_comment =50 '{-' @comment (53 haskell_nested_block_comment = 54 '{-' >haskell_comment_nc_res @comment ( 51 55 newline %{ entity = INTERNAL_NL; } %haskell_ccallback 52 56 | 53 57 ws 58 | 59 '{-' @haskell_comment_nc_inc @comment 60 | 61 '-}' @haskell_comment_nc_dec @comment 54 62 | 55 63 (nonnewline - ws) @comment 56 )* :>> '-}';57 haskell_comment = haskell_line_comment | haskell_ block_comment;64 )* :>> ('-}' when { nest_count == 0 }) @comment; 65 haskell_comment = haskell_line_comment | haskell_nested_block_comment; 58 66 59 67 haskell_char = '\'' @code ([^\r\n\f'\\] | '\\' nonnewline) '\''; … … 105 113 init 106 114 115 int nest_count = 0; 116 107 117 %% write init; 108 118 cs = (count) ? haskell_en_haskell_line : haskell_en_haskell_entity; ext/ohcount_native/ragel_parsers/visual_basic.rl
r242cbc6 rcb9fc3d 45 45 } 46 46 47 vb_comment = '\''@comment nonnewline*;47 vb_comment = ('\'' | /rem/i) @comment nonnewline*; 48 48 49 49 vb_string = '"' @code ([^\r\n\f"\\] | '\\' nonnewline)* '"'; lib/ohcount/detector.rb
r1fabcc0 rcb9fc3d 27 27 # is stored here to avoid checking twice. 28 28 attr_accessor :contains_pike_or_pmod 29 end 30 31 module ContainsVB 32 # A performance hack -- once we've checked for the presence of *.frx, *.frm and *.vbp files, the result 33 # is stored here to avoid checking twice. 34 attr_accessor :contains_vb 29 35 end 30 36 … … 110 116 '.asm' => "assembler", 111 117 '.awk' => "awk", 112 '.bas' => "visualbasic", 118 '.b' => :disambiguate_non_visual_basic, 119 '.bas' => :disambiguate_basic, 113 120 '.bat' => "bat", 121 '.bi' => :disambiguate_non_visual_basic, 114 122 '.boo' => "boo", 115 123 '.c' => "c", … … 126 134 '.cs' => :disambiguate_cs, 127 135 '.dylan'=> "dylan", 136 '.e' => "eiffel", 128 137 '.ebuild'=> "ebuild", 129 138 '.eclass'=> "ebuild", … … 147 156 '.h' => :disambiguate_h_header, 148 157 '.H' => "cpp", 158 '.haml' => "haml", 149 159 '.hpp' => "cpp", 150 160 '.h++' => "cpp", … … 166 176 '.mf' => 'metafont', 167 177 '.mk' => 'make', 178 '.ml' => "ocaml", 179 '.mli' => "ocaml", 168 180 '.mm' => "objective_c", 169 181 '.mp' => 'metapost_with_tex', … … 492 504 end 493 505 506 # Attempts to tell apart VB, classic BASIC and structured BASIC. 507 # First, checks if it is classic BASIC based on syntax. 508 # If not checks for .vb, .vbp, .frx and .frm files (associated with VB) 509 # in file context 510 # 511 # If these files are absent, assumes structured BASIC 512 # 513 def self.disambiguate_basic(file_context) 514 classic_basic_line = /^\d+\s+\w+.*$/ 515 vb_filename = /\.fr[mx]$|\.vb([aps]?)$/ 516 buffer = file_context.contents 517 if lines_matching(buffer,classic_basic_line) > 0 518 return 'classic_basic' 519 else 520 unless defined?(file_context.filenames.contains_vb) 521 file_context.filenames.extend(ContainsVB) 522 file_context.filenames.contains_vb = file_context.filenames.select { |a| a =~ vb_filename }.any? 523 end 524 if file_context.filenames.contains_vb 525 return 'visualbasic' 526 else 527 return 'structured_basic' 528 end 529 end 530 end 531 532 def self.disambiguate_non_visual_basic(file_context) 533 classic_basic_line = /^\d+\s+\w+.*$/ 534 buffer = file_context.contents 535 536 if lines_matching(buffer,classic_basic_line) > 0 537 return 'classic_basic' 538 else 539 return 'structured_basic' 540 end 541 end 542 494 543 # Attempts to determine the Polyglot for files that do not have a 495 544 # filename extension. lib/ohcount/sloc_info.rb
r5bdc29e rcb9fc3d 49 49 'boo' => {:nice_name => 'Boo' , :category => 0}, 50 50 'c' => {:nice_name => 'C' , :category => 0}, 51 'classic_basic' => {:nice_name => 'Classic Basic' , :category => 0}, 51 52 'cpp' => {:nice_name => 'C++' , :category => 0}, 52 53 'clearsilver' => {:nice_name => 'ClearSilver' , :category => 0}, … … 56 57 'dylan' => {:nice_name => 'Dylan' , :category => 0}, 57 58 'ebuild' => {:nice_name => 'Ebuild' , :category => 0}, 59 'eiffel' => {:nice_name => 'Eiffel' , :category => 0}, 58 60 'emacslisp' => {:nice_name => 'Emacs Lisp' , :category => 0}, 59 61 'erlang' => {:nice_name => 'Erlang' , :category => 0}, … … 73 75 'mxml' => {:nice_name => 'Flex' , :category => 1}, 74 76 'objective_c' => {:nice_name => 'Objective C' , :category => 0}, 77 'ocaml' => {:nice_name => 'Objective Caml' , :category => 0}, 75 78 'pascal' => {:nice_name => 'Pascal' , :category => 0}, 76 79 'perl' => {:nice_name => 'Perl' , :category => 0}, … … 84 87 'shell' => {:nice_name => 'shell script' , :category => 0}, 85 88 'smalltalk' => {:nice_name => 'Smalltalk' , :category => 0}, 89 'structured_basic' => {:nice_name => 'Structured Basic' , :category => 0}, 86 90 'sql' => {:nice_name => 'SQL' , :category => 0}, 87 91 'tcl' => {:nice_name => 'Tcl' , :category => 0}, test/unit/detector_test.rb
r53b5981 rcb9fc3d 23 23 def do_detect(filename, filenames = []) 24 24 file_location = File.dirname(__FILE__) + "/../detect_files/" + filename 25 sfc = Ohcount::SimpleFileContext.new(filename, filenames, nil, file_location) 26 Ohcount::Detector.detect(sfc) 27 end 28 29 # Nonrecursively adds files from the file's directory to the context 30 def do_detect_with_siblings(filename) 31 file_location = File.dirname(__FILE__) + "/../detect_files/" + filename 32 filenames = Dir.entries(File.dirname(__FILE__) + File.dirname("/../detect_files/" + filename)) - [filename] 25 33 sfc = Ohcount::SimpleFileContext.new(filename, filenames, nil, file_location) 26 34 Ohcount::Detector.detect(sfc) … … 61 69 assert_equal "exheres", do_detect("foo.exheres-0") 62 70 assert_equal "exheres", do_detect("foo.exlib") 71 assert_equal "eiffel", do_detect("eiffel.e") 72 assert_equal "ocaml", do_detect("ocaml.ml") 63 73 end 64 74 … … 89 99 end 90 100 101 def test_basic 102 assert_equal "structured_basic", do_detect("visual_basic.bas") 103 assert_equal "visualbasic", do_detect("visual_basic.bas", ["frx1.frx"]) 104 assert_equal "classic_basic", do_detect("classic_basic.b") 105 assert_equal "structured_basic", do_detect("structured_basic.b") 106 end 107 91 108 end 92 109 test/unit/haskell_test.rb
r5a0bfaf rcb9fc3d 17 17 verify_parse("haskell2.hs") 18 18 end 19 20 def test_comprehensive_with_nested_comments 21 verify_parse("haskell3.hs") 22 end 19 23 end 20 24