Sha256: 0f2eb23eee5515504478d459b35eb0a218138ff205ed772055098c9060ebad5b

Contents?: true

Size: 1.5 KB

Versions: 3

Compression:

Stored size: 1.5 KB

Contents

#!/usr/bin/env ruby

require 'fileutils'
require 'antlr4-native'

grammar_file = ARGV.shift

# ANTLR does weird things if the grammar file isn't in the current working directory
temp_grammar_file = File.join(FileUtils.pwd(), File.basename(grammar_file))
FileUtils.cp(grammar_file, temp_grammar_file)

# generate parser
generator = Antlr4Native::Generator.new(
  grammar_files: [File.basename(temp_grammar_file)],
  output_dir: 'ext',
  parser_root_method: 'syntax'
)
generator.generate

# fix issues with generated parser
parser_source_file = File.join(*%w(ext express-parser express_parser.cpp))
parser_source_lines = File.read(parser_source_file).split(/\n/)

# - add ParserProxy tokens method, simple compensation for missing exposed BufferedTokenStream
i = parser_source_lines.index{|x| x == '  Object syntax() {'}
parser_source_lines[i + 6] += "\n" + <<~CPP.split(/\n/).map{|x| x != "" ? "  " + x : x}.join("\n") + "\n"
  Array getTokens() {
    Array a;

    std::vector<Token*> tokens = this -> tokens -> getTokens();

    for (auto &token : tokens) {
      a.push(token);
    }

    return a;
  }
CPP
i = parser_source_lines.index{|x| x == '    .define_method("syntax", &ParserProxy::syntax)'}
parser_source_lines[i] += "\n" + <<~CPP.split(/\n/).map{|x| x != "" ? "    " + x : x}.join("\n")
  .define_method("tokens", &ParserProxy::getTokens)
CPP

# write fixed parser file
File.write(parser_source_file, parser_source_lines.join("\n") + "\n")

# cleanup
FileUtils.rm(temp_grammar_file)

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
expressir-0.2.6 exe/generate-parser
expressir-0.2.5-x64-mingw32 exe/generate-parser
expressir-0.2.4-x64-mingw32 exe/generate-parser