Class: AtCoderFriends::CxxGenerator
- Inherits:
-
Object
- Object
- AtCoderFriends::CxxGenerator
- Defined in:
- lib/at_coder_friends/cxx_generator.rb
Overview
generates C++ source code from definition
Constant Summary collapse
- TEMPLATE =
rubocop:disable Style/FormatStringToken
"#include <cstdio>\n\nusing namespace std;\n\n#define REP(i,n) for(int i=0; i<(int)(n); i++)\n#define FOR(i,b,e) for(int i=(b); i<=(int)(e); i++)\n\n/*** CONSTS ***/\n\n/*** DCLS ***/\n\nvoid solve() {\n int ans = 0;\n printf(\"%d\\\\n\", ans);\n}\n\nvoid input() {\n/*** READS ***/\n}\n\nint main() {\n input();\n solve();\n return 0;\n}\n"- SCANF_FMTS =
rubocop:enable Style/FormatStringToken
[ 'scanf("%<fmt>s", %<addr>s);', 'REP(i, %<sz1>s) scanf("%<fmt>s", %<addr>s);', 'REP(i, %<sz1>s) REP(j, %<sz2>s) scanf("%<fmt>s", %<addr>s);' ].freeze
- FMT_FMTS =
rubocop:disable Style/FormatStringToken
{ number: '%d', string: '%s', char: '%s' }.freeze
- ADDR_FMTS =
rubocop:enable Style/FormatStringToken
{ single: { number: '&%<v>s', string: '%<v>s' }, harray: { number: '%<v>s + i', string: '%<v>s[i]', char: '%<v>s' }, varray: { number: '%<v>s + i', string: '%<v>s[i]' }, matrix: { number: '&%<v>s[i][j]', string: '%<v>s[i][j]', char: '%<v>s[i]' } }.freeze
Instance Method Summary collapse
- #gen_arr_size(szs) ⇒ Object
- #gen_consts(desc) ⇒ Object
- #gen_decl(inpdef) ⇒ Object
- #gen_decls(defs) ⇒ Object
- #gen_harray_decl(inpdef) ⇒ Object
- #gen_matrix_decl(inpdef) ⇒ Object
-
#gen_read(inpdef) ⇒ Object
rubocop:disable Metrics/AbcSize.
- #gen_reads(defs) ⇒ Object
- #gen_single_decl(inpdef) ⇒ Object
- #gen_varray_decl(inpdef) ⇒ Object
- #generate(defs, desc) ⇒ Object
- #process(pbm) ⇒ Object
Instance Method Details
#gen_arr_size(szs) ⇒ Object
159 160 161 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 159 def gen_arr_size(szs) szs.map { |sz| sz =~ /\D/ ? "#{sz.upcase}_MAX" : sz } end |
#gen_consts(desc) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 82 def gen_consts(desc) desc .gsub(/[,\\\(\)\{\}\|]/, '') .gsub(/(≤|leq)/i, '≦') .scan(/([\da-z_]+)\s*≦\s*(\d+)(?:\^(\d+))?/i) .map do |v, sz, k| sz = sz.to_i sz **= k.to_i if k "const int #{v.upcase}_MAX = #{sz};" end end |
#gen_decl(inpdef) ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 98 def gen_decl(inpdef) case inpdef.container when :single gen_single_decl(inpdef) when :harray gen_harray_decl(inpdef) when :varray gen_varray_decl(inpdef) when :matrix gen_matrix_decl(inpdef) end end |
#gen_decls(defs) ⇒ Object
94 95 96 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 94 def gen_decls(defs) defs.map { |inpdef| gen_decl(inpdef) }.flatten end |
#gen_harray_decl(inpdef) ⇒ Object
122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 122 def gen_harray_decl(inpdef) v = inpdef.names[0] sz = gen_arr_size(inpdef.size)[0] case inpdef.item when :number "int #{v}[#{sz}];" when :string "char #{v}[#{sz}][#{v.upcase}_MAX + 1];" when :char "char #{v}[#{sz} + 1];" end end |
#gen_matrix_decl(inpdef) ⇒ Object
146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 146 def gen_matrix_decl(inpdef) v = inpdef.names[0] sz1, sz2 = gen_arr_size(inpdef.size) case inpdef.item when :number "int #{v}[#{sz1}][#{sz2}];" when :string "char #{v}[#{sz1}][#{sz2}][#{v.upcase}_MAX + 1];" when :char "char #{v}[#{sz1}][#{sz2} + 1];" end end |
#gen_read(inpdef) ⇒ Object
rubocop:disable Metrics/AbcSize
168 169 170 171 172 173 174 175 176 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 168 def gen_read(inpdef) dim = inpdef.size.size - (inpdef.item == :char ? 1 : 0) scanf = SCANF_FMTS[dim] sz1, sz2 = inpdef.size fmt = FMT_FMTS[inpdef.item] * inpdef.names.size addr_fmt = ADDR_FMTS[inpdef.container][inpdef.item] addr = inpdef.names.map { |v| format(addr_fmt, v: v) }.join(', ') format(scanf, sz1: sz1, sz2: sz2, fmt: fmt, addr: addr) end |
#gen_reads(defs) ⇒ Object
163 164 165 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 163 def gen_reads(defs) defs.map { |inpdef| gen_read(inpdef) }.flatten end |
#gen_single_decl(inpdef) ⇒ Object
111 112 113 114 115 116 117 118 119 120 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 111 def gen_single_decl(inpdef) names = inpdef.names case inpdef.item when :number dcl = names.join(', ') "int #{dcl};" when :string names.map { |v| "char #{v}[#{v.upcase}_MAX + 1];" } end end |
#gen_varray_decl(inpdef) ⇒ Object
135 136 137 138 139 140 141 142 143 144 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 135 def gen_varray_decl(inpdef) names = inpdef.names sz = gen_arr_size(inpdef.size)[0] case inpdef.item when :number names.map { |v| "int #{v}[#{sz}];" } when :string names.map { |v| "char #{v}[#{sz}][#{v.upcase}_MAX + 1];" } end end |
#generate(defs, desc) ⇒ Object
72 73 74 75 76 77 78 79 80 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 72 def generate(defs, desc) consts = gen_consts(desc) dcls = gen_decls(defs) reads = gen_reads(defs) TEMPLATE .sub('/*** CONSTS ***/', consts.join("\n")) .sub('/*** DCLS ***/', dcls.join("\n")) .sub('/*** READS ***/', reads.map { |s| ' ' + s }.join("\n")) end |
#process(pbm) ⇒ Object
67 68 69 70 |
# File 'lib/at_coder_friends/cxx_generator.rb', line 67 def process(pbm) src = generate(pbm.defs, pbm.desc) pbm.add_src(:cxx, src) end |