3 require 'escape_helper'
5 # So that monoglot and polyglot source files can easily require eachother
6 $LOAD_PATH << File.join(File.dirname(__FILE__), 'glots')
8 # Load all monoglots and polyglots
9 Dir.glob(File.join(File.dirname(__FILE__), 'glots/*.rb')).each {|f| require f }
15 # This script loads all of the Monoglot and Polyglot files found in
16 # <tt>ext/ohcount_native/glots</tt>.
18 # These glots are used to generate the C file polyglots.c, which will define
19 # all of the languages parsers used by ohcount. Do not edit polyglots.c directly.
22 # Defines all of the monoglots and polyglots known to the parser.
23 ada = CMonoglot.new("ada", '--', nil, true, false)
24 assembler = CMonoglot.new("assembler", [';', '!', '//'], [e('/*'), e('*/')], false, false)
25 awk = CMonoglot.new("awk", '#', nil, true, false, {:no_escape_dquote => true})
26 bat = LineCommentMonoglot.new("bat", '^\\\\s*(?i)REM(?-i)')
27 boo = PythonMonoglot.new("boo")
28 clearsilver = CMonoglot.new("clearsilver", '#', nil, true, true)
29 c = CMonoglot.new("c", '//', [e('/*'), e('*/')], true, true)
30 cpp = CMonoglot.new("cpp", '//', [e('/*'), e('*/')], true, true)
31 csharp = CMonoglot.new("csharp", '//', [e('/*'), e('*/')], true, false)
32 css = CMonoglot.new("css", nil, [e('/*'), e('*/')], false, false)
33 dcl = DclMonoglot.new("dcl")
34 dylan = CMonoglot.new("dylan", '//', nil, true, false)
35 ebuild = CMonoglot.new("ebuild", '#', nil, false, false)
36 erlang = CMonoglot.new("erlang", '%%', nil, true, true)
37 java = CMonoglot.new("java", '//', [e('/*'), e('*/')], true, false)
38 javascript = CMonoglot.new("javascript", '//', [e('/*'), e('*/')], true, true)
39 emacslisp = LineCommentMonoglot.new("emacslisp", ";")
40 fortranfixed = CMonoglot.new("fortranfixed", '^[^ \n]', nil, true, true, {:no_escape_dquote => true, :no_escape_squote => true})
41 fortranfree = CMonoglot.new("fortranfree", '!', nil, true, true, {:no_escape_dquote => true, :no_escape_squote => true})
42 haskell = CMonoglot.new("haskell", '--', [e('{-'), e('-}')], true, false)
43 lisp = LineCommentMonoglot.new("lisp", ";")
44 lua = CMonoglot.new("lua", '--', nil, true, true)
45 matlab = CMonoglot.new("matlab", '#|%', ['{%', '%}'], false,true)
46 metafont = LineCommentMonoglot.new("metafont", "%");
47 metapost = LineCommentMonoglot.new("metapost", "%");
48 objective_c = CMonoglot.new("objective_c", '//', [e('/*'), e('*/')], true, false)
49 pascal = CMonoglot.new("pascal", '//', ['{','}'], true, true, {:no_escape_dquote => true, :no_escape_squote => true})
50 perl = CMonoglot.new("perl", '#', ['^=\\\\w+', '^=cut[ \t]*\\\\n'], true, true)
51 phplanguage = CMonoglot.new("php", '//', [e('/*'), e('*/')], true, true, {:polyglot_name => 'phplanguage'})
52 pike = CMonoglot.new("pike", '//', [e('/*'), e('*/')], true, false)
53 python = PythonMonoglot.new("python")
54 ruby = CMonoglot.new("ruby", '#', nil, true, true)
55 rexx = CMonoglot.new("rexx", nil, [e('/*'), e('*/')], true, true)
56 scheme = LineCommentMonoglot.new("scheme", ";")
57 shell = CMonoglot.new("shell", '#', nil, false, false)
58 smalltalk = CMonoglot.new("smalltalk", nil, [e('"'), e('"')], false, true, options = {:no_escape_squote => true})
59 sql = CMonoglot.new("sql", ['--','//'], [['{','}'], [e('/*'), e('*/')]], true, true)
60 tcl = CMonoglot.new("tcl", '#', nil, true, false)
61 vala = CMonoglot.new("vala", '//', [e('/*'), e('*/')], true, false)
62 vim = CMonoglot.new("vim", '\"', nil, false, false)
63 visualbasic = CMonoglot.new("visualbasic", '\'', nil, true, false)
64 xml = XmlMonoglot.new("xml")
65 xslt = XmlMonoglot.new("xslt")
66 xmlschema = XmlMonoglot.new("xmlschema")
67 html = HtmlPolyglot.new("html", javascript, css)
68 php = HtmlWithPhpPolyglot.new("php", html, phplanguage)
69 rhtml = RhtmlPolyglot.new("rhtml", html, ruby)
70 jsp = JspPolyglot.new("jsp", html, java)
71 groovy = CMonoglot.new("groovy", '//', [e('/*'), e('*/')], true, false)
72 clearsilver_template = ClearsilverTemplate.new("clearsilver_template", html, clearsilver)
73 dmd = DMonoglot.new('dmd')
74 tex = CMonoglot.new("tex", '%', nil, false, false)
75 metapost_with_tex = Biglot.new('metapost_with_tex', metapost, tex, [], [
76 ["verbatimtex", :metapost_code, :tex_code, :from, false, 'verbatim'],
77 ["btex", :metapost_code, :tex_code, :from, false, 'btex'],
78 ["etex", :tex_code, :return, :to, false, 'etex']
133 clearsilver_template,
137 File.open("polyglots.c", "w") do |io|
139 # spit out the preamble to our source code
145 * GENERATED FILE **DO NOT EDIT**
149 #define __polyglots_c__
152 #define RETURN (State *)NULL
155 # spits out the actual POLYGLOTS array, which contains a reference to all the polyglots we define in our library
156 polyglots.each do |p|
160 Monoglot::print_banner(io, "POLYGLOTS")
161 io.puts "Polyglot *POLYGLOTS[] = {"
162 polyglots.each do |p|
163 io.puts " &#{ p.definition },"
171 Ohcount::Generator.new.generate