Skip to content

Commit

Permalink
Merge branch 'master' of git://github.com/jeremy/treetop into jeremy
Browse files Browse the repository at this point in the history
Conflicts:
	lib/treetop.rb
  • Loading branch information
mikel committed Mar 28, 2010
2 parents 7920c2e + 99c0692 commit 88b6f1f
Show file tree
Hide file tree
Showing 46 changed files with 117 additions and 143 deletions.
16 changes: 6 additions & 10 deletions Rakefile
@@ -1,29 +1,25 @@
dir = File.dirname(__FILE__)
require 'rubygems'
require 'rake'
$LOAD_PATH.unshift(File.join(dir, 'vendor', 'rspec', 'lib'))
require 'spec/rake/spectask'

require 'rake/gempackagetask'
require 'spec/rake/spectask'

task :default => :spec

Spec::Rake::SpecTask.new do |t|
t.pattern = 'spec/**/*spec.rb'
t.libs << 'spec'
end

load "./treetop.gemspec"

Rake::GemPackageTask.new($gemspec) do |pkg|
pkg.need_tar = true
end

task :spec => :regenerate_metagrammar
task :regenerate_metagrammar => 'lib/treetop/compiler/metagrammar.treetop' do |t|
task :spec => 'lib/treetop/compiler/metagrammar.treetop'
file 'lib/treetop/compiler/metagrammar.treetop' do |t|
unless $bootstrapped_gen_1_metagrammar
load File.join(File.dirname(__FILE__), 'lib', 'treetop', 'bootstrap_gen_1_metagrammar.rb')
load File.expand_path('../lib/treetop/bootstrap_gen_1_metagrammar.rb', __FILE__)
end

Treetop::Compiler::GrammarCompiler.new.compile(METAGRAMMAR_PATH)
end

Expand Down
9 changes: 5 additions & 4 deletions bin/tt
Expand Up @@ -5,10 +5,11 @@ require 'rubygems'
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
require 'treetop'
require 'treetop/version'
require 'treetop/polyglot'

options = {}
parser = OptionParser.new do |opts|
exts = Treetop::VALID_GRAMMAR_EXT.collect { |i| '.' + i }
exts = Treetop::Polyglot::VALID_GRAMMAR_EXT.collect { |i| '.' + i }

opts.banner = "Treetop Parsing Expression Grammar (PEG) Comand Line Compiler"
opts.define_head "Usage: tt [options] grammar_file[#{exts.join('|')}] ..."
Expand Down Expand Up @@ -57,7 +58,7 @@ end

def grammar_exist?(filename)
if File.extname(filename).empty?
Treetop::VALID_GRAMMAR_EXT.each do |ext|
Treetop::Polyglot::VALID_GRAMMAR_EXT.each do |ext|
fn_ext = "#{filename}.#{ext}"
return true if File.exist?(fn_ext) && !File.zero?(fn_ext)
end
Expand All @@ -67,7 +68,7 @@ end

def full_grammar_filename(filename)
return filename if !File.extname(filename).empty?
Treetop::VALID_GRAMMAR_EXT.each do |ext|
Treetop::Polyglot::VALID_GRAMMAR_EXT.each do |ext|
fn_ext = "#{filename}.#{ext}"
return fn_ext if File.exist?(fn_ext) && !File.zero?(fn_ext)
end
Expand Down Expand Up @@ -96,7 +97,7 @@ while !file_list.empty?

# try to compile
treetop_file = full_grammar_filename(treetop_file)
std_output_file = treetop_file.gsub(Treetop::VALID_GRAMMAR_EXT_REGEXP, '.rb')
std_output_file = treetop_file.gsub(Treetop::Polyglot::VALID_GRAMMAR_EXT_REGEXP, '.rb')

if options[:out_file]
# explicit output file name option; never overwrite unless forced
Expand Down
22 changes: 3 additions & 19 deletions lib/treetop.rb
@@ -1,19 +1,3 @@
require 'rubygems'

module Treetop
VALID_GRAMMAR_EXT = ['treetop', 'tt']
VALID_GRAMMAR_EXT_REGEXP = /\.(#{VALID_GRAMMAR_EXT.join('|')})\Z/o
end

dir = File.dirname(__FILE__)

TREETOP_ROOT = File.join(dir, 'treetop')
require File.join(TREETOP_ROOT, "ruby_extensions")
require File.join(TREETOP_ROOT, "runtime")
require File.join(TREETOP_ROOT, "compiler")

# To have Polyglot extensions loaded, you need to require 'polyglot'
# before you require 'treetop'
if defined?(Polyglot)
Polyglot.register(Treetop::VALID_GRAMMAR_EXT, Treetop)
end
require 'treetop/runtime'
require 'treetop/compiler'
require 'treetop/polyglot'
11 changes: 4 additions & 7 deletions lib/treetop/bootstrap_gen_1_metagrammar.rb
Expand Up @@ -2,28 +2,25 @@
# into the environment by compiling the current metagrammar.treetop using a trusted version of Treetop.

require 'rubygems'
dir = File.dirname(__FILE__)

TREETOP_VERSION_REQUIRED_TO_BOOTSTRAP = '>= 1.1.5'

# Loading trusted version of Treetop to compile the compiler
gem_spec = Gem.source_index.find_name('treetop', TREETOP_VERSION_REQUIRED_TO_BOOTSTRAP).last
raise "Install a Treetop Gem version #{TREETOP_VERSION_REQUIRED_TO_BOOTSTRAP} to bootstrap." unless gem_spec
trusted_treetop_path = gem_spec.full_gem_path
require File.join(trusted_treetop_path, 'lib', 'treetop')
require "#{gem_spec.full_gem_path}/lib/treetop"

# Relocating trusted version of Treetop to Trusted::Treetop
Trusted = Module.new
Trusted::Treetop = Treetop
Object.send(:remove_const, :Treetop)
Object.send(:remove_const, :TREETOP_ROOT)

# Requiring version of Treetop that is under test
$exclude_metagrammar = true
require File.expand_path(File.join(dir, '..', 'treetop'))
require File.expand_path('../treetop')

# Compile and evaluate freshly generated metagrammar source
METAGRAMMAR_PATH = File.join(TREETOP_ROOT, 'compiler', 'metagrammar.treetop')
METAGRAMMAR_PATH = File.expand_path('../compiler/metagrammar.treetop', __FILE__)
compiled_metagrammar_source = Trusted::Treetop::Compiler::GrammarCompiler.new.ruby_source(METAGRAMMAR_PATH)
Object.class_eval(compiled_metagrammar_source)

Expand All @@ -42,4 +39,4 @@
# include Trusted::Treetop::Runtime
# end

$bootstrapped_gen_1_metagrammar = true
$bootstrapped_gen_1_metagrammar = true
13 changes: 7 additions & 6 deletions lib/treetop/compiler.rb
@@ -1,6 +1,7 @@
dir = File.dirname(__FILE__)
require File.join(dir, *%w[compiler lexical_address_space])
require File.join(dir, *%w[compiler ruby_builder])
require File.join(dir, *%w[compiler node_classes])
require File.join(dir, *%w[compiler metagrammar]) unless defined?($exclude_metagrammar)
require File.join(dir, *%w[compiler grammar_compiler])
require 'treetop/ruby_extensions'

require 'treetop/compiler/lexical_address_space'
require 'treetop/compiler/ruby_builder'
require 'treetop/compiler/node_classes'
require 'treetop/compiler/metagrammar' unless defined?($exclude_metagrammar)
require 'treetop/compiler/grammar_compiler'
39 changes: 19 additions & 20 deletions lib/treetop/compiler/node_classes.rb
@@ -1,20 +1,19 @@
dir = File.dirname(__FILE__)
require File.join(dir, *%w[node_classes parsing_expression])
require File.join(dir, *%w[node_classes atomic_expression])
require File.join(dir, *%w[node_classes inline_module])
require File.join(dir, *%w[node_classes predicate_block])
require File.join(dir, *%w[node_classes treetop_file])
require File.join(dir, *%w[node_classes grammar])
require File.join(dir, *%w[node_classes declaration_sequence])
require File.join(dir, *%w[node_classes parsing_rule])
require File.join(dir, *%w[node_classes parenthesized_expression])
require File.join(dir, *%w[node_classes nonterminal])
require File.join(dir, *%w[node_classes terminal])
require File.join(dir, *%w[node_classes anything_symbol])
require File.join(dir, *%w[node_classes character_class])
require File.join(dir, *%w[node_classes sequence])
require File.join(dir, *%w[node_classes choice])
require File.join(dir, *%w[node_classes repetition])
require File.join(dir, *%w[node_classes optional])
require File.join(dir, *%w[node_classes predicate])
require File.join(dir, *%w[node_classes transient_prefix])
require 'treetop/compiler/node_classes/parsing_expression'
require 'treetop/compiler/node_classes/atomic_expression'
require 'treetop/compiler/node_classes/inline_module'
require 'treetop/compiler/node_classes/predicate_block'
require 'treetop/compiler/node_classes/treetop_file'
require 'treetop/compiler/node_classes/grammar'
require 'treetop/compiler/node_classes/declaration_sequence'
require 'treetop/compiler/node_classes/parsing_rule'
require 'treetop/compiler/node_classes/parenthesized_expression'
require 'treetop/compiler/node_classes/nonterminal'
require 'treetop/compiler/node_classes/terminal'
require 'treetop/compiler/node_classes/anything_symbol'
require 'treetop/compiler/node_classes/character_class'
require 'treetop/compiler/node_classes/sequence'
require 'treetop/compiler/node_classes/choice'
require 'treetop/compiler/node_classes/repetition'
require 'treetop/compiler/node_classes/optional'
require 'treetop/compiler/node_classes/predicate'
require 'treetop/compiler/node_classes/transient_prefix'
9 changes: 9 additions & 0 deletions lib/treetop/polyglot.rb
@@ -0,0 +1,9 @@
module Treetop
module Polyglot
VALID_GRAMMAR_EXT = ['treetop', 'tt']
VALID_GRAMMAR_EXT_REGEXP = /\.(#{VALID_GRAMMAR_EXT.join('|')})\Z/o
end
end

require 'polyglot'
Polyglot.register(Treetop::Polyglot::VALID_GRAMMAR_EXT, Treetop)
3 changes: 1 addition & 2 deletions lib/treetop/ruby_extensions.rb
@@ -1,2 +1 @@
dir = File.dirname(__FILE__)
require "#{dir}/ruby_extensions/string"
require 'treetop/ruby_extensions/string'
11 changes: 6 additions & 5 deletions lib/treetop/runtime.rb
@@ -1,5 +1,6 @@
dir = File.dirname(__FILE__)
require "#{dir}/runtime/compiled_parser"
require "#{dir}/runtime/syntax_node"
require "#{dir}/runtime/terminal_parse_failure"
require "#{dir}/runtime/interval_skip_list"
require 'treetop/ruby_extensions'

require 'treetop/runtime/compiled_parser'
require 'treetop/runtime/syntax_node'
require 'treetop/runtime/terminal_parse_failure'
require 'treetop/runtime/interval_skip_list'
7 changes: 3 additions & 4 deletions lib/treetop/runtime/interval_skip_list.rb
@@ -1,4 +1,3 @@
dir = File.dirname(__FILE__)
require "#{dir}/interval_skip_list/interval_skip_list.rb"
require "#{dir}/interval_skip_list/head_node.rb"
require "#{dir}/interval_skip_list/node.rb"
require 'treetop/runtime/interval_skip_list/interval_skip_list'
require 'treetop/runtime/interval_skip_list/head_node'
require 'treetop/runtime/interval_skip_list/node'
7 changes: 3 additions & 4 deletions script/generate_metagrammar.rb
@@ -1,14 +1,13 @@
#!/usr/bin/env ruby

require 'rubygems'
dir = File.dirname(__FILE__)
require File.join(dir, '..', 'lib', 'treetop', 'bootstrap_gen_1_metagrammar')
require File.expand_path('../../lib/treetop/bootstrap_gen_1_metagrammar', __FILE__)

GENERATED_METAGRAMMAR_PATH = File.join(TREETOP_ROOT, 'compiler', 'metagrammar.rb')
GENERATED_METAGRAMMAR_PATH = File.expand_path('../../lib/treetop/compiler/metagrammar.rb')

File.open(METAGRAMMAR_PATH) do |source_file|
File.open(GENERATED_METAGRAMMAR_PATH, 'w') do |target_file|
generated_source = Treetop::Compiler::MetagrammarParser.new.parse(source_file.read).compile
target_file.write(generated_source)
end
end
end
4 changes: 2 additions & 2 deletions spec/compiler/and_predicate_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module AndPredicateSpec
describe "An &-predicated terminal symbol" do
Expand Down Expand Up @@ -33,4 +33,4 @@ module AndPredicateSpec
end
end
end
end
end
4 changes: 2 additions & 2 deletions spec/compiler/anything_symbol_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module AnythingSymbolSpec
class Foo < Treetop::Runtime::SyntaxNode
Expand Down Expand Up @@ -41,4 +41,4 @@ module ModFoo
end
end
end
end
end
2 changes: 1 addition & 1 deletion spec/compiler/character_class_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module CharacterClassSpec
class Foo < Treetop::Runtime::SyntaxNode
Expand Down
4 changes: 2 additions & 2 deletions spec/compiler/choice_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module ChoiceSpec
describe "A choice between terminal symbols" do
Expand Down Expand Up @@ -77,4 +77,4 @@ def a_method
end
end
end
end
end
5 changes: 3 additions & 2 deletions spec/compiler/circular_compilation_spec.rb
@@ -1,6 +1,7 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

BENCHMARK = false
METAGRAMMAR_PATH = File.join(TREETOP_ROOT, 'compiler', 'metagrammar.treetop')
METAGRAMMAR_PATH = File.expand_path('../../../lib/treetop/compiler/metagrammar.treetop', __FILE__)

module CircularCompilationSpec
describe "a parser for the metagrammar" do
Expand Down
4 changes: 2 additions & 2 deletions spec/compiler/failure_propagation_functional_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

describe "An expression for braces surrounding zero or more letters followed by semicolons" do
testing_expression "'{' ([a-z] ';')* '}'"
Expand All @@ -18,4 +18,4 @@
failure.expected_string.should == ';'
end
end
end
end
2 changes: 1 addition & 1 deletion spec/compiler/grammar_compiler_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

describe Compiler::GrammarCompiler do
attr_reader :compiler, :source_path_with_treetop_extension, :source_path_with_tt_extension, :target_path, :alternate_target_path
Expand Down
2 changes: 1 addition & 1 deletion spec/compiler/grammar_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module GrammarSpec
module Bar
Expand Down
10 changes: 1 addition & 9 deletions spec/compiler/multibyte_chars_spec.rb
@@ -1,15 +1,7 @@
#!ruby19
# encoding: utf-8

require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")

# Require ActiveSupport for multibyte strings
begin
require 'active_support'
rescue
gem 'activesupport'
require 'active_support'
end
require 'spec_helper'

module MultibyteCharsSpec
describe "an anything symbol" do
Expand Down
4 changes: 2 additions & 2 deletions spec/compiler/nonterminal_symbol_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module NonterminalSymbolSpec
describe "A nonterminal symbol followed by a block" do
Expand Down Expand Up @@ -37,4 +37,4 @@ def _nt_foo
result.should respond_to(:a_method)
end
end
end
end
4 changes: 2 additions & 2 deletions spec/compiler/not_predicate_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module NotPredicateSpec
describe "A !-predicated terminal symbol" do
Expand Down Expand Up @@ -35,4 +35,4 @@ module NotPredicateSpec
parse('abc').should be_nil
end
end
end
end
4 changes: 2 additions & 2 deletions spec/compiler/one_or_more_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module OneOrMoreSpec
class Foo < Treetop::Runtime::SyntaxNode
Expand Down Expand Up @@ -32,4 +32,4 @@ class Foo < Treetop::Runtime::SyntaxNode
end
end
end
end
end
2 changes: 1 addition & 1 deletion spec/compiler/optional_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module OptionalSpec
describe "An optional terminal symbol" do
Expand Down
2 changes: 1 addition & 1 deletion spec/compiler/parenthesized_expression_spec.rb
@@ -1,4 +1,4 @@
require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
require 'spec_helper'

module ParenthesizedExpressionSpec
describe "An unadorned expression inside of parentheses" do
Expand Down

0 comments on commit 88b6f1f

Please sign in to comment.