mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			52 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f7fe1fee66 | ||
| 
						 | 
					94367cc460 | ||
| 
						 | 
					72bec1fddc | ||
| 
						 | 
					4e2eba4ef8 | ||
| 
						 | 
					10457b6639 | ||
| 
						 | 
					01de40faaa | ||
| 
						 | 
					62d285fce6 | ||
| 
						 | 
					0056095e8c | ||
| 
						 | 
					d6dc3a3991 | ||
| 
						 | 
					b524461b7c | ||
| 
						 | 
					76d41697aa | ||
| 
						 | 
					32147b629e | ||
| 
						 | 
					e7b5e25bf8 | ||
| 
						 | 
					d761658f8b | ||
| 
						 | 
					3719214aba | ||
| 
						 | 
					47b109be36 | ||
| 
						 | 
					1ec4db97c2 | ||
| 
						 | 
					9fe5fe0de2 | ||
| 
						 | 
					b36ea7ac9d | ||
| 
						 | 
					625b06c30d | ||
| 
						 | 
					28bce533b2 | ||
| 
						 | 
					93ec1922cb | ||
| 
						 | 
					5d09fb67dd | ||
| 
						 | 
					93dcb61742 | ||
| 
						 | 
					3a03594685 | ||
| 
						 | 
					5ce2c254f9 | ||
| 
						 | 
					d7814c4899 | ||
| 
						 | 
					50c08bf29e | ||
| 
						 | 
					34928baee6 | ||
| 
						 | 
					27bb41aa4d | ||
| 
						 | 
					1415f4b52d | ||
| 
						 | 
					ae8ffcad22 | ||
| 
						 | 
					f43633bf10 | ||
| 
						 | 
					a604de9846 | ||
| 
						 | 
					3e224e0039 | ||
| 
						 | 
					15b04f86c3 | ||
| 
						 | 
					42af436c20 | ||
| 
						 | 
					2b08c66f0b | ||
| 
						 | 
					f98ab593fb | ||
| 
						 | 
					f951ec07de | ||
| 
						 | 
					e9ac71590f | ||
| 
						 | 
					210cd19876 | ||
| 
						 | 
					f473c555ac | ||
| 
						 | 
					48e4394d87 | ||
| 
						 | 
					e1ce88920d | ||
| 
						 | 
					675cee1d72 | ||
| 
						 | 
					1c4baf6dc2 | ||
| 
						 | 
					8f2820e9cc | ||
| 
						 | 
					04c268e535 | ||
| 
						 | 
					ec749b3f8d | ||
| 
						 | 
					08b63e7033 | ||
| 
						 | 
					7867b946b9 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					*.gem
 | 
				
			||||||
/Gemfile.lock
 | 
					/Gemfile.lock
 | 
				
			||||||
.bundle/
 | 
					.bundle/
 | 
				
			||||||
.idea
 | 
					.idea
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										34
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							@@ -130,9 +130,6 @@
 | 
				
			|||||||
[submodule "vendor/grammars/Sublime-Text-2-OpenEdge-ABL"]
 | 
					[submodule "vendor/grammars/Sublime-Text-2-OpenEdge-ABL"]
 | 
				
			||||||
	path = vendor/grammars/Sublime-Text-2-OpenEdge-ABL
 | 
						path = vendor/grammars/Sublime-Text-2-OpenEdge-ABL
 | 
				
			||||||
	url = https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL
 | 
						url = https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL
 | 
				
			||||||
[submodule "vendor/grammars/sublime-rust"]
 | 
					 | 
				
			||||||
	path = vendor/grammars/sublime-rust
 | 
					 | 
				
			||||||
	url = https://github.com/jhasse/sublime-rust
 | 
					 | 
				
			||||||
[submodule "vendor/grammars/sublime-befunge"]
 | 
					[submodule "vendor/grammars/sublime-befunge"]
 | 
				
			||||||
	path = vendor/grammars/sublime-befunge
 | 
						path = vendor/grammars/sublime-befunge
 | 
				
			||||||
	url = https://github.com/johanasplund/sublime-befunge
 | 
						url = https://github.com/johanasplund/sublime-befunge
 | 
				
			||||||
@@ -247,9 +244,6 @@
 | 
				
			|||||||
[submodule "vendor/grammars/cpp-qt.tmbundle"]
 | 
					[submodule "vendor/grammars/cpp-qt.tmbundle"]
 | 
				
			||||||
	path = vendor/grammars/cpp-qt.tmbundle
 | 
						path = vendor/grammars/cpp-qt.tmbundle
 | 
				
			||||||
	url = https://github.com/textmate/cpp-qt.tmbundle
 | 
						url = https://github.com/textmate/cpp-qt.tmbundle
 | 
				
			||||||
[submodule "vendor/grammars/css.tmbundle"]
 | 
					 | 
				
			||||||
	path = vendor/grammars/css.tmbundle
 | 
					 | 
				
			||||||
	url = https://github.com/textmate/css.tmbundle
 | 
					 | 
				
			||||||
[submodule "vendor/grammars/d.tmbundle"]
 | 
					[submodule "vendor/grammars/d.tmbundle"]
 | 
				
			||||||
	path = vendor/grammars/d.tmbundle
 | 
						path = vendor/grammars/d.tmbundle
 | 
				
			||||||
	url = https://github.com/textmate/d.tmbundle
 | 
						url = https://github.com/textmate/d.tmbundle
 | 
				
			||||||
@@ -443,9 +437,6 @@
 | 
				
			|||||||
[submodule "vendor/grammars/Sublime-Nit"]
 | 
					[submodule "vendor/grammars/Sublime-Nit"]
 | 
				
			||||||
	path = vendor/grammars/Sublime-Nit
 | 
						path = vendor/grammars/Sublime-Nit
 | 
				
			||||||
	url = https://github.com/R4PaSs/Sublime-Nit
 | 
						url = https://github.com/R4PaSs/Sublime-Nit
 | 
				
			||||||
[submodule "vendor/grammars/language-hy"]
 | 
					 | 
				
			||||||
	path = vendor/grammars/language-hy
 | 
					 | 
				
			||||||
	url = https://github.com/rwtolbert/language-hy
 | 
					 | 
				
			||||||
[submodule "vendor/grammars/Racket"]
 | 
					[submodule "vendor/grammars/Racket"]
 | 
				
			||||||
	path = vendor/grammars/Racket
 | 
						path = vendor/grammars/Racket
 | 
				
			||||||
	url = https://github.com/soegaard/racket-highlight-for-github
 | 
						url = https://github.com/soegaard/racket-highlight-for-github
 | 
				
			||||||
@@ -623,9 +614,6 @@
 | 
				
			|||||||
[submodule "vendor/grammars/language-yang"]
 | 
					[submodule "vendor/grammars/language-yang"]
 | 
				
			||||||
	path = vendor/grammars/language-yang
 | 
						path = vendor/grammars/language-yang
 | 
				
			||||||
	url = https://github.com/DzonyKalafut/language-yang.git
 | 
						url = https://github.com/DzonyKalafut/language-yang.git
 | 
				
			||||||
[submodule "vendor/grammars/perl6fe"]
 | 
					 | 
				
			||||||
	path = vendor/grammars/perl6fe
 | 
					 | 
				
			||||||
	url = https://github.com/MadcapJake/language-perl6fe.git
 | 
					 | 
				
			||||||
[submodule "vendor/grammars/language-less"]
 | 
					[submodule "vendor/grammars/language-less"]
 | 
				
			||||||
	path = vendor/grammars/language-less
 | 
						path = vendor/grammars/language-less
 | 
				
			||||||
	url = https://github.com/atom/language-less.git
 | 
						url = https://github.com/atom/language-less.git
 | 
				
			||||||
@@ -809,4 +797,24 @@
 | 
				
			|||||||
[submodule "vendor/grammars/rascal-syntax-highlighting"]
 | 
					[submodule "vendor/grammars/rascal-syntax-highlighting"]
 | 
				
			||||||
	path = vendor/grammars/rascal-syntax-highlighting
 | 
						path = vendor/grammars/rascal-syntax-highlighting
 | 
				
			||||||
	url = https://github.com/usethesource/rascal-syntax-highlighting
 | 
						url = https://github.com/usethesource/rascal-syntax-highlighting
 | 
				
			||||||
 | 
					[submodule "vendor/grammars/atom-language-perl6"]
 | 
				
			||||||
 | 
						path = vendor/grammars/atom-language-perl6
 | 
				
			||||||
 | 
						url = https://github.com/perl6/atom-language-perl6
 | 
				
			||||||
 | 
					[submodule "vendor/grammars/reason"]
 | 
				
			||||||
 | 
						path = vendor/grammars/reason
 | 
				
			||||||
 | 
						url = https://github.com/facebook/reason
 | 
				
			||||||
 | 
					[submodule "vendor/grammars/language-xcompose"]
 | 
				
			||||||
 | 
						path = vendor/grammars/language-xcompose
 | 
				
			||||||
 | 
						url = https://github.com/samcv/language-xcompose
 | 
				
			||||||
 | 
					[submodule "vendor/grammars/SublimeEthereum"]
 | 
				
			||||||
 | 
						path = vendor/grammars/SublimeEthereum
 | 
				
			||||||
 | 
						url = https://github.com/davidhq/SublimeEthereum.git
 | 
				
			||||||
 | 
					[submodule "vendor/grammars/atom-language-rust"]
 | 
				
			||||||
 | 
						path = vendor/grammars/atom-language-rust
 | 
				
			||||||
 | 
						url = https://github.com/zargony/atom-language-rust
 | 
				
			||||||
 | 
					[submodule "vendor/grammars/language-css"]
 | 
				
			||||||
 | 
						path = vendor/grammars/language-css
 | 
				
			||||||
 | 
						url = https://github.com/atom/language-css
 | 
				
			||||||
 | 
					[submodule "vendor/grammars/language-regexp"]
 | 
				
			||||||
 | 
						path = vendor/grammars/language-regexp
 | 
				
			||||||
 | 
						url = https://github.com/Alhadis/language-regexp
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@ To add support for a new extension:
 | 
				
			|||||||
In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
 | 
					In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
 | 
					0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
 | 
				
			||||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files.
 | 
					0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@bkeepers** to help with this) to ensure we're not misclassifying files.
 | 
				
			||||||
0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
 | 
					0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,7 +36,7 @@ To add support for a new language:
 | 
				
			|||||||
In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
 | 
					In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
 | 
					0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
 | 
				
			||||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files.
 | 
					0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@bkeepers** to help with this) to ensure we're not misclassifying files.
 | 
				
			||||||
0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
 | 
					0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Remember, the goal here is to try and avoid false positives!
 | 
					Remember, the goal here is to try and avoid false positives!
 | 
				
			||||||
@@ -80,7 +80,6 @@ Here's our current build status: [
 | 
					- **@brandonblack** (GitHub staff)
 | 
				
			||||||
- **@larsbrinkhoff**
 | 
					- **@larsbrinkhoff**
 | 
				
			||||||
- **@lildude** (GitHub staff)
 | 
					- **@lildude** (GitHub staff)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
Copyright (c) 2011-2016 GitHub, Inc.
 | 
					Copyright (c) 2017 GitHub, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person
 | 
					Permission is hereby granted, free of charge, to any person
 | 
				
			||||||
obtaining a copy of this software and associated documentation
 | 
					obtaining a copy of this software and associated documentation
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
#!/usr/bin/env ruby
 | 
					#!/usr/bin/env ruby
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require 'linguist'
 | 
					require 'linguist'
 | 
				
			||||||
require 'rugged'
 | 
					require 'rugged'
 | 
				
			||||||
require 'optparse'
 | 
					require 'optparse'
 | 
				
			||||||
@@ -102,10 +104,16 @@ def git_linguist(args)
 | 
				
			|||||||
  commit = nil
 | 
					  commit = nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  parser = OptionParser.new do |opts|
 | 
					  parser = OptionParser.new do |opts|
 | 
				
			||||||
    opts.banner = "Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable"
 | 
					    opts.banner = <<-HELP
 | 
				
			||||||
 | 
					    Linguist v#{Linguist::VERSION}
 | 
				
			||||||
 | 
					    Detect language type and determine language breakdown for a given Git repository.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Usage:
 | 
				
			||||||
 | 
					    git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable"
 | 
				
			||||||
 | 
					    HELP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    opts.on("-f", "--force", "Force a full rescan") { incremental = false }
 | 
					    opts.on("-f", "--force", "Force a full rescan") { incremental = false }
 | 
				
			||||||
    opts.on("--commit=COMMIT", "Commit to index") { |v| commit = v}
 | 
					    opts.on("-c", "--commit=COMMIT", "Commit to index") { |v| commit = v}
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  parser.parse!(args)
 | 
					  parser.parse!(args)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								bin/linguist
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								bin/linguist
									
									
									
									
									
								
							@@ -1,30 +1,38 @@
 | 
				
			|||||||
#!/usr/bin/env ruby
 | 
					#!/usr/bin/env ruby
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# linguist — detect language type for a file, or, given a directory, determine language breakdown
 | 
					$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
 | 
				
			||||||
#     usage: linguist <path> [<--breakdown>]
 | 
					
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
require 'linguist'
 | 
					require 'linguist'
 | 
				
			||||||
require 'rugged'
 | 
					require 'rugged'
 | 
				
			||||||
 | 
					require 'json'
 | 
				
			||||||
 | 
					require 'optparse'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
path = ARGV[0] || Dir.pwd
 | 
					path = ARGV[0] || Dir.pwd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# special case if not given a directory but still given the --breakdown option
 | 
					# special case if not given a directory
 | 
				
			||||||
 | 
					# but still given the --breakdown or --json options/
 | 
				
			||||||
if path == "--breakdown"
 | 
					if path == "--breakdown"
 | 
				
			||||||
  path = Dir.pwd
 | 
					  path = Dir.pwd
 | 
				
			||||||
  breakdown = true
 | 
					  breakdown = true
 | 
				
			||||||
 | 
					elsif path == "--json"
 | 
				
			||||||
 | 
					  path = Dir.pwd
 | 
				
			||||||
 | 
					  json_breakdown = true
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ARGV.shift
 | 
					ARGV.shift
 | 
				
			||||||
breakdown = true if ARGV[0] == "--breakdown"
 | 
					breakdown = true if ARGV[0] == "--breakdown"
 | 
				
			||||||
 | 
					json_breakdown = true if ARGV[0] == "--json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if File.directory?(path)
 | 
					if File.directory?(path)
 | 
				
			||||||
  rugged = Rugged::Repository.new(path)
 | 
					  rugged = Rugged::Repository.new(path)
 | 
				
			||||||
  repo = Linguist::Repository.new(rugged, rugged.head.target_id)
 | 
					  repo = Linguist::Repository.new(rugged, rugged.head.target_id)
 | 
				
			||||||
 | 
					  if !json_breakdown
 | 
				
			||||||
    repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
 | 
					    repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
 | 
				
			||||||
      percentage = ((size / repo.size.to_f) * 100)
 | 
					      percentage = ((size / repo.size.to_f) * 100)
 | 
				
			||||||
      percentage = sprintf '%.2f' % percentage
 | 
					      percentage = sprintf '%.2f' % percentage
 | 
				
			||||||
      puts "%-7s %s" % ["#{percentage}%", language]
 | 
					      puts "%-7s %s" % ["#{percentage}%", language]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
  if breakdown
 | 
					  if breakdown
 | 
				
			||||||
    puts
 | 
					    puts
 | 
				
			||||||
    file_breakdown = repo.breakdown_by_file
 | 
					    file_breakdown = repo.breakdown_by_file
 | 
				
			||||||
@@ -35,6 +43,8 @@ if File.directory?(path)
 | 
				
			|||||||
      end
 | 
					      end
 | 
				
			||||||
      puts
 | 
					      puts
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					  elsif json_breakdown
 | 
				
			||||||
 | 
					    puts JSON.dump(repo.breakdown_by_file)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
elsif File.file?(path)
 | 
					elsif File.file?(path)
 | 
				
			||||||
  blob = Linguist::FileBlob.new(path, Dir.pwd)
 | 
					  blob = Linguist::FileBlob.new(path, Dir.pwd)
 | 
				
			||||||
@@ -63,5 +73,12 @@ elsif File.file?(path)
 | 
				
			|||||||
    puts "  appears to be a vendored file"
 | 
					    puts "  appears to be a vendored file"
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
  abort "usage: linguist <path>"
 | 
					  abort <<-HELP
 | 
				
			||||||
 | 
					  Linguist v#{Linguist::VERSION}
 | 
				
			||||||
 | 
					  Detect language type for a file, or, given a directory, determine language breakdown.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Usage: linguist <path>
 | 
				
			||||||
 | 
					         linguist <path> [--breakdown] [--json]
 | 
				
			||||||
 | 
					         linguist [--breakdown] [--json]
 | 
				
			||||||
 | 
					  HELP
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
 | 
				
			|||||||
  s.add_dependency 'charlock_holmes', '~> 0.7.3'
 | 
					  s.add_dependency 'charlock_holmes', '~> 0.7.3'
 | 
				
			||||||
  s.add_dependency 'escape_utils',    '~> 1.1.0'
 | 
					  s.add_dependency 'escape_utils',    '~> 1.1.0'
 | 
				
			||||||
  s.add_dependency 'mime-types',      '>= 1.19'
 | 
					  s.add_dependency 'mime-types',      '>= 1.19'
 | 
				
			||||||
  s.add_dependency 'rugged',          '>= 0.23.0b'
 | 
					  s.add_dependency 'rugged',          '>= 0.25.1'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  s.add_development_dependency 'minitest', '>= 5.0'
 | 
					  s.add_development_dependency 'minitest', '>= 5.0'
 | 
				
			||||||
  s.add_development_dependency 'mocha'
 | 
					  s.add_development_dependency 'mocha'
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										35
									
								
								grammars.yml
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								grammars.yml
									
									
									
									
									
								
							@@ -1,9 +1,9 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage:
 | 
					 | 
				
			||||||
- text.xml.genshi
 | 
					 | 
				
			||||||
https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz:
 | 
					https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz:
 | 
				
			||||||
- source.systemverilog
 | 
					- source.systemverilog
 | 
				
			||||||
- source.ucfconstraints
 | 
					- source.ucfconstraints
 | 
				
			||||||
 | 
					https://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage:
 | 
				
			||||||
 | 
					- text.xml.genshi
 | 
				
			||||||
vendor/grammars/ABNF.tmbundle:
 | 
					vendor/grammars/ABNF.tmbundle:
 | 
				
			||||||
- source.abnf
 | 
					- source.abnf
 | 
				
			||||||
vendor/grammars/Agda.tmbundle:
 | 
					vendor/grammars/Agda.tmbundle:
 | 
				
			||||||
@@ -113,7 +113,9 @@ vendor/grammars/SublimeBrainfuck:
 | 
				
			|||||||
- source.bf
 | 
					- source.bf
 | 
				
			||||||
vendor/grammars/SublimeClarion:
 | 
					vendor/grammars/SublimeClarion:
 | 
				
			||||||
- source.clarion
 | 
					- source.clarion
 | 
				
			||||||
vendor/grammars/SublimeGDB:
 | 
					vendor/grammars/SublimeEthereum:
 | 
				
			||||||
 | 
					- source.solidity
 | 
				
			||||||
 | 
					vendor/grammars/SublimeGDB/:
 | 
				
			||||||
- source.disasm
 | 
					- source.disasm
 | 
				
			||||||
- source.gdb
 | 
					- source.gdb
 | 
				
			||||||
- source.gdb.session
 | 
					- source.gdb.session
 | 
				
			||||||
@@ -178,8 +180,15 @@ vendor/grammars/atom-language-1c-bsl:
 | 
				
			|||||||
- source.sdbl
 | 
					- source.sdbl
 | 
				
			||||||
vendor/grammars/atom-language-clean:
 | 
					vendor/grammars/atom-language-clean:
 | 
				
			||||||
- source.clean
 | 
					- source.clean
 | 
				
			||||||
 | 
					vendor/grammars/atom-language-perl6:
 | 
				
			||||||
 | 
					- source.meta-info
 | 
				
			||||||
 | 
					- source.perl6fe
 | 
				
			||||||
 | 
					- source.quoting.perl6fe
 | 
				
			||||||
 | 
					- source.regexp.perl6fe
 | 
				
			||||||
vendor/grammars/atom-language-purescript:
 | 
					vendor/grammars/atom-language-purescript:
 | 
				
			||||||
- source.purescript
 | 
					- source.purescript
 | 
				
			||||||
 | 
					vendor/grammars/atom-language-rust:
 | 
				
			||||||
 | 
					- source.rust
 | 
				
			||||||
vendor/grammars/atom-language-srt:
 | 
					vendor/grammars/atom-language-srt:
 | 
				
			||||||
- text.srt
 | 
					- text.srt
 | 
				
			||||||
vendor/grammars/atom-language-stan:
 | 
					vendor/grammars/atom-language-stan:
 | 
				
			||||||
@@ -225,8 +234,6 @@ vendor/grammars/cpp-qt.tmbundle:
 | 
				
			|||||||
- source.qmake
 | 
					- source.qmake
 | 
				
			||||||
vendor/grammars/creole:
 | 
					vendor/grammars/creole:
 | 
				
			||||||
- text.html.creole
 | 
					- text.html.creole
 | 
				
			||||||
vendor/grammars/css.tmbundle:
 | 
					 | 
				
			||||||
- source.css
 | 
					 | 
				
			||||||
vendor/grammars/cucumber-tmbundle:
 | 
					vendor/grammars/cucumber-tmbundle:
 | 
				
			||||||
- source.ruby.rspec.cucumber.steps
 | 
					- source.ruby.rspec.cucumber.steps
 | 
				
			||||||
- text.gherkin.feature
 | 
					- text.gherkin.feature
 | 
				
			||||||
@@ -360,6 +367,8 @@ vendor/grammars/language-csound:
 | 
				
			|||||||
- source.csound
 | 
					- source.csound
 | 
				
			||||||
- source.csound-document
 | 
					- source.csound-document
 | 
				
			||||||
- source.csound-score
 | 
					- source.csound-score
 | 
				
			||||||
 | 
					vendor/grammars/language-css:
 | 
				
			||||||
 | 
					- source.css
 | 
				
			||||||
vendor/grammars/language-emacs-lisp:
 | 
					vendor/grammars/language-emacs-lisp:
 | 
				
			||||||
- source.emacs.lisp
 | 
					- source.emacs.lisp
 | 
				
			||||||
vendor/grammars/language-fontforge:
 | 
					vendor/grammars/language-fontforge:
 | 
				
			||||||
@@ -384,8 +393,6 @@ vendor/grammars/language-haskell:
 | 
				
			|||||||
- source.haskell
 | 
					- source.haskell
 | 
				
			||||||
- source.hsc2hs
 | 
					- source.hsc2hs
 | 
				
			||||||
- text.tex.latex.haskell
 | 
					- text.tex.latex.haskell
 | 
				
			||||||
vendor/grammars/language-hy:
 | 
					 | 
				
			||||||
- source.hy
 | 
					 | 
				
			||||||
vendor/grammars/language-inform7:
 | 
					vendor/grammars/language-inform7:
 | 
				
			||||||
- source.inform7
 | 
					- source.inform7
 | 
				
			||||||
vendor/grammars/language-javascript:
 | 
					vendor/grammars/language-javascript:
 | 
				
			||||||
@@ -408,6 +415,10 @@ vendor/grammars/language-povray:
 | 
				
			|||||||
vendor/grammars/language-python:
 | 
					vendor/grammars/language-python:
 | 
				
			||||||
- text.python.console
 | 
					- text.python.console
 | 
				
			||||||
- text.python.traceback
 | 
					- text.python.traceback
 | 
				
			||||||
 | 
					vendor/grammars/language-regexp:
 | 
				
			||||||
 | 
					- source.regexp
 | 
				
			||||||
 | 
					- source.regexp.comment
 | 
				
			||||||
 | 
					- source.regexp.extended
 | 
				
			||||||
vendor/grammars/language-renpy:
 | 
					vendor/grammars/language-renpy:
 | 
				
			||||||
- source.renpy
 | 
					- source.renpy
 | 
				
			||||||
vendor/grammars/language-restructuredtext:
 | 
					vendor/grammars/language-restructuredtext:
 | 
				
			||||||
@@ -436,6 +447,8 @@ vendor/grammars/language-wavefront:
 | 
				
			|||||||
- source.wavefront.obj
 | 
					- source.wavefront.obj
 | 
				
			||||||
vendor/grammars/language-xbase:
 | 
					vendor/grammars/language-xbase:
 | 
				
			||||||
- source.harbour
 | 
					- source.harbour
 | 
				
			||||||
 | 
					vendor/grammars/language-xcompose:
 | 
				
			||||||
 | 
					- config.xcompose
 | 
				
			||||||
vendor/grammars/language-yaml:
 | 
					vendor/grammars/language-yaml:
 | 
				
			||||||
- source.yaml
 | 
					- source.yaml
 | 
				
			||||||
vendor/grammars/language-yang:
 | 
					vendor/grammars/language-yang:
 | 
				
			||||||
@@ -513,10 +526,6 @@ vendor/grammars/pawn-sublime-language:
 | 
				
			|||||||
vendor/grammars/perl.tmbundle:
 | 
					vendor/grammars/perl.tmbundle:
 | 
				
			||||||
- source.perl
 | 
					- source.perl
 | 
				
			||||||
- source.perl.6
 | 
					- source.perl.6
 | 
				
			||||||
vendor/grammars/perl6fe:
 | 
					 | 
				
			||||||
- source.meta-info
 | 
					 | 
				
			||||||
- source.perl6fe
 | 
					 | 
				
			||||||
- source.regexp.perl6fe
 | 
					 | 
				
			||||||
vendor/grammars/php-smarty.tmbundle:
 | 
					vendor/grammars/php-smarty.tmbundle:
 | 
				
			||||||
- text.html.smarty
 | 
					- text.html.smarty
 | 
				
			||||||
vendor/grammars/php.tmbundle:
 | 
					vendor/grammars/php.tmbundle:
 | 
				
			||||||
@@ -541,6 +550,8 @@ vendor/grammars/r.tmbundle:
 | 
				
			|||||||
- text.tex.latex.rd
 | 
					- text.tex.latex.rd
 | 
				
			||||||
vendor/grammars/rascal-syntax-highlighting:
 | 
					vendor/grammars/rascal-syntax-highlighting:
 | 
				
			||||||
- source.rascal
 | 
					- source.rascal
 | 
				
			||||||
 | 
					vendor/grammars/reason:
 | 
				
			||||||
 | 
					- source.reason
 | 
				
			||||||
vendor/grammars/ruby-slim.tmbundle:
 | 
					vendor/grammars/ruby-slim.tmbundle:
 | 
				
			||||||
- text.slim
 | 
					- text.slim
 | 
				
			||||||
vendor/grammars/ruby.tmbundle:
 | 
					vendor/grammars/ruby.tmbundle:
 | 
				
			||||||
@@ -608,8 +619,6 @@ vendor/grammars/sublime-rexx:
 | 
				
			|||||||
- source.rexx
 | 
					- source.rexx
 | 
				
			||||||
vendor/grammars/sublime-robot-plugin:
 | 
					vendor/grammars/sublime-robot-plugin:
 | 
				
			||||||
- text.robot
 | 
					- text.robot
 | 
				
			||||||
vendor/grammars/sublime-rust:
 | 
					 | 
				
			||||||
- source.rust
 | 
					 | 
				
			||||||
vendor/grammars/sublime-spintools:
 | 
					vendor/grammars/sublime-spintools:
 | 
				
			||||||
- source.regexp.spin
 | 
					- source.regexp.spin
 | 
				
			||||||
- source.spin
 | 
					- source.spin
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -95,7 +95,7 @@ module Linguist
 | 
				
			|||||||
    # Returns sorted Array of result pairs. Each pair contains the
 | 
					    # Returns sorted Array of result pairs. Each pair contains the
 | 
				
			||||||
    # String language name and a Float score.
 | 
					    # String language name and a Float score.
 | 
				
			||||||
    def classify(tokens, languages)
 | 
					    def classify(tokens, languages)
 | 
				
			||||||
      return [] if tokens.nil?
 | 
					      return [] if tokens.nil? || languages.empty?
 | 
				
			||||||
      tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)
 | 
					      tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)
 | 
				
			||||||
      scores = {}
 | 
					      scores = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@ module Linguist
 | 
				
			|||||||
    # Public: Is the blob a generated file?
 | 
					    # Public: Is the blob a generated file?
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # name - String filename
 | 
					    # name - String filename
 | 
				
			||||||
    # data - String blob data. A block also maybe passed in for lazy
 | 
					    # data - String blob data. A block also may be passed in for lazy
 | 
				
			||||||
    #        loading. This behavior is deprecated and you should always
 | 
					    #        loading. This behavior is deprecated and you should always
 | 
				
			||||||
    #        pass in a String.
 | 
					    #        pass in a String.
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
@@ -70,6 +70,7 @@ module Linguist
 | 
				
			|||||||
      compiled_cython_file? ||
 | 
					      compiled_cython_file? ||
 | 
				
			||||||
      generated_go? ||
 | 
					      generated_go? ||
 | 
				
			||||||
      generated_protocol_buffer? ||
 | 
					      generated_protocol_buffer? ||
 | 
				
			||||||
 | 
					      generated_javascript_protocol_buffer? ||
 | 
				
			||||||
      generated_apache_thrift? ||
 | 
					      generated_apache_thrift? ||
 | 
				
			||||||
      generated_jni_header? ||
 | 
					      generated_jni_header? ||
 | 
				
			||||||
      vcr_cassette? ||
 | 
					      vcr_cassette? ||
 | 
				
			||||||
@@ -77,7 +78,10 @@ module Linguist
 | 
				
			|||||||
      generated_unity3d_meta? ||
 | 
					      generated_unity3d_meta? ||
 | 
				
			||||||
      generated_racc? ||
 | 
					      generated_racc? ||
 | 
				
			||||||
      generated_jflex? ||
 | 
					      generated_jflex? ||
 | 
				
			||||||
      generated_grammarkit?
 | 
					      generated_grammarkit? ||
 | 
				
			||||||
 | 
					      generated_roxygen2? ||
 | 
				
			||||||
 | 
					      generated_jison? ||
 | 
				
			||||||
 | 
					      generated_yarn_lock?
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Internal: Is the blob an Xcode file?
 | 
					    # Internal: Is the blob an Xcode file?
 | 
				
			||||||
@@ -275,6 +279,17 @@ module Linguist
 | 
				
			|||||||
      return lines[0].include?("Generated by the protocol buffer compiler.  DO NOT EDIT!")
 | 
					      return lines[0].include?("Generated by the protocol buffer compiler.  DO NOT EDIT!")
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Internal: Is the blob a Javascript source file generated by the
 | 
				
			||||||
 | 
					    # Protocol Buffer compiler?
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # Returns true of false.
 | 
				
			||||||
 | 
					    def generated_javascript_protocol_buffer?
 | 
				
			||||||
 | 
					      return false unless extname == ".js"
 | 
				
			||||||
 | 
					      return false unless lines.count > 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return lines[5].include?("GENERATED CODE -- DO NOT EDIT!")
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php']
 | 
					    APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Internal: Is the blob generated by Apache Thrift compiler?
 | 
					    # Internal: Is the blob generated by Apache Thrift compiler?
 | 
				
			||||||
@@ -311,7 +326,7 @@ module Linguist
 | 
				
			|||||||
      !!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(?<!-)\.)+(com|edu|gov|in|me|net|org|fm|io)/)
 | 
					      !!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(?<!-)\.)+(com|edu|gov|in|me|net|org|fm|io)/)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Internal: Is the blob a generated npm shrinkwrap file.
 | 
					    # Internal: Is the blob a generated npm shrinkwrap file?
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # Returns true or false.
 | 
					    # Returns true or false.
 | 
				
			||||||
    def npm_shrinkwrap?
 | 
					    def npm_shrinkwrap?
 | 
				
			||||||
@@ -333,7 +348,7 @@ module Linguist
 | 
				
			|||||||
      !!name.match(/composer\.lock/)
 | 
					      !!name.match(/composer\.lock/)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Internal: Is the blob a generated by Zephir
 | 
					    # Internal: Is the blob generated by Zephir?
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # Returns true or false.
 | 
					    # Returns true or false.
 | 
				
			||||||
    def generated_by_zephir?
 | 
					    def generated_by_zephir?
 | 
				
			||||||
@@ -433,5 +448,46 @@ module Linguist
 | 
				
			|||||||
      return false unless lines.count > 1
 | 
					      return false unless lines.count > 1
 | 
				
			||||||
      return lines[0].start_with?("// This is a generated file. Not intended for manual editing.")
 | 
					      return lines[0].start_with?("// This is a generated file. Not intended for manual editing.")
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Internal: Is this a roxygen2-generated file?
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # A roxygen2-generated file typically contain:
 | 
				
			||||||
 | 
					    # % Generated by roxygen2: do not edit by hand
 | 
				
			||||||
 | 
					    # on the first line.
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # Return true or false
 | 
				
			||||||
 | 
					    def generated_roxygen2?
 | 
				
			||||||
 | 
					      return false unless extname == '.Rd'
 | 
				
			||||||
 | 
					      return false unless lines.count > 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return lines[0].include?("% Generated by roxygen2: do not edit by hand")
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Internal: Is this a Jison-generated file?
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # Jison-generated parsers typically contain:
 | 
				
			||||||
 | 
					    # /* parser generated by jison
 | 
				
			||||||
 | 
					    # on the first line.
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # Jison-generated lexers typically contain:
 | 
				
			||||||
 | 
					    # /* generated by jison-lex
 | 
				
			||||||
 | 
					    # on the first line.
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # Return true or false
 | 
				
			||||||
 | 
					    def generated_jison?
 | 
				
			||||||
 | 
					      return false unless extname == '.js'
 | 
				
			||||||
 | 
					      return false unless lines.count > 1
 | 
				
			||||||
 | 
					      return lines[0].start_with?("/* parser generated by jison ") ||
 | 
				
			||||||
 | 
					             lines[0].start_with?("/* generated by jison-lex ")
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Internal: Is the blob a generated yarn lockfile?
 | 
				
			||||||
 | 
					    #
 | 
				
			||||||
 | 
					    # Returns true or false.
 | 
				
			||||||
 | 
					    def generated_yarn_lock?
 | 
				
			||||||
 | 
					      return false unless name.match(/yarn\.lock/)
 | 
				
			||||||
 | 
					      return false unless lines.count > 0
 | 
				
			||||||
 | 
					      return lines[0].include?("# THIS IS AN AUTOGENERATED FILE")
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -260,7 +260,7 @@ module Linguist
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    disambiguate ".md" do |data|
 | 
					    disambiguate ".md" do |data|
 | 
				
			||||||
      if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty?
 | 
					      if /(^[-a-z0-9=#!\*\[|>])|<\//i.match(data) || data.empty?
 | 
				
			||||||
        Language["Markdown"]
 | 
					        Language["Markdown"]
 | 
				
			||||||
      elsif /^(;;|\(define_)/.match(data)
 | 
					      elsif /^(;;|\(define_)/.match(data)
 | 
				
			||||||
        Language["GCC machine description"]
 | 
					        Language["GCC machine description"]
 | 
				
			||||||
@@ -278,7 +278,7 @@ module Linguist
 | 
				
			|||||||
    disambiguate ".mod" do |data|
 | 
					    disambiguate ".mod" do |data|
 | 
				
			||||||
      if data.include?('<!ENTITY ')
 | 
					      if data.include?('<!ENTITY ')
 | 
				
			||||||
        Language["XML"]
 | 
					        Language["XML"]
 | 
				
			||||||
      elsif /MODULE\s\w+\s*;/i.match(data) || /^\s*END \w+;$/i.match(data)
 | 
					      elsif /^\s*MODULE [\w\.]+;/i.match(data) || /^\s*END [\w\.]+;/i.match(data)
 | 
				
			||||||
        Language["Modula-2"]
 | 
					        Language["Modula-2"]
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        [Language["Linux Kernel Module"], Language["AMPL"]]
 | 
					        [Language["Linux Kernel Module"], Language["AMPL"]]
 | 
				
			||||||
@@ -326,7 +326,7 @@ module Linguist
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    disambiguate ".pl" do |data|
 | 
					    disambiguate ".pl" do |data|
 | 
				
			||||||
      if /^[^#]+:-/.match(data)
 | 
					      if /^[^#]*:-/.match(data)
 | 
				
			||||||
        Language["Prolog"]
 | 
					        Language["Prolog"]
 | 
				
			||||||
      elsif /use strict|use\s+v?5\./.match(data)
 | 
					      elsif /use strict|use\s+v?5\./.match(data)
 | 
				
			||||||
        Language["Perl"]
 | 
					        Language["Perl"]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -215,7 +215,14 @@ module Linguist
 | 
				
			|||||||
    # Returns the Language or nil if none was found.
 | 
					    # Returns the Language or nil if none was found.
 | 
				
			||||||
    def self.[](name)
 | 
					    def self.[](name)
 | 
				
			||||||
      return nil if name.to_s.empty?
 | 
					      return nil if name.to_s.empty?
 | 
				
			||||||
      name && (@index[name.downcase] || @index[name.split(',').first.downcase])
 | 
					
 | 
				
			||||||
 | 
					      lang = @index[name.downcase]
 | 
				
			||||||
 | 
					      return lang if lang
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      name = name.split(',').first
 | 
				
			||||||
 | 
					      return nil if name.to_s.empty?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @index[name.downcase]
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Public: A List of popular languages
 | 
					    # Public: A List of popular languages
 | 
				
			||||||
@@ -265,7 +272,7 @@ module Linguist
 | 
				
			|||||||
      @color = attributes[:color]
 | 
					      @color = attributes[:color]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Set aliases
 | 
					      # Set aliases
 | 
				
			||||||
      @aliases = [default_alias_name] + (attributes[:aliases] || [])
 | 
					      @aliases = [default_alias] + (attributes[:aliases] || [])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Load the TextMate scope name or try to guess one
 | 
					      # Load the TextMate scope name or try to guess one
 | 
				
			||||||
      @tm_scope = attributes[:tm_scope] || begin
 | 
					      @tm_scope = attributes[:tm_scope] || begin
 | 
				
			||||||
@@ -283,9 +290,6 @@ module Linguist
 | 
				
			|||||||
      @codemirror_mime_type = attributes[:codemirror_mime_type]
 | 
					      @codemirror_mime_type = attributes[:codemirror_mime_type]
 | 
				
			||||||
      @wrap = attributes[:wrap] || false
 | 
					      @wrap = attributes[:wrap] || false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Set legacy search term
 | 
					 | 
				
			||||||
      @search_term = attributes[:search_term] || default_alias_name
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      # Set the language_id
 | 
					      # Set the language_id
 | 
				
			||||||
      @language_id = attributes[:language_id]
 | 
					      @language_id = attributes[:language_id]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -437,12 +441,13 @@ module Linguist
 | 
				
			|||||||
      EscapeUtils.escape_url(name).gsub('+', '%20')
 | 
					      EscapeUtils.escape_url(name).gsub('+', '%20')
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Internal: Get default alias name
 | 
					    # Public: Get default alias name
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # Returns the alias name String
 | 
					    # Returns the alias name String
 | 
				
			||||||
    def default_alias_name
 | 
					    def default_alias
 | 
				
			||||||
      name.downcase.gsub(/\s/, '-')
 | 
					      name.downcase.gsub(/\s/, '-')
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					    alias_method :default_alias_name, :default_alias
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Public: Get Language group
 | 
					    # Public: Get Language group
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
@@ -557,7 +562,6 @@ module Linguist
 | 
				
			|||||||
      :wrap              => options['wrap'],
 | 
					      :wrap              => options['wrap'],
 | 
				
			||||||
      :group_name        => options['group'],
 | 
					      :group_name        => options['group'],
 | 
				
			||||||
      :searchable        => options.fetch('searchable', true),
 | 
					      :searchable        => options.fetch('searchable', true),
 | 
				
			||||||
      :search_term       => options['search_term'],
 | 
					 | 
				
			||||||
      :language_id       => options['language_id'],
 | 
					      :language_id       => options['language_id'],
 | 
				
			||||||
      :extensions        => Array(options['extensions']),
 | 
					      :extensions        => Array(options['extensions']),
 | 
				
			||||||
      :interpreters      => options['interpreters'].sort,
 | 
					      :interpreters      => options['interpreters'].sort,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -499,6 +499,7 @@ C++:
 | 
				
			|||||||
  - ".inc"
 | 
					  - ".inc"
 | 
				
			||||||
  - ".inl"
 | 
					  - ".inl"
 | 
				
			||||||
  - ".ipp"
 | 
					  - ".ipp"
 | 
				
			||||||
 | 
					  - ".re"
 | 
				
			||||||
  - ".tcc"
 | 
					  - ".tcc"
 | 
				
			||||||
  - ".tpp"
 | 
					  - ".tpp"
 | 
				
			||||||
  language_id: 43
 | 
					  language_id: 43
 | 
				
			||||||
@@ -1120,6 +1121,7 @@ Emacs Lisp:
 | 
				
			|||||||
  - ".gnus"
 | 
					  - ".gnus"
 | 
				
			||||||
  - ".spacemacs"
 | 
					  - ".spacemacs"
 | 
				
			||||||
  - ".viper"
 | 
					  - ".viper"
 | 
				
			||||||
 | 
					  - Cask
 | 
				
			||||||
  - Project.ede
 | 
					  - Project.ede
 | 
				
			||||||
  - _emacs
 | 
					  - _emacs
 | 
				
			||||||
  - abbrev_defs
 | 
					  - abbrev_defs
 | 
				
			||||||
@@ -1154,6 +1156,7 @@ Erlang:
 | 
				
			|||||||
  - ".xrl"
 | 
					  - ".xrl"
 | 
				
			||||||
  - ".yrl"
 | 
					  - ".yrl"
 | 
				
			||||||
  filenames:
 | 
					  filenames:
 | 
				
			||||||
 | 
					  - Emakefile
 | 
				
			||||||
  - rebar.config
 | 
					  - rebar.config
 | 
				
			||||||
  - rebar.config.lock
 | 
					  - rebar.config.lock
 | 
				
			||||||
  - rebar.lock
 | 
					  - rebar.lock
 | 
				
			||||||
@@ -1384,6 +1387,14 @@ Game Maker Language:
 | 
				
			|||||||
  codemirror_mode: clike
 | 
					  codemirror_mode: clike
 | 
				
			||||||
  codemirror_mime_type: text/x-c++src
 | 
					  codemirror_mime_type: text/x-c++src
 | 
				
			||||||
  language_id: 125
 | 
					  language_id: 125
 | 
				
			||||||
 | 
					Genie:
 | 
				
			||||||
 | 
					  type: programming
 | 
				
			||||||
 | 
					  ace_mode: text
 | 
				
			||||||
 | 
					  extensions:
 | 
				
			||||||
 | 
					  - ".gs"
 | 
				
			||||||
 | 
					  color: "#fb855d"
 | 
				
			||||||
 | 
					  tm_scope: none
 | 
				
			||||||
 | 
					  language_id: 792408528
 | 
				
			||||||
Genshi:
 | 
					Genshi:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
@@ -1595,7 +1606,7 @@ HTML:
 | 
				
			|||||||
  ace_mode: html
 | 
					  ace_mode: html
 | 
				
			||||||
  codemirror_mode: htmlmixed
 | 
					  codemirror_mode: htmlmixed
 | 
				
			||||||
  codemirror_mime_type: text/html
 | 
					  codemirror_mime_type: text/html
 | 
				
			||||||
  color: "#e44b23"
 | 
					  color: "#e34c26"
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
  - xhtml
 | 
					  - xhtml
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
@@ -1754,7 +1765,7 @@ Hy:
 | 
				
			|||||||
  - ".hy"
 | 
					  - ".hy"
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
  - hylang
 | 
					  - hylang
 | 
				
			||||||
  tm_scope: source.hy
 | 
					  tm_scope: none
 | 
				
			||||||
  language_id: 159
 | 
					  language_id: 159
 | 
				
			||||||
HyPhy:
 | 
					HyPhy:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
@@ -2281,6 +2292,8 @@ LookML:
 | 
				
			|||||||
  color: "#652B81"
 | 
					  color: "#652B81"
 | 
				
			||||||
  extensions:
 | 
					  extensions:
 | 
				
			||||||
  - ".lookml"
 | 
					  - ".lookml"
 | 
				
			||||||
 | 
					  - ".model.lkml"
 | 
				
			||||||
 | 
					  - ".view.lkml"
 | 
				
			||||||
  tm_scope: source.yaml
 | 
					  tm_scope: source.yaml
 | 
				
			||||||
  language_id: 211
 | 
					  language_id: 211
 | 
				
			||||||
LoomScript:
 | 
					LoomScript:
 | 
				
			||||||
@@ -3216,6 +3229,7 @@ PowerBuilder:
 | 
				
			|||||||
  language_id: 292
 | 
					  language_id: 292
 | 
				
			||||||
PowerShell:
 | 
					PowerShell:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
 | 
					  color: "#012456"
 | 
				
			||||||
  ace_mode: powershell
 | 
					  ace_mode: powershell
 | 
				
			||||||
  codemirror_mode: powershell
 | 
					  codemirror_mode: powershell
 | 
				
			||||||
  codemirror_mime_type: application/x-powershell
 | 
					  codemirror_mime_type: application/x-powershell
 | 
				
			||||||
@@ -3548,6 +3562,19 @@ Raw token data:
 | 
				
			|||||||
  tm_scope: none
 | 
					  tm_scope: none
 | 
				
			||||||
  ace_mode: text
 | 
					  ace_mode: text
 | 
				
			||||||
  language_id: 318
 | 
					  language_id: 318
 | 
				
			||||||
 | 
					Reason:
 | 
				
			||||||
 | 
					  type: programming
 | 
				
			||||||
 | 
					  group: OCaml
 | 
				
			||||||
 | 
					  ace_mode: rust
 | 
				
			||||||
 | 
					  codemirror_mode: rust
 | 
				
			||||||
 | 
					  codemirror_mime_type: text/x-rustsrc
 | 
				
			||||||
 | 
					  extensions:
 | 
				
			||||||
 | 
					  - ".re"
 | 
				
			||||||
 | 
					  - ".rei"
 | 
				
			||||||
 | 
					  interpreters:
 | 
				
			||||||
 | 
					  - ocaml
 | 
				
			||||||
 | 
					  tm_scope: source.reason
 | 
				
			||||||
 | 
					  language_id: 869538413
 | 
				
			||||||
Rebol:
 | 
					Rebol:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  color: "#358a5b"
 | 
					  color: "#358a5b"
 | 
				
			||||||
@@ -3578,6 +3605,17 @@ Redcode:
 | 
				
			|||||||
  tm_scope: none
 | 
					  tm_scope: none
 | 
				
			||||||
  ace_mode: text
 | 
					  ace_mode: text
 | 
				
			||||||
  language_id: 321
 | 
					  language_id: 321
 | 
				
			||||||
 | 
					Regular Expression:
 | 
				
			||||||
 | 
					  type: data
 | 
				
			||||||
 | 
					  extensions:
 | 
				
			||||||
 | 
					  - ".regexp"
 | 
				
			||||||
 | 
					  - ".regex"
 | 
				
			||||||
 | 
					  aliases:
 | 
				
			||||||
 | 
					  - regexp
 | 
				
			||||||
 | 
					  - regex
 | 
				
			||||||
 | 
					  ace_mode: text
 | 
				
			||||||
 | 
					  tm_scope: source.regexp
 | 
				
			||||||
 | 
					  language_id: 363378884
 | 
				
			||||||
Ren'Py:
 | 
					Ren'Py:
 | 
				
			||||||
  type: programming
 | 
					  type: programming
 | 
				
			||||||
  aliases:
 | 
					  aliases:
 | 
				
			||||||
@@ -3790,6 +3828,7 @@ SQL:
 | 
				
			|||||||
  - ".cql"
 | 
					  - ".cql"
 | 
				
			||||||
  - ".ddl"
 | 
					  - ".ddl"
 | 
				
			||||||
  - ".inc"
 | 
					  - ".inc"
 | 
				
			||||||
 | 
					  - ".mysql"
 | 
				
			||||||
  - ".prc"
 | 
					  - ".prc"
 | 
				
			||||||
  - ".tab"
 | 
					  - ".tab"
 | 
				
			||||||
  - ".udf"
 | 
					  - ".udf"
 | 
				
			||||||
@@ -4274,12 +4313,16 @@ Text:
 | 
				
			|||||||
  - ".no"
 | 
					  - ".no"
 | 
				
			||||||
  filenames:
 | 
					  filenames:
 | 
				
			||||||
  - COPYING
 | 
					  - COPYING
 | 
				
			||||||
 | 
					  - COPYRIGHT.regex
 | 
				
			||||||
  - FONTLOG
 | 
					  - FONTLOG
 | 
				
			||||||
  - INSTALL
 | 
					  - INSTALL
 | 
				
			||||||
 | 
					  - INSTALL.mysql
 | 
				
			||||||
  - LICENSE
 | 
					  - LICENSE
 | 
				
			||||||
 | 
					  - LICENSE.mysql
 | 
				
			||||||
  - NEWS
 | 
					  - NEWS
 | 
				
			||||||
  - README.1ST
 | 
					  - README.1ST
 | 
				
			||||||
  - README.me
 | 
					  - README.me
 | 
				
			||||||
 | 
					  - README.mysql
 | 
				
			||||||
  - click.me
 | 
					  - click.me
 | 
				
			||||||
  - delete.me
 | 
					  - delete.me
 | 
				
			||||||
  - keep.me
 | 
					  - keep.me
 | 
				
			||||||
@@ -4566,6 +4609,15 @@ XC:
 | 
				
			|||||||
  codemirror_mode: clike
 | 
					  codemirror_mode: clike
 | 
				
			||||||
  codemirror_mime_type: text/x-csrc
 | 
					  codemirror_mime_type: text/x-csrc
 | 
				
			||||||
  language_id: 398
 | 
					  language_id: 398
 | 
				
			||||||
 | 
					XCompose:
 | 
				
			||||||
 | 
					  type: data
 | 
				
			||||||
 | 
					  filenames:
 | 
				
			||||||
 | 
					  - ".XCompose"
 | 
				
			||||||
 | 
					  - XCompose
 | 
				
			||||||
 | 
					  - xcompose
 | 
				
			||||||
 | 
					  tm_scope: config.xcompose
 | 
				
			||||||
 | 
					  ace_mode: text
 | 
				
			||||||
 | 
					  language_id: 225167241
 | 
				
			||||||
XML:
 | 
					XML:
 | 
				
			||||||
  type: data
 | 
					  type: data
 | 
				
			||||||
  ace_mode: xml
 | 
					  ace_mode: xml
 | 
				
			||||||
@@ -4759,6 +4811,7 @@ YAML:
 | 
				
			|||||||
  - ".syntax"
 | 
					  - ".syntax"
 | 
				
			||||||
  - ".yaml"
 | 
					  - ".yaml"
 | 
				
			||||||
  - ".yaml-tmlanguage"
 | 
					  - ".yaml-tmlanguage"
 | 
				
			||||||
 | 
					  - ".yml.mysql"
 | 
				
			||||||
  filenames:
 | 
					  filenames:
 | 
				
			||||||
  - ".clang-format"
 | 
					  - ".clang-format"
 | 
				
			||||||
  ace_mode: yaml
 | 
					  ace_mode: yaml
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -238,6 +238,12 @@
 | 
				
			|||||||
# BuddyBuild
 | 
					# BuddyBuild
 | 
				
			||||||
- BuddyBuildSDK.framework/
 | 
					- BuddyBuildSDK.framework/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Realm
 | 
				
			||||||
 | 
					- Realm.framework
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# RealmSwift
 | 
				
			||||||
 | 
					- RealmSwift.framework
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# git config files
 | 
					# git config files
 | 
				
			||||||
- gitattributes$
 | 
					- gitattributes$
 | 
				
			||||||
- gitignore$
 | 
					- gitignore$
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
module Linguist
 | 
					module Linguist
 | 
				
			||||||
  VERSION = "5.0.0"
 | 
					  VERSION = "5.0.5"
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										46
									
								
								samples/C++/bug1163046.--skeleton.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/C++/bug1163046.--skeleton.re
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define YYCTYPE unsigned char
 | 
				
			||||||
 | 
					#define YYCURSOR cursor
 | 
				
			||||||
 | 
					#define YYLIMIT cursor
 | 
				
			||||||
 | 
					#define YYMARKER marker
 | 
				
			||||||
 | 
					#define YYFILL(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool scan(const char *text)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						YYCTYPE *start = (YYCTYPE *)text;
 | 
				
			||||||
 | 
						YYCTYPE *cursor = (YYCTYPE *)text;
 | 
				
			||||||
 | 
						YYCTYPE *marker = (YYCTYPE *)text;
 | 
				
			||||||
 | 
					next:
 | 
				
			||||||
 | 
						YYCTYPE *token = cursor;
 | 
				
			||||||
 | 
					/*!re2c
 | 
				
			||||||
 | 
					'(This file must be converted with BinHex 4.0)'
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (token == start || *(token - 1) == '\n')
 | 
				
			||||||
 | 
							return true; else goto next;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					[\001-\377]
 | 
				
			||||||
 | 
						{ goto next; }
 | 
				
			||||||
 | 
					[\000]
 | 
				
			||||||
 | 
						{ return false; }
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define do_scan(str, expect) \
 | 
				
			||||||
 | 
						res = scan(str) == expect ? 0 : 1; \
 | 
				
			||||||
 | 
						std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \
 | 
				
			||||||
 | 
						result += res
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!max:re2c */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int,void**)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int res, result = 0;
 | 
				
			||||||
 | 
						do_scan("(This file must be converted with BinHex 4.0)", 1);
 | 
				
			||||||
 | 
						do_scan("x(This file must be converted with BinHex 4.0)", 0);
 | 
				
			||||||
 | 
						do_scan("(This file must be converted with BinHex 4.0)x", 1);
 | 
				
			||||||
 | 
						do_scan("x(This file must be converted with BinHex 4.0)x", 0);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										239
									
								
								samples/C++/cnokw.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								samples/C++/cnokw.re
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,239 @@
 | 
				
			|||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	ADDEQ	257
 | 
				
			||||||
 | 
					#define	ANDAND	258
 | 
				
			||||||
 | 
					#define	ANDEQ	259
 | 
				
			||||||
 | 
					#define	ARRAY	260
 | 
				
			||||||
 | 
					#define	ASM	261
 | 
				
			||||||
 | 
					#define	AUTO	262
 | 
				
			||||||
 | 
					#define	BREAK	263
 | 
				
			||||||
 | 
					#define	CASE	264
 | 
				
			||||||
 | 
					#define	CHAR	265
 | 
				
			||||||
 | 
					#define	CONST	266
 | 
				
			||||||
 | 
					#define	CONTINUE	267
 | 
				
			||||||
 | 
					#define	DECR	268
 | 
				
			||||||
 | 
					#define	DEFAULT	269
 | 
				
			||||||
 | 
					#define	DEREF	270
 | 
				
			||||||
 | 
					#define	DIVEQ	271
 | 
				
			||||||
 | 
					#define	DO	272
 | 
				
			||||||
 | 
					#define	DOUBLE	273
 | 
				
			||||||
 | 
					#define	ELLIPSIS	274
 | 
				
			||||||
 | 
					#define	ELSE	275
 | 
				
			||||||
 | 
					#define	ENUM	276
 | 
				
			||||||
 | 
					#define	EQL	277
 | 
				
			||||||
 | 
					#define	EXTERN	278
 | 
				
			||||||
 | 
					#define	FCON	279
 | 
				
			||||||
 | 
					#define	FLOAT	280
 | 
				
			||||||
 | 
					#define	FOR	281
 | 
				
			||||||
 | 
					#define	FUNCTION	282
 | 
				
			||||||
 | 
					#define	GEQ	283
 | 
				
			||||||
 | 
					#define	GOTO	284
 | 
				
			||||||
 | 
					#define	ICON	285
 | 
				
			||||||
 | 
					#define	ID	286
 | 
				
			||||||
 | 
					#define	IF	287
 | 
				
			||||||
 | 
					#define	INCR	288
 | 
				
			||||||
 | 
					#define	INT	289
 | 
				
			||||||
 | 
					#define	LEQ	290
 | 
				
			||||||
 | 
					#define	LONG	291
 | 
				
			||||||
 | 
					#define	LSHIFT	292
 | 
				
			||||||
 | 
					#define	LSHIFTEQ	293
 | 
				
			||||||
 | 
					#define	MODEQ	294
 | 
				
			||||||
 | 
					#define	MULEQ	295
 | 
				
			||||||
 | 
					#define	NEQ	296
 | 
				
			||||||
 | 
					#define	OREQ	297
 | 
				
			||||||
 | 
					#define	OROR	298
 | 
				
			||||||
 | 
					#define	POINTER	299
 | 
				
			||||||
 | 
					#define	REGISTER	300
 | 
				
			||||||
 | 
					#define	RETURN	301
 | 
				
			||||||
 | 
					#define	RSHIFT	302
 | 
				
			||||||
 | 
					#define	RSHIFTEQ	303
 | 
				
			||||||
 | 
					#define	SCON	304
 | 
				
			||||||
 | 
					#define	SHORT	305
 | 
				
			||||||
 | 
					#define	SIGNED	306
 | 
				
			||||||
 | 
					#define	SIZEOF	307
 | 
				
			||||||
 | 
					#define	STATIC	308
 | 
				
			||||||
 | 
					#define	STRUCT	309
 | 
				
			||||||
 | 
					#define	SUBEQ	310
 | 
				
			||||||
 | 
					#define	SWITCH	311
 | 
				
			||||||
 | 
					#define	TYPEDEF	312
 | 
				
			||||||
 | 
					#define	UNION	313
 | 
				
			||||||
 | 
					#define	UNSIGNED	314
 | 
				
			||||||
 | 
					#define	VOID	315
 | 
				
			||||||
 | 
					#define	VOLATILE	316
 | 
				
			||||||
 | 
					#define	WHILE	317
 | 
				
			||||||
 | 
					#define	XOREQ	318
 | 
				
			||||||
 | 
					#define	EOI	319
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef unsigned int uint;
 | 
				
			||||||
 | 
					typedef unsigned char uchar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	BSIZE	8192
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	YYCTYPE		uchar
 | 
				
			||||||
 | 
					#define	YYCURSOR	cursor
 | 
				
			||||||
 | 
					#define	YYLIMIT		s->lim
 | 
				
			||||||
 | 
					#define	YYMARKER	s->ptr
 | 
				
			||||||
 | 
					#define	YYFILL(n)	{cursor = fill(s, cursor);}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	RET(i)	{s->cur = cursor; return i;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct Scanner {
 | 
				
			||||||
 | 
					    int			fd;
 | 
				
			||||||
 | 
					    uchar		*bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof;
 | 
				
			||||||
 | 
					    uint		line;
 | 
				
			||||||
 | 
					} Scanner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uchar *fill(Scanner *s, uchar *cursor){
 | 
				
			||||||
 | 
					    if(!s->eof){
 | 
				
			||||||
 | 
						uint cnt = s->tok - s->bot;
 | 
				
			||||||
 | 
						if(cnt){
 | 
				
			||||||
 | 
						    memcpy(s->bot, s->tok, s->lim - s->tok);
 | 
				
			||||||
 | 
						    s->tok = s->bot;
 | 
				
			||||||
 | 
						    s->ptr -= cnt;
 | 
				
			||||||
 | 
						    cursor -= cnt;
 | 
				
			||||||
 | 
						    s->pos -= cnt;
 | 
				
			||||||
 | 
						    s->lim -= cnt;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if((s->top - s->lim) < BSIZE){
 | 
				
			||||||
 | 
						    uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar));
 | 
				
			||||||
 | 
						    memcpy(buf, s->tok, s->lim - s->tok);
 | 
				
			||||||
 | 
						    s->tok = buf;
 | 
				
			||||||
 | 
						    s->ptr = &buf[s->ptr - s->bot];
 | 
				
			||||||
 | 
						    cursor = &buf[cursor - s->bot];
 | 
				
			||||||
 | 
						    s->pos = &buf[s->pos - s->bot];
 | 
				
			||||||
 | 
						    s->lim = &buf[s->lim - s->bot];
 | 
				
			||||||
 | 
						    s->top = &s->lim[BSIZE];
 | 
				
			||||||
 | 
						    free(s->bot);
 | 
				
			||||||
 | 
						    s->bot = buf;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){
 | 
				
			||||||
 | 
						    s->eof = &s->lim[cnt]; *(s->eof)++ = '\n';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						s->lim += cnt;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return cursor;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int scan(Scanner *s){
 | 
				
			||||||
 | 
						uchar *cursor = s->cur;
 | 
				
			||||||
 | 
					std:
 | 
				
			||||||
 | 
						s->tok = cursor;
 | 
				
			||||||
 | 
					/*!re2c
 | 
				
			||||||
 | 
					any	= [\000-\377];
 | 
				
			||||||
 | 
					O	= [0-7];
 | 
				
			||||||
 | 
					D	= [0-9];
 | 
				
			||||||
 | 
					L	= [a-zA-Z_];
 | 
				
			||||||
 | 
					H	= [a-fA-F0-9];
 | 
				
			||||||
 | 
					E	= [Ee] [+-]? D+;
 | 
				
			||||||
 | 
					FS	= [fFlL];
 | 
				
			||||||
 | 
					IS	= [uUlL]*;
 | 
				
			||||||
 | 
					ESC	= [\\] ([abfnrtv?'"\\] | "x" H+ | O+);
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!re2c
 | 
				
			||||||
 | 
						"/*"			{ goto comment; }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						L (L|D)*		{ RET(ID); }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						("0" [xX] H+ IS?) | ("0" D+ IS?) | (D+ IS?) |
 | 
				
			||||||
 | 
						(['] (ESC|any\[\n\\'])* ['])
 | 
				
			||||||
 | 
									{ RET(ICON); }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						(D+ E FS?) | (D* "." D+ E? FS?) | (D+ "." D* E? FS?)
 | 
				
			||||||
 | 
									{ RET(FCON); }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						(["] (ESC|any\[\n\\"])* ["])
 | 
				
			||||||
 | 
									{ RET(SCON); }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						"..."                   { RET(ELLIPSIS); }
 | 
				
			||||||
 | 
						">>="			{ RET(RSHIFTEQ); }
 | 
				
			||||||
 | 
						"<<="			{ RET(LSHIFTEQ); }
 | 
				
			||||||
 | 
						"+="			{ RET(ADDEQ); }
 | 
				
			||||||
 | 
						"-="			{ RET(SUBEQ); }
 | 
				
			||||||
 | 
						"*="			{ RET(MULEQ); }
 | 
				
			||||||
 | 
						"/="			{ RET(DIVEQ); }
 | 
				
			||||||
 | 
						"%="			{ RET(MODEQ); }
 | 
				
			||||||
 | 
						"&="			{ RET(ANDEQ); }
 | 
				
			||||||
 | 
						"^="			{ RET(XOREQ); }
 | 
				
			||||||
 | 
						"|="			{ RET(OREQ); }
 | 
				
			||||||
 | 
						">>"			{ RET(RSHIFT); }
 | 
				
			||||||
 | 
						"<<"			{ RET(LSHIFT); }
 | 
				
			||||||
 | 
						"++"			{ RET(INCR); }
 | 
				
			||||||
 | 
						"--"			{ RET(DECR); }
 | 
				
			||||||
 | 
						"->"			{ RET(DEREF); }
 | 
				
			||||||
 | 
						"&&"			{ RET(ANDAND); }
 | 
				
			||||||
 | 
						"||"			{ RET(OROR); }
 | 
				
			||||||
 | 
						"<="			{ RET(LEQ); }
 | 
				
			||||||
 | 
						">="			{ RET(GEQ); }
 | 
				
			||||||
 | 
						"=="			{ RET(EQL); }
 | 
				
			||||||
 | 
						"!="			{ RET(NEQ); }
 | 
				
			||||||
 | 
						";"			{ RET(';'); }
 | 
				
			||||||
 | 
						"{"			{ RET('{'); }
 | 
				
			||||||
 | 
						"}"			{ RET('}'); }
 | 
				
			||||||
 | 
						","			{ RET(','); }
 | 
				
			||||||
 | 
						":"			{ RET(':'); }
 | 
				
			||||||
 | 
						"="			{ RET('='); }
 | 
				
			||||||
 | 
						"("			{ RET('('); }
 | 
				
			||||||
 | 
						")"			{ RET(')'); }
 | 
				
			||||||
 | 
						"["			{ RET('['); }
 | 
				
			||||||
 | 
						"]"			{ RET(']'); }
 | 
				
			||||||
 | 
						"."			{ RET('.'); }
 | 
				
			||||||
 | 
						"&"			{ RET('&'); }
 | 
				
			||||||
 | 
						"!"			{ RET('!'); }
 | 
				
			||||||
 | 
						"~"			{ RET('~'); }
 | 
				
			||||||
 | 
						"-"			{ RET('-'); }
 | 
				
			||||||
 | 
						"+"			{ RET('+'); }
 | 
				
			||||||
 | 
						"*"			{ RET('*'); }
 | 
				
			||||||
 | 
						"/"			{ RET('/'); }
 | 
				
			||||||
 | 
						"%"			{ RET('%'); }
 | 
				
			||||||
 | 
						"<"			{ RET('<'); }
 | 
				
			||||||
 | 
						">"			{ RET('>'); }
 | 
				
			||||||
 | 
						"^"			{ RET('^'); }
 | 
				
			||||||
 | 
						"|"			{ RET('|'); }
 | 
				
			||||||
 | 
						"?"			{ RET('?'); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ \t\v\f]+		{ goto std; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"\n"
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
							if(cursor == s->eof) RET(EOI);
 | 
				
			||||||
 | 
							s->pos = cursor; s->line++;
 | 
				
			||||||
 | 
							goto std;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						any
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
							printf("unexpected character: %c\n", *s->tok);
 | 
				
			||||||
 | 
							goto std;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					comment:
 | 
				
			||||||
 | 
					/*!re2c
 | 
				
			||||||
 | 
						"*/"			{ goto std; }
 | 
				
			||||||
 | 
						"\n"
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
							if(cursor == s->eof) RET(EOI);
 | 
				
			||||||
 | 
							s->tok = s->pos = cursor; s->line++;
 | 
				
			||||||
 | 
							goto comment;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					        any			{ goto comment; }
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(){
 | 
				
			||||||
 | 
					    Scanner in;
 | 
				
			||||||
 | 
					    int t;
 | 
				
			||||||
 | 
					    memset((char*) &in, 0, sizeof(in));
 | 
				
			||||||
 | 
					    in.fd = 0;
 | 
				
			||||||
 | 
					    while((t = scan(&in)) != EOI){
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						printf("%d\t%.*s\n", t, in.cur - in.tok, in.tok);
 | 
				
			||||||
 | 
						printf("%d\n", t);
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    close(in.fd);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										63
									
								
								samples/C++/cvsignore.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								samples/C++/cvsignore.re
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					#define YYFILL(n) if (cursor >= limit) break;
 | 
				
			||||||
 | 
					#define YYCTYPE char
 | 
				
			||||||
 | 
					#define YYCURSOR cursor
 | 
				
			||||||
 | 
					#define YYLIMIT limit
 | 
				
			||||||
 | 
					#define YYMARKER marker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*!re2c
 | 
				
			||||||
 | 
					any     = (.|"\n");
 | 
				
			||||||
 | 
					value	= (":" (.\"$")+)?;
 | 
				
			||||||
 | 
					cvsdat	= "Date";
 | 
				
			||||||
 | 
					cvsid	= "Id";
 | 
				
			||||||
 | 
					cvslog	= "Log";
 | 
				
			||||||
 | 
					cvsrev	= "Revision";
 | 
				
			||||||
 | 
					cvssrc	= "Source";
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define APPEND(text) \
 | 
				
			||||||
 | 
						append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						memcpy(output + outsize, text, len);
 | 
				
			||||||
 | 
						outsize += (len / sizeof(YYCTYPE));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// rule
 | 
				
			||||||
 | 
						// scan lines
 | 
				
			||||||
 | 
						// find $ in lines
 | 
				
			||||||
 | 
						//   compact $<keyword>: .. $ to $<keyword>$
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
						YYCTYPE *output;
 | 
				
			||||||
 | 
						const YYCTYPE *cursor, *limit, *marker;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cursor = marker = output = *pText;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						size_t insize = *pSize;
 | 
				
			||||||
 | 
						size_t outsize = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						limit = cursor + insize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while(1) {
 | 
				
			||||||
 | 
					loop:
 | 
				
			||||||
 | 
					/*!re2c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"$" cvsdat value "$"	{ APPEND(L"$" L"Date$"); goto loop; }
 | 
				
			||||||
 | 
					"$" cvsid  value "$"	{ APPEND(L"$" L"Id$"); goto loop; }
 | 
				
			||||||
 | 
					"$" cvslog value "$"	{ APPEND(L"$" L"Log$"); goto loop; }
 | 
				
			||||||
 | 
					"$" cvsrev value "$"	{ APPEND(L"$" L"Revision$"); goto loop; }
 | 
				
			||||||
 | 
					"$" cvssrc value "$"	{ APPEND(L"$" L"Source$"); goto loop; }
 | 
				
			||||||
 | 
					any						{ output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						output[outsize] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// set the new size
 | 
				
			||||||
 | 
						*pSize = outsize;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						*pbChanged = (insize == outsize) ? 0 : 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								samples/C++/simple.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/C++/simple.re
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					#define	NULL		((char*) 0)
 | 
				
			||||||
 | 
					char *scan(char *p){
 | 
				
			||||||
 | 
					char *q;
 | 
				
			||||||
 | 
					#define	YYCTYPE		char
 | 
				
			||||||
 | 
					#define	YYCURSOR	p
 | 
				
			||||||
 | 
					#define	YYLIMIT		p
 | 
				
			||||||
 | 
					#define	YYMARKER	q
 | 
				
			||||||
 | 
					#define	YYFILL(n)
 | 
				
			||||||
 | 
					/*!re2c
 | 
				
			||||||
 | 
						[0-9]+		{return YYCURSOR;}
 | 
				
			||||||
 | 
						[\000-\377]	{return NULL;}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								samples/Emacs Lisp/filenames/Cask
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Emacs Lisp/filenames/Cask
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					(package "composer" "0.0.7" "Interface to PHP Composer")
 | 
				
			||||||
 | 
					(source "melpa" "https://melpa.org/packages/")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(package-file "composer.el")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(depends-on "f")
 | 
				
			||||||
 | 
					(depends-on "s")
 | 
				
			||||||
 | 
					(depends-on "request")
 | 
				
			||||||
 | 
					(depends-on "seq")
 | 
				
			||||||
							
								
								
									
										7
									
								
								samples/Erlang/filenames/Emakefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Erlang/filenames/Emakefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					{"src/*", [
 | 
				
			||||||
 | 
					   report, 
 | 
				
			||||||
 | 
					   verbose, 
 | 
				
			||||||
 | 
					   {i, "include"}, 
 | 
				
			||||||
 | 
					   {outdir, "ebin"},
 | 
				
			||||||
 | 
					   debug_info 
 | 
				
			||||||
 | 
					]}.
 | 
				
			||||||
							
								
								
									
										12
									
								
								samples/Genie/Class.gs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								samples/Genie/Class.gs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					init
 | 
				
			||||||
 | 
						new Demo( "Demonstration class" ).run()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Demo
 | 
				
			||||||
 | 
						_message:string = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						construct ( message:string = "Optional argument - no message passed in constructor" )
 | 
				
			||||||
 | 
							_message = message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def run()
 | 
				
			||||||
 | 
							print( _message )
 | 
				
			||||||
 | 
							
 | 
				
			||||||
							
								
								
									
										2
									
								
								samples/Genie/Hello.gs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								samples/Genie/Hello.gs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					init
 | 
				
			||||||
 | 
						print( "Hello, World!" )
 | 
				
			||||||
							
								
								
									
										923
									
								
								samples/JavaScript/ccalc-lex.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										923
									
								
								samples/JavaScript/ccalc-lex.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,923 @@
 | 
				
			|||||||
 | 
					/* generated by jison-lex 0.3.4-159 */
 | 
				
			||||||
 | 
					var ccalcLex = (function () {
 | 
				
			||||||
 | 
					// See also:
 | 
				
			||||||
 | 
					// http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508
 | 
				
			||||||
 | 
					// but we keep the prototype.constructor and prototype.name assignment lines too for compatibility
 | 
				
			||||||
 | 
					// with userland code which might access the derived class in a 'classic' way.
 | 
				
			||||||
 | 
					function JisonLexerError(msg, hash) {
 | 
				
			||||||
 | 
					    Object.defineProperty(this, 'name', {
 | 
				
			||||||
 | 
					        enumerable: false,
 | 
				
			||||||
 | 
					        writable: false,
 | 
				
			||||||
 | 
					        value: 'JisonLexerError'
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (msg == null) msg = '???';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Object.defineProperty(this, 'message', {
 | 
				
			||||||
 | 
					        enumerable: false,
 | 
				
			||||||
 | 
					        writable: true,
 | 
				
			||||||
 | 
					        value: msg
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.hash = hash;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var stacktrace;
 | 
				
			||||||
 | 
					    if (hash && hash.exception instanceof Error) {
 | 
				
			||||||
 | 
					        var ex2 = hash.exception;
 | 
				
			||||||
 | 
					        this.message = ex2.message || msg;
 | 
				
			||||||
 | 
					        stacktrace = ex2.stack;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!stacktrace) {
 | 
				
			||||||
 | 
					        if (Error.hasOwnProperty('captureStackTrace')) { // V8
 | 
				
			||||||
 | 
					            Error.captureStackTrace(this, this.constructor);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            stacktrace = (new Error(msg)).stack;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (stacktrace) {
 | 
				
			||||||
 | 
					        Object.defineProperty(this, 'stack', {
 | 
				
			||||||
 | 
					            enumerable: false,
 | 
				
			||||||
 | 
					            writable: false,
 | 
				
			||||||
 | 
					            value: stacktrace
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (typeof Object.setPrototypeOf === 'function') {
 | 
				
			||||||
 | 
					    Object.setPrototypeOf(JisonLexerError.prototype, Error.prototype);
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					    JisonLexerError.prototype = Object.create(Error.prototype);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					JisonLexerError.prototype.constructor = JisonLexerError;
 | 
				
			||||||
 | 
					JisonLexerError.prototype.name = 'JisonLexerError';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var lexer = {
 | 
				
			||||||
 | 
					    EOF: 1,
 | 
				
			||||||
 | 
					    ERROR: 2,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // JisonLexerError: JisonLexerError,        // <-- injected by the code generator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // options: {},                             // <-- injected by the code generator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // yy: ...,                                 // <-- injected by setInput()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    __currentRuleSet__: null,                   // <-- internal rule set cache for the current lexer state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    __error_infos: [],                          // INTERNAL USE ONLY: the set of lexErrorInfo objects created since the last cleanup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    __decompressed: false,                      // INTERNAL USE ONLY: mark whether the lexer instance has been 'unfolded' completely and is now ready for use
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    done: false,                                // INTERNAL USE ONLY
 | 
				
			||||||
 | 
					    _backtrack: false,                          // INTERNAL USE ONLY
 | 
				
			||||||
 | 
					    _input: '',                                 // INTERNAL USE ONLY
 | 
				
			||||||
 | 
					    _more: false,                               // INTERNAL USE ONLY
 | 
				
			||||||
 | 
					    _signaled_error_token: false,               // INTERNAL USE ONLY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    conditionStack: [],                         // INTERNAL USE ONLY; managed via `pushState()`, `popState()`, `topState()` and `stateStackSize()`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    match: '',                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction. `match` is identical to `yytext` except that this one still contains the matched input string after `lexer.performAction()` has been invoked, where userland code MAY have changed/replaced the `yytext` value entirely!
 | 
				
			||||||
 | 
					    matched: '',                                // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks entire input which has been matched so far
 | 
				
			||||||
 | 
					    matches: false,                             // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks RE match result for last (successful) match attempt
 | 
				
			||||||
 | 
					    yytext: '',                                 // ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction; this value is transferred to the parser as the 'token value' when the parser consumes the lexer token produced through a call to the `lex()` API.
 | 
				
			||||||
 | 
					    offset: 0,                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks the 'cursor position' in the input string, i.e. the number of characters matched so far
 | 
				
			||||||
 | 
					    yyleng: 0,                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: length of matched input for the token under construction (`yytext`)
 | 
				
			||||||
 | 
					    yylineno: 0,                                // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: 'line number' at which the token under construction is located
 | 
				
			||||||
 | 
					    yylloc: null,                               // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks location info (lines + columns) for the token under construction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // INTERNAL USE: construct a suitable error info hash object instance for `parseError`.
 | 
				
			||||||
 | 
					    constructLexErrorInfo: function lexer_constructLexErrorInfo(msg, recoverable) {
 | 
				
			||||||
 | 
					        var pei = {
 | 
				
			||||||
 | 
					            errStr: msg,
 | 
				
			||||||
 | 
					            recoverable: !!recoverable,
 | 
				
			||||||
 | 
					            text: this.match,           // This one MAY be empty; userland code should use the `upcomingInput` API to obtain more text which follows the 'lexer cursor position'...
 | 
				
			||||||
 | 
					            token: null,
 | 
				
			||||||
 | 
					            line: this.yylineno,
 | 
				
			||||||
 | 
					            loc: this.yylloc,
 | 
				
			||||||
 | 
					            yy: this.yy,
 | 
				
			||||||
 | 
					            lexer: this,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // and make sure the error info doesn't stay due to potential
 | 
				
			||||||
 | 
					            // ref cycle via userland code manipulations.
 | 
				
			||||||
 | 
					            // These would otherwise all be memory leak opportunities!
 | 
				
			||||||
 | 
					            //
 | 
				
			||||||
 | 
					            // Note that only array and object references are nuked as those
 | 
				
			||||||
 | 
					            // constitute the set of elements which can produce a cyclic ref.
 | 
				
			||||||
 | 
					            // The rest of the members is kept intact as they are harmless.
 | 
				
			||||||
 | 
					            destroy: function destructLexErrorInfo() {
 | 
				
			||||||
 | 
					                // remove cyclic references added to error info:
 | 
				
			||||||
 | 
					                // info.yy = null;
 | 
				
			||||||
 | 
					                // info.lexer = null;
 | 
				
			||||||
 | 
					                // ...
 | 
				
			||||||
 | 
					                var rec = !!this.recoverable;
 | 
				
			||||||
 | 
					                for (var key in this) {
 | 
				
			||||||
 | 
					                    if (this.hasOwnProperty(key) && typeof key === 'object') {
 | 
				
			||||||
 | 
					                        this[key] = undefined;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                this.recoverable = rec;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        // track this instance so we can `destroy()` it once we deem it superfluous and ready for garbage collection!
 | 
				
			||||||
 | 
					        this.__error_infos.push(pei);
 | 
				
			||||||
 | 
					        return pei;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    parseError: function lexer_parseError(str, hash) {
 | 
				
			||||||
 | 
					        if (this.yy.parser && typeof this.yy.parser.parseError === 'function') {
 | 
				
			||||||
 | 
					            return this.yy.parser.parseError(str, hash) || this.ERROR;
 | 
				
			||||||
 | 
					        } else if (typeof this.yy.parseError === 'function') {
 | 
				
			||||||
 | 
					            return this.yy.parseError.call(this, str, hash) || this.ERROR;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            throw new this.JisonLexerError(str);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // final cleanup function for when we have completed lexing the input; 
 | 
				
			||||||
 | 
					    // make it an API so that external code can use this one once userland
 | 
				
			||||||
 | 
					    // code has decided it's time to destroy any lingering lexer error
 | 
				
			||||||
 | 
					    // hash object instances and the like: this function helps to clean
 | 
				
			||||||
 | 
					    // up these constructs, which *may* carry cyclic references which would
 | 
				
			||||||
 | 
					    // otherwise prevent the instances from being properly and timely
 | 
				
			||||||
 | 
					    // garbage-collected, i.e. this function helps prevent memory leaks!
 | 
				
			||||||
 | 
					    cleanupAfterLex: function lexer_cleanupAfterLex(do_not_nuke_errorinfos) {
 | 
				
			||||||
 | 
					        var rv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // prevent lingering circular references from causing memory leaks:
 | 
				
			||||||
 | 
					        this.setInput('', {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // nuke the error hash info instances created during this run.
 | 
				
			||||||
 | 
					        // Userland code must COPY any data/references
 | 
				
			||||||
 | 
					        // in the error hash instance(s) it is more permanently interested in.
 | 
				
			||||||
 | 
					        if (!do_not_nuke_errorinfos) {
 | 
				
			||||||
 | 
					            for (var i = this.__error_infos.length - 1; i >= 0; i--) {
 | 
				
			||||||
 | 
					                var el = this.__error_infos[i];
 | 
				
			||||||
 | 
					                if (el && typeof el.destroy === 'function') {
 | 
				
			||||||
 | 
					                    el.destroy();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this.__error_infos.length = 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // clear the lexer token context; intended for internal use only
 | 
				
			||||||
 | 
					    clear: function lexer_clear() {
 | 
				
			||||||
 | 
					        this.yytext = '';
 | 
				
			||||||
 | 
					        this.yyleng = 0;
 | 
				
			||||||
 | 
					        this.match = '';
 | 
				
			||||||
 | 
					        this.matches = false;
 | 
				
			||||||
 | 
					        this._more = false;
 | 
				
			||||||
 | 
					        this._backtrack = false;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // resets the lexer, sets new input
 | 
				
			||||||
 | 
					    setInput: function lexer_setInput(input, yy) {
 | 
				
			||||||
 | 
					        this.yy = yy || this.yy || {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // also check if we've fully initialized the lexer instance,
 | 
				
			||||||
 | 
					        // including expansion work to be done to go from a loaded
 | 
				
			||||||
 | 
					        // lexer to a usable lexer:
 | 
				
			||||||
 | 
					        if (!this.__decompressed) {
 | 
				
			||||||
 | 
					          // step 1: decompress the regex list:
 | 
				
			||||||
 | 
					          var rules = this.rules;
 | 
				
			||||||
 | 
					          for (var i = 0, len = rules.length; i < len; i++) {
 | 
				
			||||||
 | 
					            var rule_re = rules[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // compression: is the RE an xref to another RE slot in the rules[] table?
 | 
				
			||||||
 | 
					            if (typeof rule_re === 'number') {
 | 
				
			||||||
 | 
					              rules[i] = rules[rule_re];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // step 2: unfold the conditions[] set to make these ready for use:
 | 
				
			||||||
 | 
					          var conditions = this.conditions;
 | 
				
			||||||
 | 
					          for (var k in conditions) {
 | 
				
			||||||
 | 
					            var spec = conditions[k];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var rule_ids = spec.rules;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var len = rule_ids.length;
 | 
				
			||||||
 | 
					            var rule_regexes = new Array(len + 1);            // slot 0 is unused; we use a 1-based index approach here to keep the hottest code in `lexer_next()` fast and simple!
 | 
				
			||||||
 | 
					            var rule_new_ids = new Array(len + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (this.rules_prefix1) {
 | 
				
			||||||
 | 
					                var rule_prefixes = new Array(65536);
 | 
				
			||||||
 | 
					                var first_catch_all_index = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (var i = 0; i < len; i++) {
 | 
				
			||||||
 | 
					                  var idx = rule_ids[i];
 | 
				
			||||||
 | 
					                  var rule_re = rules[idx];
 | 
				
			||||||
 | 
					                  rule_regexes[i + 1] = rule_re;
 | 
				
			||||||
 | 
					                  rule_new_ids[i + 1] = idx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  var prefix = this.rules_prefix1[idx];
 | 
				
			||||||
 | 
					                  // compression: is the PREFIX-STRING an xref to another PREFIX-STRING slot in the rules_prefix1[] table?
 | 
				
			||||||
 | 
					                  if (typeof prefix === 'number') {
 | 
				
			||||||
 | 
					                    prefix = this.rules_prefix1[prefix];
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                  // init the prefix lookup table: first come, first serve...
 | 
				
			||||||
 | 
					                  if (!prefix) {
 | 
				
			||||||
 | 
					                    if (!first_catch_all_index) {
 | 
				
			||||||
 | 
					                      first_catch_all_index = i + 1;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  } else {
 | 
				
			||||||
 | 
					                    for (var j = 0, pfxlen = prefix.length; j < pfxlen; j++) {
 | 
				
			||||||
 | 
					                      var pfxch = prefix.charCodeAt(j);
 | 
				
			||||||
 | 
					                      // first come, first serve:
 | 
				
			||||||
 | 
					                      if (!rule_prefixes[pfxch]) {
 | 
				
			||||||
 | 
					                        rule_prefixes[pfxch] = i + 1;
 | 
				
			||||||
 | 
					                      }  
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // if no catch-all prefix has been encountered yet, it means all
 | 
				
			||||||
 | 
					                // rules have limited prefix sets and it MAY be that particular
 | 
				
			||||||
 | 
					                // input characters won't be recognized by any rule in this 
 | 
				
			||||||
 | 
					                // condition state.
 | 
				
			||||||
 | 
					                // 
 | 
				
			||||||
 | 
					                // To speed up their discovery at run-time while keeping the
 | 
				
			||||||
 | 
					                // remainder of the lexer kernel code very simple (and fast),
 | 
				
			||||||
 | 
					                // we point these to an 'illegal' rule set index *beyond*
 | 
				
			||||||
 | 
					                // the end of the rule set.
 | 
				
			||||||
 | 
					                if (!first_catch_all_index) {
 | 
				
			||||||
 | 
					                  first_catch_all_index = len + 1;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (var i = 0; i < 65536; i++) {
 | 
				
			||||||
 | 
					                  if (!rule_prefixes[i]) {
 | 
				
			||||||
 | 
					                    rule_prefixes[i] = first_catch_all_index; 
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                spec.__dispatch_lut = rule_prefixes;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                for (var i = 0; i < len; i++) {
 | 
				
			||||||
 | 
					                  var idx = rule_ids[i];
 | 
				
			||||||
 | 
					                  var rule_re = rules[idx];
 | 
				
			||||||
 | 
					                  rule_regexes[i + 1] = rule_re;
 | 
				
			||||||
 | 
					                  rule_new_ids[i + 1] = idx;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            spec.rules = rule_new_ids;
 | 
				
			||||||
 | 
					            spec.__rule_regexes = rule_regexes;
 | 
				
			||||||
 | 
					            spec.__rule_count = len;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          this.__decompressed = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this._input = input || '';
 | 
				
			||||||
 | 
					        this.clear();
 | 
				
			||||||
 | 
					        this._signaled_error_token = false;
 | 
				
			||||||
 | 
					        this.done = false;
 | 
				
			||||||
 | 
					        this.yylineno = 0;
 | 
				
			||||||
 | 
					        this.matched = '';
 | 
				
			||||||
 | 
					        this.conditionStack = ['INITIAL'];
 | 
				
			||||||
 | 
					        this.__currentRuleSet__ = null;
 | 
				
			||||||
 | 
					        this.yylloc = {
 | 
				
			||||||
 | 
					            first_line: 1,
 | 
				
			||||||
 | 
					            first_column: 0,
 | 
				
			||||||
 | 
					            last_line: 1,
 | 
				
			||||||
 | 
					            last_column: 0
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        if (this.options.ranges) {
 | 
				
			||||||
 | 
					            this.yylloc.range = [0, 0];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.offset = 0;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // consumes and returns one char from the input
 | 
				
			||||||
 | 
					    input: function lexer_input() {
 | 
				
			||||||
 | 
					        if (!this._input) {
 | 
				
			||||||
 | 
					            this.done = true;
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        var ch = this._input[0];
 | 
				
			||||||
 | 
					        this.yytext += ch;
 | 
				
			||||||
 | 
					        this.yyleng++;
 | 
				
			||||||
 | 
					        this.offset++;
 | 
				
			||||||
 | 
					        this.match += ch;
 | 
				
			||||||
 | 
					        this.matched += ch;
 | 
				
			||||||
 | 
					        // Count the linenumber up when we hit the LF (or a stand-alone CR).
 | 
				
			||||||
 | 
					        // On CRLF, the linenumber is incremented when you fetch the CR or the CRLF combo
 | 
				
			||||||
 | 
					        // and we advance immediately past the LF as well, returning both together as if
 | 
				
			||||||
 | 
					        // it was all a single 'character' only.
 | 
				
			||||||
 | 
					        var slice_len = 1;
 | 
				
			||||||
 | 
					        var lines = false;
 | 
				
			||||||
 | 
					        if (ch === '\n') {
 | 
				
			||||||
 | 
					            lines = true;
 | 
				
			||||||
 | 
					        } else if (ch === '\r') {
 | 
				
			||||||
 | 
					            lines = true;
 | 
				
			||||||
 | 
					            var ch2 = this._input[1];
 | 
				
			||||||
 | 
					            if (ch2 === '\n') {
 | 
				
			||||||
 | 
					                slice_len++;
 | 
				
			||||||
 | 
					                ch += ch2;
 | 
				
			||||||
 | 
					                this.yytext += ch2;
 | 
				
			||||||
 | 
					                this.yyleng++;
 | 
				
			||||||
 | 
					                this.offset++;
 | 
				
			||||||
 | 
					                this.match += ch2;
 | 
				
			||||||
 | 
					                this.matched += ch2;
 | 
				
			||||||
 | 
					                if (this.options.ranges) {
 | 
				
			||||||
 | 
					                    this.yylloc.range[1]++;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (lines) {
 | 
				
			||||||
 | 
					            this.yylineno++;
 | 
				
			||||||
 | 
					            this.yylloc.last_line++;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            this.yylloc.last_column++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (this.options.ranges) {
 | 
				
			||||||
 | 
					            this.yylloc.range[1]++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this._input = this._input.slice(slice_len);
 | 
				
			||||||
 | 
					        return ch;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // unshifts one char (or a string) into the input
 | 
				
			||||||
 | 
					    unput: function lexer_unput(ch) {
 | 
				
			||||||
 | 
					        var len = ch.length;
 | 
				
			||||||
 | 
					        var lines = ch.split(/(?:\r\n?|\n)/g);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this._input = ch + this._input;
 | 
				
			||||||
 | 
					        this.yytext = this.yytext.substr(0, this.yytext.length - len);
 | 
				
			||||||
 | 
					        //this.yyleng -= len;
 | 
				
			||||||
 | 
					        this.offset -= len;
 | 
				
			||||||
 | 
					        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
 | 
				
			||||||
 | 
					        this.match = this.match.substr(0, this.match.length - len);
 | 
				
			||||||
 | 
					        this.matched = this.matched.substr(0, this.matched.length - len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (lines.length - 1) {
 | 
				
			||||||
 | 
					            this.yylineno -= lines.length - 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.yylloc.last_line = this.yylineno + 1;
 | 
				
			||||||
 | 
					        this.yylloc.last_column = (lines ?
 | 
				
			||||||
 | 
					                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
 | 
				
			||||||
 | 
					                + oldLines[oldLines.length - lines.length].length - lines[0].length :
 | 
				
			||||||
 | 
					                this.yylloc.first_column - len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.options.ranges) {
 | 
				
			||||||
 | 
					            this.yylloc.range[1] = this.yylloc.range[0] + this.yyleng - len;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.yyleng = this.yytext.length;
 | 
				
			||||||
 | 
					        this.done = false;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // When called from action, caches matched text and appends it on next action
 | 
				
			||||||
 | 
					    more: function lexer_more() {
 | 
				
			||||||
 | 
					        this._more = true;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
 | 
				
			||||||
 | 
					    reject: function lexer_reject() {
 | 
				
			||||||
 | 
					        if (this.options.backtrack_lexer) {
 | 
				
			||||||
 | 
					            this._backtrack = true;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // when the parseError() call returns, we MUST ensure that the error is registered.
 | 
				
			||||||
 | 
					            // We accomplish this by signaling an 'error' token to be produced for the current
 | 
				
			||||||
 | 
					            // .lex() run.
 | 
				
			||||||
 | 
					            var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), false);
 | 
				
			||||||
 | 
					            this._signaled_error_token = (this.parseError(p.errStr, p) || this.ERROR);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // retain first n characters of the match
 | 
				
			||||||
 | 
					    less: function lexer_less(n) {
 | 
				
			||||||
 | 
					        return this.unput(this.match.slice(n));
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // return (part of the) already matched input, i.e. for error messages.
 | 
				
			||||||
 | 
					    // Limit the returned string length to `maxSize` (default: 20).
 | 
				
			||||||
 | 
					    // Limit the returned string to the `maxLines` number of lines of input (default: 1).
 | 
				
			||||||
 | 
					    // Negative limit values equal *unlimited*.
 | 
				
			||||||
 | 
					    pastInput: function lexer_pastInput(maxSize, maxLines) {
 | 
				
			||||||
 | 
					        var past = this.matched.substring(0, this.matched.length - this.match.length);
 | 
				
			||||||
 | 
					        if (maxSize < 0)
 | 
				
			||||||
 | 
					            maxSize = past.length;
 | 
				
			||||||
 | 
					        else if (!maxSize)
 | 
				
			||||||
 | 
					            maxSize = 20;
 | 
				
			||||||
 | 
					        if (maxLines < 0)
 | 
				
			||||||
 | 
					            maxLines = past.length;         // can't ever have more input lines than this!
 | 
				
			||||||
 | 
					        else if (!maxLines)
 | 
				
			||||||
 | 
					            maxLines = 1;
 | 
				
			||||||
 | 
					        // `substr` anticipation: treat \r\n as a single character and take a little
 | 
				
			||||||
 | 
					        // more than necessary so that we can still properly check against maxSize
 | 
				
			||||||
 | 
					        // after we've transformed and limited the newLines in here:
 | 
				
			||||||
 | 
					        past = past.substr(-maxSize * 2 - 2);
 | 
				
			||||||
 | 
					        // now that we have a significantly reduced string to process, transform the newlines
 | 
				
			||||||
 | 
					        // and chop them, then limit them:
 | 
				
			||||||
 | 
					        var a = past.replace(/\r\n|\r/g, '\n').split('\n');
 | 
				
			||||||
 | 
					        a = a.slice(-maxLines);
 | 
				
			||||||
 | 
					        past = a.join('\n');
 | 
				
			||||||
 | 
					        // When, after limiting to maxLines, we still have too much to return, 
 | 
				
			||||||
 | 
					        // do add an ellipsis prefix...
 | 
				
			||||||
 | 
					        if (past.length > maxSize) {
 | 
				
			||||||
 | 
					            past = '...' + past.substr(-maxSize);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return past;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // return (part of the) upcoming input, i.e. for error messages.
 | 
				
			||||||
 | 
					    // Limit the returned string length to `maxSize` (default: 20).
 | 
				
			||||||
 | 
					    // Limit the returned string to the `maxLines` number of lines of input (default: 1).
 | 
				
			||||||
 | 
					    // Negative limit values equal *unlimited*.
 | 
				
			||||||
 | 
					    upcomingInput: function lexer_upcomingInput(maxSize, maxLines) {
 | 
				
			||||||
 | 
					        var next = this.match;
 | 
				
			||||||
 | 
					        if (maxSize < 0)
 | 
				
			||||||
 | 
					            maxSize = next.length + this._input.length;
 | 
				
			||||||
 | 
					        else if (!maxSize)
 | 
				
			||||||
 | 
					            maxSize = 20;
 | 
				
			||||||
 | 
					        if (maxLines < 0)
 | 
				
			||||||
 | 
					            maxLines = maxSize;         // can't ever have more input lines than this!
 | 
				
			||||||
 | 
					        else if (!maxLines)
 | 
				
			||||||
 | 
					            maxLines = 1;
 | 
				
			||||||
 | 
					        // `substring` anticipation: treat \r\n as a single character and take a little
 | 
				
			||||||
 | 
					        // more than necessary so that we can still properly check against maxSize
 | 
				
			||||||
 | 
					        // after we've transformed and limited the newLines in here:
 | 
				
			||||||
 | 
					        if (next.length < maxSize * 2 + 2) {
 | 
				
			||||||
 | 
					            next += this._input.substring(0, maxSize * 2 + 2);  // substring is faster on Chrome/V8
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // now that we have a significantly reduced string to process, transform the newlines
 | 
				
			||||||
 | 
					        // and chop them, then limit them:
 | 
				
			||||||
 | 
					        var a = next.replace(/\r\n|\r/g, '\n').split('\n');
 | 
				
			||||||
 | 
					        a = a.slice(0, maxLines);
 | 
				
			||||||
 | 
					        next = a.join('\n');
 | 
				
			||||||
 | 
					        // When, after limiting to maxLines, we still have too much to return, 
 | 
				
			||||||
 | 
					        // do add an ellipsis postfix...
 | 
				
			||||||
 | 
					        if (next.length > maxSize) {
 | 
				
			||||||
 | 
					            next = next.substring(0, maxSize) + '...';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return next;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // return a string which displays the character position where the lexing error occurred, i.e. for error messages
 | 
				
			||||||
 | 
					    showPosition: function lexer_showPosition(maxPrefix, maxPostfix) {
 | 
				
			||||||
 | 
					        var pre = this.pastInput(maxPrefix).replace(/\s/g, ' ');
 | 
				
			||||||
 | 
					        var c = new Array(pre.length + 1).join('-');
 | 
				
			||||||
 | 
					        return pre + this.upcomingInput(maxPostfix).replace(/\s/g, ' ') + '\n' + c + '^';
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // helper function, used to produce a human readable description as a string, given
 | 
				
			||||||
 | 
					    // the input `yylloc` location object. 
 | 
				
			||||||
 | 
					    // Set `display_range_too` to TRUE to include the string character index position(s)
 | 
				
			||||||
 | 
					    // in the description if the `yylloc.range` is available. 
 | 
				
			||||||
 | 
					    describeYYLLOC: function lexer_describe_yylloc(yylloc, display_range_too) {
 | 
				
			||||||
 | 
					        var l1 = yylloc.first_line;
 | 
				
			||||||
 | 
					        var l2 = yylloc.last_line;
 | 
				
			||||||
 | 
					        var o1 = yylloc.first_column;
 | 
				
			||||||
 | 
					        var o2 = yylloc.last_column - 1;
 | 
				
			||||||
 | 
					        var dl = l2 - l1;
 | 
				
			||||||
 | 
					        var d_o = (dl === 0 ? o2 - o1 : 1000);
 | 
				
			||||||
 | 
					        var rv;
 | 
				
			||||||
 | 
					        if (dl === 0) {
 | 
				
			||||||
 | 
					            rv = 'line ' + l1 + ', ';
 | 
				
			||||||
 | 
					            if (d_o === 0) {
 | 
				
			||||||
 | 
					                rv += 'column ' + o1;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                rv += 'columns ' + o1 + ' .. ' + o2;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            rv = 'lines ' + l1 + '(column ' + o1 + ') .. ' + l2 + '(column ' + o2 + ')';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (yylloc.range && display_range_too) {
 | 
				
			||||||
 | 
					            var r1 = yylloc.range[0];
 | 
				
			||||||
 | 
					            var r2 = yylloc.range[1] - 1;
 | 
				
			||||||
 | 
					            if (r2 === r1) {
 | 
				
			||||||
 | 
					                rv += ' {String Offset: ' + r1 + '}';
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                rv += ' {String Offset range: ' + r1 + ' .. ' + r2 + '}';
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return rv;
 | 
				
			||||||
 | 
					        // return JSON.stringify(yylloc);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // test the lexed token: return FALSE when not a match, otherwise return token.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // `match` is supposed to be an array coming out of a regex match, i.e. `match[0]`
 | 
				
			||||||
 | 
					    // contains the actually matched text string.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // Also move the input cursor forward and update the match collectors:
 | 
				
			||||||
 | 
					    // - yytext
 | 
				
			||||||
 | 
					    // - yyleng
 | 
				
			||||||
 | 
					    // - match
 | 
				
			||||||
 | 
					    // - matches
 | 
				
			||||||
 | 
					    // - yylloc
 | 
				
			||||||
 | 
					    // - offset
 | 
				
			||||||
 | 
					    test_match: function lexer_test_match(match, indexed_rule) {
 | 
				
			||||||
 | 
					        var token,
 | 
				
			||||||
 | 
					            lines,
 | 
				
			||||||
 | 
					            backup,
 | 
				
			||||||
 | 
					            match_str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.options.backtrack_lexer) {
 | 
				
			||||||
 | 
					            // save context
 | 
				
			||||||
 | 
					            backup = {
 | 
				
			||||||
 | 
					                yylineno: this.yylineno,
 | 
				
			||||||
 | 
					                yylloc: {
 | 
				
			||||||
 | 
					                    first_line: this.yylloc.first_line,
 | 
				
			||||||
 | 
					                    last_line: this.last_line,
 | 
				
			||||||
 | 
					                    first_column: this.yylloc.first_column,
 | 
				
			||||||
 | 
					                    last_column: this.yylloc.last_column
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                yytext: this.yytext,
 | 
				
			||||||
 | 
					                match: this.match,
 | 
				
			||||||
 | 
					                matches: this.matches,
 | 
				
			||||||
 | 
					                matched: this.matched,
 | 
				
			||||||
 | 
					                yyleng: this.yyleng,
 | 
				
			||||||
 | 
					                offset: this.offset,
 | 
				
			||||||
 | 
					                _more: this._more,
 | 
				
			||||||
 | 
					                _input: this._input,
 | 
				
			||||||
 | 
					                yy: this.yy,
 | 
				
			||||||
 | 
					                conditionStack: this.conditionStack.slice(0),
 | 
				
			||||||
 | 
					                done: this.done
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            if (this.options.ranges) {
 | 
				
			||||||
 | 
					                backup.yylloc.range = this.yylloc.range.slice(0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        match_str = match[0];
 | 
				
			||||||
 | 
					        lines = match_str.match(/(?:\r\n?|\n).*/g);
 | 
				
			||||||
 | 
					        if (lines) {
 | 
				
			||||||
 | 
					            this.yylineno += lines.length;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.yylloc = {
 | 
				
			||||||
 | 
					            first_line: this.yylloc.last_line,
 | 
				
			||||||
 | 
					            last_line: this.yylineno + 1,
 | 
				
			||||||
 | 
					            first_column: this.yylloc.last_column,
 | 
				
			||||||
 | 
					            last_column: lines ?
 | 
				
			||||||
 | 
					                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
 | 
				
			||||||
 | 
					                         this.yylloc.last_column + match_str.length
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        this.yytext += match_str;
 | 
				
			||||||
 | 
					        this.match += match_str;
 | 
				
			||||||
 | 
					        this.matches = match;
 | 
				
			||||||
 | 
					        this.yyleng = this.yytext.length;
 | 
				
			||||||
 | 
					        if (this.options.ranges) {
 | 
				
			||||||
 | 
					            this.yylloc.range = [this.offset, this.offset + this.yyleng];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // previous lex rules MAY have invoked the `more()` API rather than producing a token:
 | 
				
			||||||
 | 
					        // those rules will already have moved this `offset` forward matching their match lengths,
 | 
				
			||||||
 | 
					        // hence we must only add our own match length now:
 | 
				
			||||||
 | 
					        this.offset += match_str.length;
 | 
				
			||||||
 | 
					        this._more = false;
 | 
				
			||||||
 | 
					        this._backtrack = false;
 | 
				
			||||||
 | 
					        this._input = this._input.slice(match_str.length);
 | 
				
			||||||
 | 
					        this.matched += match_str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // calling this method: 
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        //   function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {...}
 | 
				
			||||||
 | 
					        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1] /* = YY_START */);
 | 
				
			||||||
 | 
					        // otherwise, when the action codes are all simple return token statements:
 | 
				
			||||||
 | 
					        //token = this.simpleCaseActionClusters[indexed_rule];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.done && this._input) {
 | 
				
			||||||
 | 
					            this.done = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (token) {
 | 
				
			||||||
 | 
					            return token;
 | 
				
			||||||
 | 
					        } else if (this._backtrack) {
 | 
				
			||||||
 | 
					            // recover context
 | 
				
			||||||
 | 
					            for (var k in backup) {
 | 
				
			||||||
 | 
					                this[k] = backup[k];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this.__currentRuleSet__ = null;
 | 
				
			||||||
 | 
					            return false; // rule action called reject() implying the next rule should be tested instead.
 | 
				
			||||||
 | 
					        } else if (this._signaled_error_token) {
 | 
				
			||||||
 | 
					            // produce one 'error' token as .parseError() in reject() did not guarantee a failure signal by throwing an exception!
 | 
				
			||||||
 | 
					            token = this._signaled_error_token;
 | 
				
			||||||
 | 
					            this._signaled_error_token = false;
 | 
				
			||||||
 | 
					            return token;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // return next match in input
 | 
				
			||||||
 | 
					    next: function lexer_next() {
 | 
				
			||||||
 | 
					        if (this.done) {
 | 
				
			||||||
 | 
					            this.clear();
 | 
				
			||||||
 | 
					            return this.EOF;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!this._input) {
 | 
				
			||||||
 | 
					            this.done = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var token,
 | 
				
			||||||
 | 
					            match,
 | 
				
			||||||
 | 
					            tempMatch,
 | 
				
			||||||
 | 
					            index;
 | 
				
			||||||
 | 
					        if (!this._more) {
 | 
				
			||||||
 | 
					            this.clear();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        var spec = this.__currentRuleSet__;
 | 
				
			||||||
 | 
					        if (!spec) {
 | 
				
			||||||
 | 
					            // Update the ruleset cache as we apparently encountered a state change or just started lexing.
 | 
				
			||||||
 | 
					            // The cache is set up for fast lookup -- we assume a lexer will switch states much less often than it will
 | 
				
			||||||
 | 
					            // invoke the `lex()` token-producing API and related APIs, hence caching the set for direct access helps
 | 
				
			||||||
 | 
					            // speed up those activities a tiny bit.
 | 
				
			||||||
 | 
					            spec = this.__currentRuleSet__ = this._currentRules();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var rule_ids = spec.rules;
 | 
				
			||||||
 | 
					//        var dispatch = spec.__dispatch_lut;
 | 
				
			||||||
 | 
					        var regexes = spec.__rule_regexes;
 | 
				
			||||||
 | 
					        var len = spec.__rule_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//        var c0 = this._input[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Note: the arrays are 1-based, while `len` itself is a valid index, 
 | 
				
			||||||
 | 
					        // hence the non-standard less-or-equal check in the next loop condition!
 | 
				
			||||||
 | 
					        // 
 | 
				
			||||||
 | 
					        // `dispatch` is a lookup table which lists the *first* rule which matches the 1-char *prefix* of the rule-to-match.
 | 
				
			||||||
 | 
					        // By using that array as a jumpstart, we can cut down on the otherwise O(n*m) behaviour of this lexer, down to
 | 
				
			||||||
 | 
					        // O(n) ideally, where:
 | 
				
			||||||
 | 
					        // 
 | 
				
			||||||
 | 
					        // - N is the number of input particles -- which is not precisely characters 
 | 
				
			||||||
 | 
					        //   as we progress on a per-regex-match basis rather than on a per-character basis
 | 
				
			||||||
 | 
					        //   
 | 
				
			||||||
 | 
					        // - M is the number of rules (regexes) to test in the active condition state.
 | 
				
			||||||
 | 
					        //  
 | 
				
			||||||
 | 
					        for (var i = 1 /* (dispatch[c0] || 1) */ ; i <= len; i++) {
 | 
				
			||||||
 | 
					            tempMatch = this._input.match(regexes[i]);
 | 
				
			||||||
 | 
					            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
 | 
				
			||||||
 | 
					                match = tempMatch;
 | 
				
			||||||
 | 
					                index = i;
 | 
				
			||||||
 | 
					                if (this.options.backtrack_lexer) {
 | 
				
			||||||
 | 
					                    token = this.test_match(tempMatch, rule_ids[i]);
 | 
				
			||||||
 | 
					                    if (token !== false) {
 | 
				
			||||||
 | 
					                        return token;
 | 
				
			||||||
 | 
					                    } else if (this._backtrack) {
 | 
				
			||||||
 | 
					                        match = undefined;
 | 
				
			||||||
 | 
					                        continue; // rule action called reject() implying a rule MISmatch.
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else if (!this.options.flex) {
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (match) {
 | 
				
			||||||
 | 
					            token = this.test_match(match, rule_ids[index]);
 | 
				
			||||||
 | 
					            if (token !== false) {
 | 
				
			||||||
 | 
					                return token;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (this._input === '') {
 | 
				
			||||||
 | 
					            this.done = true;
 | 
				
			||||||
 | 
					            return this.EOF;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), this.options.lexer_errors_are_recoverable);
 | 
				
			||||||
 | 
					            token = (this.parseError(p.errStr, p) || this.ERROR);
 | 
				
			||||||
 | 
					            if (token === this.ERROR) {
 | 
				
			||||||
 | 
					                // we can try to recover from a lexer error that parseError() did not 'recover' for us, by moving forward at least one character at a time:
 | 
				
			||||||
 | 
					                if (!this.match.length) {
 | 
				
			||||||
 | 
					                    this.input();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return token;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // return next match that has a token
 | 
				
			||||||
 | 
					    lex: function lexer_lex() {
 | 
				
			||||||
 | 
					        var r;
 | 
				
			||||||
 | 
					        // allow the PRE/POST handlers set/modify the return token for maximum flexibility of the generated lexer:
 | 
				
			||||||
 | 
					        if (typeof this.options.pre_lex === 'function') {
 | 
				
			||||||
 | 
					            r = this.options.pre_lex.call(this);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        while (!r) {
 | 
				
			||||||
 | 
					            r = this.next();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (typeof this.options.post_lex === 'function') {
 | 
				
			||||||
 | 
					            // (also account for a userdef function which does not return any value: keep the token as is)
 | 
				
			||||||
 | 
					            r = this.options.post_lex.call(this, r) || r;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // backwards compatible alias for `pushState()`;
 | 
				
			||||||
 | 
					    // the latter is symmetrical with `popState()` and we advise to use
 | 
				
			||||||
 | 
					    // those APIs in any modern lexer code, rather than `begin()`.
 | 
				
			||||||
 | 
					    begin: function lexer_begin(condition) {
 | 
				
			||||||
 | 
					        return this.pushState(condition);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
 | 
				
			||||||
 | 
					    pushState: function lexer_pushState(condition) {
 | 
				
			||||||
 | 
					        this.conditionStack.push(condition);
 | 
				
			||||||
 | 
					        this.__currentRuleSet__ = null;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // pop the previously active lexer condition state off the condition stack
 | 
				
			||||||
 | 
					    popState: function lexer_popState() {
 | 
				
			||||||
 | 
					        var n = this.conditionStack.length - 1;
 | 
				
			||||||
 | 
					        if (n > 0) {
 | 
				
			||||||
 | 
					            this.__currentRuleSet__ = null;
 | 
				
			||||||
 | 
					            return this.conditionStack.pop();
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return this.conditionStack[0];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
 | 
				
			||||||
 | 
					    topState: function lexer_topState(n) {
 | 
				
			||||||
 | 
					        n = this.conditionStack.length - 1 - Math.abs(n || 0);
 | 
				
			||||||
 | 
					        if (n >= 0) {
 | 
				
			||||||
 | 
					            return this.conditionStack[n];
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return 'INITIAL';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // (internal) determine the lexer rule set which is active for the currently active lexer condition state
 | 
				
			||||||
 | 
					    _currentRules: function lexer__currentRules() {
 | 
				
			||||||
 | 
					        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
 | 
				
			||||||
 | 
					            return this.conditions[this.conditionStack[this.conditionStack.length - 1]];
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return this.conditions['INITIAL'];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // return the number of states currently on the stack
 | 
				
			||||||
 | 
					    stateStackSize: function lexer_stateStackSize() {
 | 
				
			||||||
 | 
					        return this.conditionStack.length;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					options: {},
 | 
				
			||||||
 | 
					JisonLexerError: JisonLexerError,
 | 
				
			||||||
 | 
					performAction: function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var YYSTATE = YY_START;
 | 
				
			||||||
 | 
					switch($avoiding_name_collisions) {
 | 
				
			||||||
 | 
					case 0 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       [ \t\r\n]+ */ 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    /* eat up whitespace */
 | 
				
			||||||
 | 
					    BeginToken(yy_.yytext); 
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 1 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       {DIGIT}+ */ 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    BeginToken(yy_.yytext); 
 | 
				
			||||||
 | 
					    yylval.value = atof(yy_.yytext);
 | 
				
			||||||
 | 
					    return VALUE;
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 2 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       {DIGIT}+\.{DIGIT}* */ 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    BeginToken(yy_.yytext);
 | 
				
			||||||
 | 
					    yylval.value = atof(yy_.yytext);
 | 
				
			||||||
 | 
					    return VALUE;
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 3 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       {DIGIT}+[eE]["+""-"]?{DIGIT}* */ 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    BeginToken(yy_.yytext);
 | 
				
			||||||
 | 
					    yylval.value = atof(yy_.yytext);
 | 
				
			||||||
 | 
					    return VALUE;
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 4 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       {DIGIT}+\.{DIGIT}*[eE]["+""-"]?{DIGIT}* */ 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    BeginToken(yy_.yytext);
 | 
				
			||||||
 | 
					    yylval.value = atof(yy_.yytext);
 | 
				
			||||||
 | 
					    return VALUE;
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 5 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       {ID} */ 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    BeginToken(yy_.yytext);
 | 
				
			||||||
 | 
					    yylval.string = malloc(strlen(yy_.yytext)+1);
 | 
				
			||||||
 | 
					    strcpy(yylval.string, yy_.yytext);
 | 
				
			||||||
 | 
					    return IDENTIFIER;
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 6 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       \+ */ 
 | 
				
			||||||
 | 
					  BeginToken(yy_.yytext); return ADD;  
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 7 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       - */ 
 | 
				
			||||||
 | 
					  BeginToken(yy_.yytext); return SUB;  
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 8 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       \* */ 
 | 
				
			||||||
 | 
					  BeginToken(yy_.yytext); return MULT;  
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 9 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       \/ */ 
 | 
				
			||||||
 | 
					  BeginToken(yy_.yytext); return DIV;  
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 10 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       \( */ 
 | 
				
			||||||
 | 
					  BeginToken(yy_.yytext); return LBRACE;  
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 11 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       \) */ 
 | 
				
			||||||
 | 
					  BeginToken(yy_.yytext); return RBRACE;  
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 12 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       ; */ 
 | 
				
			||||||
 | 
					  BeginToken(yy_.yytext); return SEMICOLON;  
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 13 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       = */ 
 | 
				
			||||||
 | 
					  BeginToken(yy_.yytext); return ASSIGN;  
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					case 14 : 
 | 
				
			||||||
 | 
					/*! Conditions:: INITIAL */ 
 | 
				
			||||||
 | 
					/*! Rule::       . */ 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    BeginToken(yy_.yytext);
 | 
				
			||||||
 | 
					    return yy_.yytext[0];
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					break;
 | 
				
			||||||
 | 
					default:
 | 
				
			||||||
 | 
					  return this.simpleCaseActionClusters[$avoiding_name_collisions];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					},
 | 
				
			||||||
 | 
					simpleCaseActionClusters: {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					},
 | 
				
			||||||
 | 
					rules: [
 | 
				
			||||||
 | 
					/^(?:[ \t\r\n]+)/,
 | 
				
			||||||
 | 
					/^(?:(\d)+)/,
 | 
				
			||||||
 | 
					/^(?:(\d)+\.(\d)*)/,
 | 
				
			||||||
 | 
					/^(?:(\d)+[Ee]["+]?(\d)*)/,
 | 
				
			||||||
 | 
					/^(?:(\d)+\.(\d)*[Ee]["+]?(\d)*)/,
 | 
				
			||||||
 | 
					/^(?:([^\W\d]\w*))/,
 | 
				
			||||||
 | 
					/^(?:\+)/,
 | 
				
			||||||
 | 
					/^(?:-)/,
 | 
				
			||||||
 | 
					/^(?:\*)/,
 | 
				
			||||||
 | 
					/^(?:\/)/,
 | 
				
			||||||
 | 
					/^(?:\()/,
 | 
				
			||||||
 | 
					/^(?:\))/,
 | 
				
			||||||
 | 
					/^(?:;)/,
 | 
				
			||||||
 | 
					/^(?:=)/,
 | 
				
			||||||
 | 
					/^(?:.)/
 | 
				
			||||||
 | 
					],
 | 
				
			||||||
 | 
					conditions: {
 | 
				
			||||||
 | 
					  "INITIAL": {
 | 
				
			||||||
 | 
					    rules: [
 | 
				
			||||||
 | 
					      0,
 | 
				
			||||||
 | 
					      1,
 | 
				
			||||||
 | 
					      2,
 | 
				
			||||||
 | 
					      3,
 | 
				
			||||||
 | 
					      4,
 | 
				
			||||||
 | 
					      5,
 | 
				
			||||||
 | 
					      6,
 | 
				
			||||||
 | 
					      7,
 | 
				
			||||||
 | 
					      8,
 | 
				
			||||||
 | 
					      9,
 | 
				
			||||||
 | 
					      10,
 | 
				
			||||||
 | 
					      11,
 | 
				
			||||||
 | 
					      12,
 | 
				
			||||||
 | 
					      13,
 | 
				
			||||||
 | 
					      14
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    inclusive: true
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*--------------------------------------------------------------------
 | 
				
			||||||
 | 
					 * lex.l
 | 
				
			||||||
 | 
					 *------------------------------------------------------------------*/;
 | 
				
			||||||
 | 
					return lexer;
 | 
				
			||||||
 | 
					})();
 | 
				
			||||||
							
								
								
									
										2145
									
								
								samples/JavaScript/ccalc-parse.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2145
									
								
								samples/JavaScript/ccalc-parse.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										31
									
								
								samples/JavaScript/proto.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/JavaScript/proto.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @fileoverview
 | 
				
			||||||
 | 
					 * @enhanceable
 | 
				
			||||||
 | 
					 * @public
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					// GENERATED CODE -- DO NOT EDIT!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					goog.provide('proto.google.protobuf.Timestamp');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					goog.require('jspb.Message');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Generated by JsPbCodeGenerator.
 | 
				
			||||||
 | 
					 * @param {Array=} opt_data Optional initial data array, typically from a
 | 
				
			||||||
 | 
					 * server response, or constructed directly in Javascript. The array is used
 | 
				
			||||||
 | 
					 * in place and becomes part of the constructed object. It is not cloned.
 | 
				
			||||||
 | 
					 * If no data is provided, the constructed object will be empty, but still
 | 
				
			||||||
 | 
					 * valid.
 | 
				
			||||||
 | 
					 * @extends {jspb.Message}
 | 
				
			||||||
 | 
					 * @constructor
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					proto.google.protobuf.Timestamp = function(opt_data) {
 | 
				
			||||||
 | 
					  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					goog.inherits(proto.google.protobuf.Timestamp, jspb.Message);
 | 
				
			||||||
 | 
					if (goog.DEBUG && !COMPILED) {
 | 
				
			||||||
 | 
					  proto.google.protobuf.Timestamp.displayName = 'proto.google.protobuf.Timestamp';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Remainder elided
 | 
				
			||||||
							
								
								
									
										49
									
								
								samples/LookML/example.model.lkml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								samples/LookML/example.model.lkml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					- label:          'desired label name'
 | 
				
			||||||
 | 
					- connection:     connection_name
 | 
				
			||||||
 | 
					- include:        filename_or_pattern
 | 
				
			||||||
 | 
					  # Possibly more include declarations
 | 
				
			||||||
 | 
					- persist_for:    N (seconds | minutes | hours)
 | 
				
			||||||
 | 
					- case_sensitive: true | false
 | 
				
			||||||
 | 
					- week_start_day: monday | tuesday | wednesday | thursday | friday | saturday | sunday
 | 
				
			||||||
 | 
					- value_formats:
 | 
				
			||||||
 | 
					  - name: desired_format_name
 | 
				
			||||||
 | 
					    value_format: 'excel-style formatting string'
 | 
				
			||||||
 | 
					  # Possibly more value formats
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- explore: view_name
 | 
				
			||||||
 | 
					  label:  'desired label name'
 | 
				
			||||||
 | 
					  description: 'description string'
 | 
				
			||||||
 | 
					  symmetric_aggregates: true | false
 | 
				
			||||||
 | 
					  hidden: true | false
 | 
				
			||||||
 | 
					  fields: [field_or_set, field_or_set, …]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sql_always_where: SQL WHERE condition
 | 
				
			||||||
 | 
					  always_filter:
 | 
				
			||||||
 | 
					    field_name: 'looker filter expression'
 | 
				
			||||||
 | 
					  conditionally_filter:
 | 
				
			||||||
 | 
					    field_name: 'looker filter expression'
 | 
				
			||||||
 | 
					    unless: [field_or_set, field_or_set, …]
 | 
				
			||||||
 | 
					  access_filter_fields: [fully_scoped_field, fully_scoped_field, …]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  always_join: [view_name, view_name, …]
 | 
				
			||||||
 | 
					  joins:
 | 
				
			||||||
 | 
					    - join: view_name
 | 
				
			||||||
 | 
					      type: left_outer | full_outer | inner | cross
 | 
				
			||||||
 | 
					      relationship: one_to_one | many_to_one | one_to_many | many_to_many
 | 
				
			||||||
 | 
					      from: view_name
 | 
				
			||||||
 | 
					      sql_table_name: table_name
 | 
				
			||||||
 | 
					      view_label: 'desired label name'
 | 
				
			||||||
 | 
					      fields: [field_or_set, field_or_set, …]
 | 
				
			||||||
 | 
					      required_joins: [view_name, view_name, …]
 | 
				
			||||||
 | 
					      foreign_key: dimension_name
 | 
				
			||||||
 | 
					      sql_on: SQL ON clause
 | 
				
			||||||
 | 
					    # Possibly more join declarations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  persist_for: N (seconds | minutes | hours)
 | 
				
			||||||
 | 
					  from: view_name
 | 
				
			||||||
 | 
					  view: view_name
 | 
				
			||||||
 | 
					  case_sensitive: true | false
 | 
				
			||||||
 | 
					  sql_table_name: table_name
 | 
				
			||||||
 | 
					  cancel_grouping_fields: [fully_scoped_field, fully_scoped_field, …]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Possibly more explore declarations
 | 
				
			||||||
							
								
								
									
										90
									
								
								samples/LookML/example.view.lkml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								samples/LookML/example.view.lkml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					- view: view_name
 | 
				
			||||||
 | 
					  sql_table_name: table_name
 | 
				
			||||||
 | 
					  suggestions: true | false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  derived_table:
 | 
				
			||||||
 | 
					    sql: SQL query
 | 
				
			||||||
 | 
					    persist_for: N (seconds | minutes | hours)
 | 
				
			||||||
 | 
					    sql_trigger_value: SQL query
 | 
				
			||||||
 | 
					    distribution: column_name
 | 
				
			||||||
 | 
					    distribution_style: ALL | EVEN
 | 
				
			||||||
 | 
					    sortkeys: [column_name, column_name, …]
 | 
				
			||||||
 | 
					    indexes: [column_name, column_name, …]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sets:
 | 
				
			||||||
 | 
					    set_name:
 | 
				
			||||||
 | 
					      - field_or_set
 | 
				
			||||||
 | 
					      - field_or_set
 | 
				
			||||||
 | 
					      - …
 | 
				
			||||||
 | 
					    # Possibly more set declarations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fields:
 | 
				
			||||||
 | 
					  - (dimension | dimension_group | measure | filter): field_name
 | 
				
			||||||
 | 
					    label: 'desired label name'
 | 
				
			||||||
 | 
					    view_label: 'desired label name'
 | 
				
			||||||
 | 
					    group_label: 'desired label name'
 | 
				
			||||||
 | 
					    description: 'description string'
 | 
				
			||||||
 | 
					    hidden: true | false
 | 
				
			||||||
 | 
					    alias: [old_field_name, old_field_name, …]
 | 
				
			||||||
 | 
					    value_format: 'excel-style formatting string'
 | 
				
			||||||
 | 
					    value_format_name: format_name
 | 
				
			||||||
 | 
					    html: HTML expression using Liquid template elements
 | 
				
			||||||
 | 
					    sql: SQL expression to generate the field value
 | 
				
			||||||
 | 
					    required_fields: [field_name, field_name, …]
 | 
				
			||||||
 | 
					    drill_fields: [field_or_set, field_or_set, …]
 | 
				
			||||||
 | 
					    can_filter: true | false
 | 
				
			||||||
 | 
					    fanout_on: repeated_record_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # DIMENSION SPECIFIC PARAMETERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    type: dimension_field_type
 | 
				
			||||||
 | 
					    primary_key: true | false
 | 
				
			||||||
 | 
					    sql_case:
 | 
				
			||||||
 | 
					      value: SQL condition
 | 
				
			||||||
 | 
					      value: SQL condition
 | 
				
			||||||
 | 
					      # Possibly more sql_case statements
 | 
				
			||||||
 | 
					    alpha_sort: true | false
 | 
				
			||||||
 | 
					    tiers: [N, N, …]
 | 
				
			||||||
 | 
					    style: classic | interval | integer | relational
 | 
				
			||||||
 | 
					    sql_latitude: SQL expression to generate a latitude
 | 
				
			||||||
 | 
					    sql_longitude: SQL expression to generate a longitude
 | 
				
			||||||
 | 
					    suggestable: true | false
 | 
				
			||||||
 | 
					    suggest_persist_for: N (seconds | minutes | hours)
 | 
				
			||||||
 | 
					    suggest_dimension: dimension_name
 | 
				
			||||||
 | 
					    suggest_explore: explore_name
 | 
				
			||||||
 | 
					    suggestions: ['suggestion string', 'suggestion string', …]
 | 
				
			||||||
 | 
					    bypass_suggest_restrictions: true | false
 | 
				
			||||||
 | 
					    full_suggestions: true | false
 | 
				
			||||||
 | 
					    skip_drill_filter: true | false
 | 
				
			||||||
 | 
					    case_sensitive: true | false
 | 
				
			||||||
 | 
					    order_by_field: dimension_name
 | 
				
			||||||
 | 
					    map_layer: name_of_map_layer
 | 
				
			||||||
 | 
					    links:
 | 
				
			||||||
 | 
					      - label: 'desired label name'
 | 
				
			||||||
 | 
					        url: desired_url
 | 
				
			||||||
 | 
					        icon_url: url_of_an_ico_file
 | 
				
			||||||
 | 
					      # Possibly more links
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # DIMENSION GROUP SPECIFIC PARAMETERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timeframes: [timeframe, timeframe, …]
 | 
				
			||||||
 | 
					    convert_tz: true | false
 | 
				
			||||||
 | 
					    datatype: epoch | timestamp | datetime | date | yyyymmdd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # MEASURE SPECIFIC PARAMETERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    type: measure_field_type
 | 
				
			||||||
 | 
					    direction: row | column
 | 
				
			||||||
 | 
					    approximate: true | false
 | 
				
			||||||
 | 
					    approximate_threshold: N
 | 
				
			||||||
 | 
					    sql_distinct_key: SQL expression to define repeated entities
 | 
				
			||||||
 | 
					    list_field: dimension_name
 | 
				
			||||||
 | 
					    filters:
 | 
				
			||||||
 | 
					      dimension_name: 'looker filter expression'
 | 
				
			||||||
 | 
					      # Possibly more filters statements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # FILTER SPECIFIC PARAMETERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default_value: 'desired default value'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Possibly more dimension or measure declarations
 | 
				
			||||||
							
								
								
									
										72
									
								
								samples/R/import.Rd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								samples/R/import.Rd
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					% Generated by roxygen2: do not edit by hand
 | 
				
			||||||
 | 
					% Please edit documentation in R/hello.R
 | 
				
			||||||
 | 
					\name{import}
 | 
				
			||||||
 | 
					\alias{import}
 | 
				
			||||||
 | 
					\title{Import a module into the current scope}
 | 
				
			||||||
 | 
					\usage{
 | 
				
			||||||
 | 
					import(module, attach, attach_operators = TRUE)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\arguments{
 | 
				
			||||||
 | 
					\item{module}{an identifier specifying the full module path}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\item{attach}{if \code{TRUE}, attach the newly loaded module to the object
 | 
				
			||||||
 | 
					search path (see \code{Details})}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\item{attach_operators}{if \code{TRUE}, attach operators of module to the
 | 
				
			||||||
 | 
					object search path, even if \code{attach} is \code{FALSE}}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\value{
 | 
				
			||||||
 | 
					the loaded module environment (invisible)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\description{
 | 
				
			||||||
 | 
					\code{module = import('module')} imports a specified module and makes its
 | 
				
			||||||
 | 
					code available via the environment-like object it returns.
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\details{
 | 
				
			||||||
 | 
					Modules are loaded in an isolated environment which is returned, and
 | 
				
			||||||
 | 
					optionally attached to the object search path of the current scope (if
 | 
				
			||||||
 | 
					argument \code{attach} is \code{TRUE}).
 | 
				
			||||||
 | 
					\code{attach} defaults to \code{FALSE}. However, in interactive code it is
 | 
				
			||||||
 | 
					often helpful to attach packages by default. Therefore, in interactive code
 | 
				
			||||||
 | 
					invoked directly from the terminal only (i.e. not within modules),
 | 
				
			||||||
 | 
					\code{attach} defaults to the value of \code{options('import.attach')}, which
 | 
				
			||||||
 | 
					can be set to \code{TRUE} or \code{FALSE} depending on the user’s preference.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{attach_operators} causes \emph{operators} to be attached by default,
 | 
				
			||||||
 | 
					because operators can only be invoked in R if they re found in the search
 | 
				
			||||||
 | 
					path. Not attaching them therefore drastically limits a module’s usefulness.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Modules are searched in the module search path \code{options('import.path')}.
 | 
				
			||||||
 | 
					This is a vector of paths to consider, from the highest to the lowest
 | 
				
			||||||
 | 
					priority. The current directory is \emph{always} considered first. That is,
 | 
				
			||||||
 | 
					if a file \code{a.r} exists both in the current directory and in a module
 | 
				
			||||||
 | 
					search path, the local file \code{./a.r} will be loaded.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Module names can be fully qualified to refer to nested paths. See
 | 
				
			||||||
 | 
					\code{Examples}.
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\note{
 | 
				
			||||||
 | 
					Unlike for packages, attaching happens \emph{locally}: if
 | 
				
			||||||
 | 
					\code{import} is executed in the global environment, the effect is the same.
 | 
				
			||||||
 | 
					Otherwise, the imported module is inserted as the parent of the current
 | 
				
			||||||
 | 
					\code{environment()}. When used (globally) \emph{inside} a module, the newly
 | 
				
			||||||
 | 
					imported module is only available inside the module’s search path, not
 | 
				
			||||||
 | 
					outside it (nor in other modules which might be loaded).
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\examples{
 | 
				
			||||||
 | 
					# `a.r` is a file in the local directory containing a function `f`.
 | 
				
			||||||
 | 
					a = import('a')
 | 
				
			||||||
 | 
					a$f()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# b/c.r is a file in path `b`, containing a function `g`.
 | 
				
			||||||
 | 
					import('b/c', attach = TRUE)
 | 
				
			||||||
 | 
					g() # No module name qualification necessary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\seealso{
 | 
				
			||||||
 | 
					\code{unload}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{reload}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{module_name}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										483
									
								
								samples/Reason/JSX.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										483
									
								
								samples/Reason/JSX.re
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,483 @@
 | 
				
			|||||||
 | 
					type component = {displayName: string};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Bar = {
 | 
				
			||||||
 | 
					  let createElement c::c=? children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Nesting = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Much = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Foo = {
 | 
				
			||||||
 | 
					  let createElement a::a=? b::b=? children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module One = {
 | 
				
			||||||
 | 
					  let createElement
 | 
				
			||||||
 | 
					      test::test=?
 | 
				
			||||||
 | 
					      foo::foo=?
 | 
				
			||||||
 | 
					      children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  let createElementobvioustypo
 | 
				
			||||||
 | 
					      test::test
 | 
				
			||||||
 | 
					      children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Two = {
 | 
				
			||||||
 | 
					  let createElement foo::foo=? children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Sibling = {
 | 
				
			||||||
 | 
					  let createElement
 | 
				
			||||||
 | 
					      foo::foo=?
 | 
				
			||||||
 | 
					      (children: list component) => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Test = {
 | 
				
			||||||
 | 
					  let createElement yo::yo=? children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module So = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Foo2 = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Text = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Exp = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Pun = {
 | 
				
			||||||
 | 
					  let createElement intended::intended=? children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Namespace = {
 | 
				
			||||||
 | 
					  let module Foo = {
 | 
				
			||||||
 | 
					    let createElement
 | 
				
			||||||
 | 
					        intended::intended=?
 | 
				
			||||||
 | 
					        anotherOptional::x=100
 | 
				
			||||||
 | 
					        children => {
 | 
				
			||||||
 | 
					      displayName: "test"
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module LotsOfArguments = {
 | 
				
			||||||
 | 
					  let createElement
 | 
				
			||||||
 | 
					      argument1::argument1=?
 | 
				
			||||||
 | 
					      argument2::argument2=?
 | 
				
			||||||
 | 
					      argument3::argument3=?
 | 
				
			||||||
 | 
					      argument4::argument4=?
 | 
				
			||||||
 | 
					      argument5::argument5=?
 | 
				
			||||||
 | 
					      argument6::argument6=?
 | 
				
			||||||
 | 
					      children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let div argument1::argument1=? children => {
 | 
				
			||||||
 | 
					  displayName: "test"
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module List1 = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module List2 = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module List3 = {
 | 
				
			||||||
 | 
					  let createElement children => {
 | 
				
			||||||
 | 
					    displayName: "test"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let (/><) a b => a + b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let (><) a b => a + b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let (/>) a b => a + b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let (><\/) a b => a + b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let tag1 = 5 />< 6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let tag2 = 5 >< 7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let tag3 = 5 /> 7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let tag4 = 5 ><\/ 7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let b = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let selfClosing = <Foo />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let selfClosing2 = <Foo a=1 b=true />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let selfClosing3 =
 | 
				
			||||||
 | 
					  <Foo
 | 
				
			||||||
 | 
					    a="really long values that should"
 | 
				
			||||||
 | 
					    b="cause the entire thing to wrap"
 | 
				
			||||||
 | 
					  />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a = <Foo> <Bar c=(fun a => a + 2) /> </Foo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a3 = <So> <Much> <Nesting /> </Much> </So>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a4 =
 | 
				
			||||||
 | 
					  <Sibling>
 | 
				
			||||||
 | 
					    <One test=true foo=b />
 | 
				
			||||||
 | 
					    <Two foo=b />
 | 
				
			||||||
 | 
					  </Sibling>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a5 = <Foo> "testing a string here" </Foo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a6 =
 | 
				
			||||||
 | 
					  <Foo2>
 | 
				
			||||||
 | 
					    <Text> "testing a string here" </Text>
 | 
				
			||||||
 | 
					    <Test yo=1 />
 | 
				
			||||||
 | 
					    <Text> "another string" </Text>
 | 
				
			||||||
 | 
					    <Bar />
 | 
				
			||||||
 | 
					    <Exp> (2 + 4) </Exp>
 | 
				
			||||||
 | 
					  </Foo2>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let intended = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let punning = <Pun intended />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let namespace = <Namespace.Foo />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let c = <Foo />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let d = <Foo />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let spaceBefore =
 | 
				
			||||||
 | 
					  <So> <Much> <Nesting /> </Much> </So>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let spaceBefore2 = <So> <Much /> </So>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let siblingNotSpaced =
 | 
				
			||||||
 | 
					  <So> <Much /> <Much /> </So>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInList = [<Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInList2 = [<Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInListA = [<Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInListB = [<Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInListC = [<Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInListD = [<Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInList3 = [<Foo />, <Foo />, <Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInList4 = [<Foo />, <Foo />, <Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInList5 = [<Foo />, <Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInList6 = [<Foo />, <Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInList7 = [<Foo />, <Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInList8 = [<Foo />, <Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let testFunc b => b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let jsxInFnCall = testFunc <Foo />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let lotsOfArguments =
 | 
				
			||||||
 | 
					  <LotsOfArguments
 | 
				
			||||||
 | 
					    argument1=1
 | 
				
			||||||
 | 
					    argument2=2
 | 
				
			||||||
 | 
					    argument3=3
 | 
				
			||||||
 | 
					    argument4=4
 | 
				
			||||||
 | 
					    argument5=5
 | 
				
			||||||
 | 
					    argument6="test">
 | 
				
			||||||
 | 
					    <Namespace.Foo />
 | 
				
			||||||
 | 
					  </LotsOfArguments>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let lowerCase = <div argument1=1 />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let b = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let d = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Should pun the first example:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					let a = <Foo a> 5 </Foo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a = <Foo a=b> 5 </Foo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a = <Foo a=b b=d> 5 </Foo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a = <Foo a> 0.55 </Foo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a = Foo.createElement "" [@JSX];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let ident = <Foo> a </Foo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment1 = <> <Foo /> <Foo /> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment2 = <> <Foo /> <Foo /> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment3 = <> <Foo /> <Foo /> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment4 = <> <Foo /> <Foo /> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment5 = <> <Foo /> <Foo /> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment6 = <> <Foo /> <Foo /> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment7 = <> <Foo /> <Foo /> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment8 = <> <Foo /> <Foo /> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment9 = <> 2 2 2 2 </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment10 = <> 2.2 3.2 4.6 1.2 </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment11 = <> "str" </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment12 = <> (6 + 2) (6 + 2) (6 + 2) </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fragment13 = <> fragment11 fragment11 </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfItems1 = <List1> 1 2 3 4 5 </List1>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfItems2 =
 | 
				
			||||||
 | 
					  <List2> 1.0 2.8 3.8 4.0 5.1 </List2>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfItems3 =
 | 
				
			||||||
 | 
					  <List3> fragment11 fragment11 </List3>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Several sequential simple jsx expressions must be separated with a space.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					let thisIsRight a b => ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let tagOne children => ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let tagTwo children => ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* thisIsWrong <tagOne /><tagTwo />; */
 | 
				
			||||||
 | 
					thisIsRight <tagOne /> <tagTwo />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* thisIsWrong <tagOne> </tagOne><tagTwo> </tagTwo>; */
 | 
				
			||||||
 | 
					thisIsRight <tagOne /> <tagTwo />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a children => ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let b children => ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let thisIsOkay =
 | 
				
			||||||
 | 
					  <List1> <a /> <b /> <a /> <b /> </List1>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let thisIsAlsoOkay =
 | 
				
			||||||
 | 
					  <List1> <a /> <b /> </List1>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Doesn't make any sense, but suppose you defined an
 | 
				
			||||||
 | 
					   infix operator to compare jsx */
 | 
				
			||||||
 | 
					<a /> < <b />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<a /> > <b />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<a /> < <b />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<a /> > <b />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfListOfJsx = [<> </>];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfListOfJsx = [<> <Foo /> </>];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfListOfJsx = [
 | 
				
			||||||
 | 
					  <> <Foo /> </>,
 | 
				
			||||||
 | 
					  <> <Bar /> </>
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfListOfJsx = [
 | 
				
			||||||
 | 
					  <> <Foo /> </>,
 | 
				
			||||||
 | 
					  <> <Bar /> </>,
 | 
				
			||||||
 | 
					  ...listOfListOfJsx
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameButWithSpaces = [<> </>];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameButWithSpaces = [<> <Foo /> </>];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameButWithSpaces = [
 | 
				
			||||||
 | 
					  <> <Foo /> </>,
 | 
				
			||||||
 | 
					  <> <Bar /> </>
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameButWithSpaces = [
 | 
				
			||||||
 | 
					  <> <Foo /> </>,
 | 
				
			||||||
 | 
					  <> <Bar /> </>,
 | 
				
			||||||
 | 
					  ...sameButWithSpaces
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Test named tag right next to an open bracket.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					let listOfJsx = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfJsx = [<Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfJsx = [<Foo />, <Bar />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let listOfJsx = [<Foo />, <Bar />, ...listOfJsx];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameButWithSpaces = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameButWithSpaces = [<Foo />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameButWithSpaces = [<Foo />, <Bar />];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameButWithSpaces = [
 | 
				
			||||||
 | 
					  <Foo />,
 | 
				
			||||||
 | 
					  <Bar />,
 | 
				
			||||||
 | 
					  ...sameButWithSpaces
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Test no conflict with polymorphic variant types.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					type thisType = [ | `Foo | `Bar];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type t 'a = [< thisType] as 'a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let asd =
 | 
				
			||||||
 | 
					  <One test=true foo=2> "a" "b" </One> [@foo];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let asd2 =
 | 
				
			||||||
 | 
					  One.createElementobvioustypo
 | 
				
			||||||
 | 
					  test::false
 | 
				
			||||||
 | 
					  ["a", "b"]
 | 
				
			||||||
 | 
					  [@JSX]
 | 
				
			||||||
 | 
					  [@foo];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let span
 | 
				
			||||||
 | 
					    test::(test: bool)
 | 
				
			||||||
 | 
					    foo::(foo: int)
 | 
				
			||||||
 | 
					    children => 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let asd =
 | 
				
			||||||
 | 
					  <span test=true foo=2> "a" "b" </span> [@foo];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* "video" call doesn't end with a list, so the expression isn't converted to JSX */
 | 
				
			||||||
 | 
					let video test::(test: bool) children => children;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let asd2 = video test::false 10 [@JSX] [@foo];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let div children => 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					((fun () => div) ()) [] [@JSX];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myFun () =>
 | 
				
			||||||
 | 
					  <>
 | 
				
			||||||
 | 
					    <Namespace.Foo
 | 
				
			||||||
 | 
					      intended=true
 | 
				
			||||||
 | 
					      anotherOptional=200
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					    <Namespace.Foo
 | 
				
			||||||
 | 
					      intended=true
 | 
				
			||||||
 | 
					      anotherOptional=200
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					    <Namespace.Foo
 | 
				
			||||||
 | 
					      intended=true anotherOptional=200>
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					    </Namespace.Foo>
 | 
				
			||||||
 | 
					  </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myFun () => <> </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myFun () =>
 | 
				
			||||||
 | 
					  <>
 | 
				
			||||||
 | 
					    <Namespace.Foo
 | 
				
			||||||
 | 
					      intended=true
 | 
				
			||||||
 | 
					      anotherOptional=200
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					    <Namespace.Foo
 | 
				
			||||||
 | 
					      intended=true
 | 
				
			||||||
 | 
					      anotherOptional=200
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					    <Namespace.Foo
 | 
				
			||||||
 | 
					      intended=true anotherOptional=200>
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					      <Foo />
 | 
				
			||||||
 | 
					    </Namespace.Foo>
 | 
				
			||||||
 | 
					  </>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Children should wrap without forcing attributes to.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					<Foo a=10 b=0>
 | 
				
			||||||
 | 
					  <Bar />
 | 
				
			||||||
 | 
					  <Bar />
 | 
				
			||||||
 | 
					  <Bar />
 | 
				
			||||||
 | 
					  <Bar />
 | 
				
			||||||
 | 
					</Foo>;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Failing test cases:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					/* let res = <Foo a=10 b=(<Foo a=200 />) > */
 | 
				
			||||||
 | 
					/*   <Bar /> */
 | 
				
			||||||
 | 
					/* </Foo>; */
 | 
				
			||||||
 | 
					/* let res = <Foo a=10 b=(<Foo a=200 />) />; */
 | 
				
			||||||
							
								
								
									
										1326
									
								
								samples/Reason/Layout.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1326
									
								
								samples/Reason/Layout.re
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										344
									
								
								samples/Reason/Machine.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								samples/Reason/Machine.re
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,344 @@
 | 
				
			|||||||
 | 
					open Format;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Endo = {
 | 
				
			||||||
 | 
					  type t 'a = 'a => 'a;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Syntax = {
 | 
				
			||||||
 | 
					  let module Var = {
 | 
				
			||||||
 | 
					    type t = int;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  let module Term = {
 | 
				
			||||||
 | 
					    type t =
 | 
				
			||||||
 | 
					      | App t t
 | 
				
			||||||
 | 
					      | Lam t
 | 
				
			||||||
 | 
					      | Var Var.t
 | 
				
			||||||
 | 
					      ;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  let module Sub = {
 | 
				
			||||||
 | 
					    type t 'a =
 | 
				
			||||||
 | 
					      | Cmp (t 'a) (t 'a)
 | 
				
			||||||
 | 
					      | Dot 'a (t 'a)
 | 
				
			||||||
 | 
					      | Id
 | 
				
			||||||
 | 
					      | Shift
 | 
				
			||||||
 | 
					      ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let map f sgm => {
 | 
				
			||||||
 | 
					      let rec go = fun
 | 
				
			||||||
 | 
					      | Cmp sgm0 sgm1 => Cmp (go sgm0) (go sgm1)
 | 
				
			||||||
 | 
					      | Dot a sgm => Dot (f a) (go sgm)
 | 
				
			||||||
 | 
					      | Id => Id
 | 
				
			||||||
 | 
					      | Shift => Shift
 | 
				
			||||||
 | 
					      ;
 | 
				
			||||||
 | 
					      go sgm;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let rec apply sgm e =>
 | 
				
			||||||
 | 
					      switch (sgm, e) {
 | 
				
			||||||
 | 
					      | (sgm, Term.App e0 e1) => Term.App (apply sgm e0) (apply sgm e1)
 | 
				
			||||||
 | 
					      | (sgm, Term.Lam e) => Term.Lam (apply (Dot (Term.Var 0) (Cmp sgm Shift)) e)
 | 
				
			||||||
 | 
					      | (Dot e _, Term.Var 0) => e
 | 
				
			||||||
 | 
					      | (Dot _ sgm, Term.Var i) => apply sgm (Term.Var (i - 1))
 | 
				
			||||||
 | 
					      | (Id, Term.Var i) => Term.Var i
 | 
				
			||||||
 | 
					      | (Shift, Term.Var i) => Term.Var (i + 1)
 | 
				
			||||||
 | 
					      | (Cmp rho sgm, e) => apply sgm (apply rho e)
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Zip = {
 | 
				
			||||||
 | 
					  open Syntax;
 | 
				
			||||||
 | 
					  type t 'a =
 | 
				
			||||||
 | 
					    | App0 (t 'a) 'a
 | 
				
			||||||
 | 
					    | App1 'a (t 'a)
 | 
				
			||||||
 | 
					    | Halt
 | 
				
			||||||
 | 
					    | Lam (t 'a)
 | 
				
			||||||
 | 
					    ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let map f sgm => {
 | 
				
			||||||
 | 
					    let rec go = fun
 | 
				
			||||||
 | 
					    | App0 zip e1 => App0 (go zip) (f e1)
 | 
				
			||||||
 | 
					    | App1 e0 zip => App1 (f e0) (go zip)
 | 
				
			||||||
 | 
					    | Halt => Halt
 | 
				
			||||||
 | 
					    | Lam zip => Lam (go zip)
 | 
				
			||||||
 | 
					    ;
 | 
				
			||||||
 | 
					    go sgm;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let rec apply zip acc => switch zip {
 | 
				
			||||||
 | 
					    | App0 zip e1 => apply zip (Term.App acc e1)
 | 
				
			||||||
 | 
					    | App1 e0 zip => apply zip (Term.App e0 acc)
 | 
				
			||||||
 | 
					    | Halt => acc
 | 
				
			||||||
 | 
					    | Lam zip => apply zip (Term.Lam acc)
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Clo = {
 | 
				
			||||||
 | 
					  open Syntax;
 | 
				
			||||||
 | 
					  type t =
 | 
				
			||||||
 | 
					    | Clo Term.t (Sub.t t);
 | 
				
			||||||
 | 
					  let rec from (Clo term sgm) => Sub.apply (Sub.map from sgm) term;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Pretty = {
 | 
				
			||||||
 | 
					  let module Delim = {
 | 
				
			||||||
 | 
					    type t = string;
 | 
				
			||||||
 | 
					    let pp prev next fmt token => if (prev < next) { fprintf fmt "%s" token };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  let module Prec = {
 | 
				
			||||||
 | 
					    type t = int;
 | 
				
			||||||
 | 
					    open Syntax.Term;
 | 
				
			||||||
 | 
					    let calc = fun
 | 
				
			||||||
 | 
					      | App _ _ => 1
 | 
				
			||||||
 | 
					      | Lam _ => 2
 | 
				
			||||||
 | 
					      | Var _ => 0
 | 
				
			||||||
 | 
					      ;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  let module Name = {
 | 
				
			||||||
 | 
					    type t = string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let suffix = {
 | 
				
			||||||
 | 
					      let script = fun
 | 
				
			||||||
 | 
					        | 0 => "₀"
 | 
				
			||||||
 | 
					        | 1 => "₁"
 | 
				
			||||||
 | 
					        | 2 => "₂"
 | 
				
			||||||
 | 
					        | 3 => "₃"
 | 
				
			||||||
 | 
					        | 4 => "₄"
 | 
				
			||||||
 | 
					        | 5 => "₅"
 | 
				
			||||||
 | 
					        | 6 => "₆"
 | 
				
			||||||
 | 
					        | 7 => "₇"
 | 
				
			||||||
 | 
					        | 8 => "₈"
 | 
				
			||||||
 | 
					        | 9 => "₉"
 | 
				
			||||||
 | 
					        | _ => failwith "bad subscript";
 | 
				
			||||||
 | 
					      let rec go acc => fun
 | 
				
			||||||
 | 
					        | 0 => acc
 | 
				
			||||||
 | 
					        | n => go (script (n mod 10) ^ acc) (n / 10);
 | 
				
			||||||
 | 
					      go ""
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let gen = {
 | 
				
			||||||
 | 
					      let offset = 97;
 | 
				
			||||||
 | 
					      let width = 26;
 | 
				
			||||||
 | 
					      fun () i => {
 | 
				
			||||||
 | 
					        let code = i mod width + offset;
 | 
				
			||||||
 | 
					        let char = Char.chr code;
 | 
				
			||||||
 | 
					        let prime = i / width;
 | 
				
			||||||
 | 
					        let suffix = suffix prime;
 | 
				
			||||||
 | 
					        let name = Char.escaped char ^ suffix;
 | 
				
			||||||
 | 
					        Some name;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let module Env = {
 | 
				
			||||||
 | 
					    type t = {
 | 
				
			||||||
 | 
					      used: list Name.t,
 | 
				
			||||||
 | 
					      rest: Stream.t Name.t,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    let mk () => {
 | 
				
			||||||
 | 
					      let used = [];
 | 
				
			||||||
 | 
					      let rest = Stream.from @@ Name.gen ();
 | 
				
			||||||
 | 
					      { used, rest };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  type printer 'a = Env.t => Prec.t => formatter => 'a => unit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let module Term = {
 | 
				
			||||||
 | 
					    open Syntax.Term;
 | 
				
			||||||
 | 
					    let rec pp ({ Env.used: used, rest } as env) prev fmt e => {
 | 
				
			||||||
 | 
					      let next = Prec.calc e;
 | 
				
			||||||
 | 
					      switch e {
 | 
				
			||||||
 | 
					      | App e0 e1 =>
 | 
				
			||||||
 | 
					        fprintf fmt "@[%a%a@ %a%a@]"
 | 
				
			||||||
 | 
					          (Delim.pp prev next) "("
 | 
				
			||||||
 | 
					          (pp env 1) e0
 | 
				
			||||||
 | 
					          (pp env 0) e1
 | 
				
			||||||
 | 
					          (Delim.pp prev next) ")"
 | 
				
			||||||
 | 
					      | Lam e =>
 | 
				
			||||||
 | 
					        let name = Stream.next rest;
 | 
				
			||||||
 | 
					        let env = { ...env, Env.used: [name, ...used] };
 | 
				
			||||||
 | 
					        fprintf fmt "%aλ%a.%a%a"
 | 
				
			||||||
 | 
					          (Delim.pp prev next) "("
 | 
				
			||||||
 | 
					          (pp_print_string) name
 | 
				
			||||||
 | 
					          (pp env next) e
 | 
				
			||||||
 | 
					          (Delim.pp prev next) ")"
 | 
				
			||||||
 | 
					      | Var index =>
 | 
				
			||||||
 | 
					        fprintf fmt "%s" @@ try (List.nth used index) {
 | 
				
			||||||
 | 
					          | _ => "#" ^ string_of_int index
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let module Sub = {
 | 
				
			||||||
 | 
					    open Syntax.Sub;
 | 
				
			||||||
 | 
					    let rec pp pp_elem env prev fmt => fun
 | 
				
			||||||
 | 
					    | Cmp sgm1 sgm0 =>
 | 
				
			||||||
 | 
					      fprintf fmt "@[%a;@ %a@]"
 | 
				
			||||||
 | 
					        (pp pp_elem env prev) sgm1
 | 
				
			||||||
 | 
					        (pp pp_elem env prev) sgm0
 | 
				
			||||||
 | 
					    | Dot e sgm =>
 | 
				
			||||||
 | 
					      fprintf fmt "@[%a@ ·@ %a@]"
 | 
				
			||||||
 | 
					        (pp_elem env prev) e
 | 
				
			||||||
 | 
					        (pp pp_elem env prev) sgm
 | 
				
			||||||
 | 
					    | Id =>
 | 
				
			||||||
 | 
					      fprintf fmt "ι"
 | 
				
			||||||
 | 
					    | Shift =>
 | 
				
			||||||
 | 
					      fprintf fmt "↑"
 | 
				
			||||||
 | 
					    ;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let module Clo = {
 | 
				
			||||||
 | 
					    let rec pp env prev fmt (Clo.Clo e sgm) => {
 | 
				
			||||||
 | 
					      let next = Prec.calc e;
 | 
				
			||||||
 | 
					      fprintf fmt "@[%a%a%a[%a]@]"
 | 
				
			||||||
 | 
					        (Delim.pp prev next) "("
 | 
				
			||||||
 | 
					        (Term.pp env next) e
 | 
				
			||||||
 | 
					        (Delim.pp prev next) ")"
 | 
				
			||||||
 | 
					        (Sub.pp pp env next) sgm
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let module Zip = {
 | 
				
			||||||
 | 
					    open Zip;
 | 
				
			||||||
 | 
					    let rec pp pp_elem env prev fmt => fun
 | 
				
			||||||
 | 
					    | App0 zip elem =>
 | 
				
			||||||
 | 
					      fprintf fmt "inl@[<v -1>⟨@,%a@,%a⟩@]"
 | 
				
			||||||
 | 
					        (pp pp_elem env prev) zip
 | 
				
			||||||
 | 
					        (pp_elem env prev) elem
 | 
				
			||||||
 | 
					    | App1 elem zip =>
 | 
				
			||||||
 | 
					      fprintf fmt "inr@[<v -1>⟨@,%a@,%a⟩@]"
 | 
				
			||||||
 | 
					        (pp_elem env prev) elem
 | 
				
			||||||
 | 
					        (pp pp_elem env prev) zip
 | 
				
			||||||
 | 
					    | Halt =>
 | 
				
			||||||
 | 
					      fprintf fmt "halt"
 | 
				
			||||||
 | 
					    | Lam zip =>
 | 
				
			||||||
 | 
					      fprintf fmt "lam@[<v -1>⟨@,%a⟩@]"
 | 
				
			||||||
 | 
					        (pp pp_elem env prev) zip
 | 
				
			||||||
 | 
					    ;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Machine = {
 | 
				
			||||||
 | 
					  type t = {
 | 
				
			||||||
 | 
					    clo: Clo.t,
 | 
				
			||||||
 | 
					    ctx: Zip.t Clo.t,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let into e => {
 | 
				
			||||||
 | 
					    open Clo;
 | 
				
			||||||
 | 
					    open Syntax.Sub;
 | 
				
			||||||
 | 
					    let clo = Clo e Id;
 | 
				
			||||||
 | 
					    let ctx = Zip.Halt;
 | 
				
			||||||
 | 
					    { clo, ctx }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let from { clo, ctx } => Zip.apply (Zip.map Clo.from ctx) (Clo.from clo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let pp fmt rule state => {
 | 
				
			||||||
 | 
					    fprintf fmt "@[<v>ctx  ::@[<v -5>@,%a@]@,clo  ::@[<v -5>@,%a@]@,rule ::@[<v -5>@,%a@]@,term ::@[<v -5>@,%a@]@]@."
 | 
				
			||||||
 | 
					      (Pretty.Zip.pp Pretty.Clo.pp (Pretty.Env.mk ()) 2) state.ctx
 | 
				
			||||||
 | 
					                    (Pretty.Clo.pp (Pretty.Env.mk ()) 2) state.clo
 | 
				
			||||||
 | 
					                                       (pp_print_string) rule
 | 
				
			||||||
 | 
					                   (Pretty.Term.pp (Pretty.Env.mk ()) 2) (from state)
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let halted state => {
 | 
				
			||||||
 | 
					    open Clo;
 | 
				
			||||||
 | 
					    open Syntax.Sub;
 | 
				
			||||||
 | 
					    open Syntax.Term;
 | 
				
			||||||
 | 
					    switch state {
 | 
				
			||||||
 | 
					    | { clo: Clo (Var _) Id, _ } => true
 | 
				
			||||||
 | 
					    | _ => false
 | 
				
			||||||
 | 
					    } [@warning "-4"];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let step state => {
 | 
				
			||||||
 | 
					    open Clo;
 | 
				
			||||||
 | 
					    open Syntax.Sub;
 | 
				
			||||||
 | 
					    open Syntax.Term;
 | 
				
			||||||
 | 
					    let rule = ref "";
 | 
				
			||||||
 | 
					    let state = switch state {
 | 
				
			||||||
 | 
					    /* left */
 | 
				
			||||||
 | 
					    | { clo: Clo (App e0 e1) sgm, ctx } =>
 | 
				
			||||||
 | 
					      let clo = Clo e0 sgm;
 | 
				
			||||||
 | 
					      let ctx = Zip.App0 ctx (Clo e1 sgm);
 | 
				
			||||||
 | 
					      rule := "LEFT";
 | 
				
			||||||
 | 
					      { clo, ctx };
 | 
				
			||||||
 | 
					    /* beta */
 | 
				
			||||||
 | 
					    | { clo: Clo (Lam e) sgm, ctx: Zip.App0 ctx c0 } =>
 | 
				
			||||||
 | 
					      let clo = Clo e (Cmp (Dot c0 sgm) Id);
 | 
				
			||||||
 | 
					      rule := "BETA";
 | 
				
			||||||
 | 
					      { clo, ctx };
 | 
				
			||||||
 | 
					    /* lambda */
 | 
				
			||||||
 | 
					    | { clo: Clo (Lam e) sgm, ctx } =>
 | 
				
			||||||
 | 
					      let clo = Clo e (Cmp (Dot (Clo (Var 0) Id) (Cmp sgm Shift)) Id);
 | 
				
			||||||
 | 
					      let ctx = Zip.Lam ctx;
 | 
				
			||||||
 | 
					      rule := "LAMBDA";
 | 
				
			||||||
 | 
					      { clo, ctx };
 | 
				
			||||||
 | 
					    /* associate */
 | 
				
			||||||
 | 
					    | { clo: Clo (Var n) (Cmp (Cmp pi rho) sgm), ctx } =>
 | 
				
			||||||
 | 
					      let clo = Clo (Var n) (Cmp pi (Cmp rho sgm));
 | 
				
			||||||
 | 
					      rule := "ASSOCIATE";
 | 
				
			||||||
 | 
					      { clo, ctx };
 | 
				
			||||||
 | 
					    /* head */
 | 
				
			||||||
 | 
					    | { clo: Clo (Var 0) (Cmp (Dot (Clo e pi) _) sgm), ctx } =>
 | 
				
			||||||
 | 
					      let clo = Clo e (Cmp pi sgm);
 | 
				
			||||||
 | 
					      rule := "HEAD";
 | 
				
			||||||
 | 
					      { clo, ctx };
 | 
				
			||||||
 | 
					    /* tail */
 | 
				
			||||||
 | 
					    | { clo: Clo (Var n) (Cmp (Dot (Clo _ _) rho) sgm), ctx } =>
 | 
				
			||||||
 | 
					      let clo = Clo (Var (n - 1)) (Cmp rho sgm);
 | 
				
			||||||
 | 
					      rule := "TAIL";
 | 
				
			||||||
 | 
					      { clo, ctx };
 | 
				
			||||||
 | 
					    /* shift */
 | 
				
			||||||
 | 
					    | { clo: Clo (Var n) (Cmp Shift sgm), ctx } =>
 | 
				
			||||||
 | 
					      let clo = Clo (Var (n + 1)) sgm;
 | 
				
			||||||
 | 
					      rule := "SHIFT";
 | 
				
			||||||
 | 
					      { clo, ctx };
 | 
				
			||||||
 | 
					    /* id */
 | 
				
			||||||
 | 
					    | { clo: Clo (Var n) (Cmp Id sgm), ctx } =>
 | 
				
			||||||
 | 
					      let clo = Clo (Var n) sgm;
 | 
				
			||||||
 | 
					      rule := "ID";
 | 
				
			||||||
 | 
					      { clo, ctx };
 | 
				
			||||||
 | 
					    | _ =>
 | 
				
			||||||
 | 
					      pp std_formatter !rule state;
 | 
				
			||||||
 | 
					      failwith "bad state";
 | 
				
			||||||
 | 
					    } [@warning "-4"];
 | 
				
			||||||
 | 
					    pp std_formatter !rule state;
 | 
				
			||||||
 | 
					    state;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let norm e => {
 | 
				
			||||||
 | 
					    let count = ref 0;
 | 
				
			||||||
 | 
					    let state = ref (into e);
 | 
				
			||||||
 | 
					    while (not (halted !state)) {
 | 
				
			||||||
 | 
					      fprintf std_formatter "@\n--- step[%d] ---@\n" !count;
 | 
				
			||||||
 | 
					      incr count;
 | 
				
			||||||
 | 
					      state := step !state;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    from !state;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Test = {
 | 
				
			||||||
 | 
					  open Syntax.Term;
 | 
				
			||||||
 | 
					  let l e => Lam e;
 | 
				
			||||||
 | 
					  let ( *@ ) e0 e1 => App e0 e1;
 | 
				
			||||||
 | 
					  let ff = l (l (Var 1));
 | 
				
			||||||
 | 
					  let tt = l (l (Var 0));
 | 
				
			||||||
 | 
					  let zero = l (l (Var 1));
 | 
				
			||||||
 | 
					  let succ = l (l (l (Var 0 *@ Var 2)));
 | 
				
			||||||
 | 
					  let one = succ *@ zero;
 | 
				
			||||||
 | 
					  let two = succ *@ one;
 | 
				
			||||||
 | 
					  let three = succ *@ two;
 | 
				
			||||||
 | 
					  let const = l (l (Var 1));
 | 
				
			||||||
 | 
					  let fix = l (l (Var 1 *@ (Var 0 *@ Var 0)) *@ l (Var 1 *@ (Var 0 *@ Var 0)));
 | 
				
			||||||
 | 
					  let add = fix *@ l (l (l (Var 1 *@ Var 0 *@ l (succ *@ Var 3 *@ Var 0 *@ Var 1))));
 | 
				
			||||||
 | 
					  let init = l (l (Var 0) *@ l (l (Var 1)));
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module Run = {
 | 
				
			||||||
 | 
					  let go () => Machine.norm Test.init;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										308
									
								
								samples/Reason/SuperMerlin.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								samples/Reason/SuperMerlin.re
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,308 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2015-present, Facebook, Inc.
 | 
				
			||||||
 | 
					 * All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					let startedMerlin: ref (option Js.Unsafe.any) = {contents: None};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let fixedEnv = Js.Unsafe.js_expr "require('../lib/fixedEnv')";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This and the subsequent big js blocks are copied over from Nuclide. More convenient for now. */
 | 
				
			||||||
 | 
					let findNearestMerlinFile' = Js.Unsafe.js_expr {|
 | 
				
			||||||
 | 
					  function findNearestMerlinFile(beginAtFilePath) {
 | 
				
			||||||
 | 
					    var path = require('path');
 | 
				
			||||||
 | 
					    var fs = require('fs');
 | 
				
			||||||
 | 
					    var fileDir = path.dirname(beginAtFilePath);
 | 
				
			||||||
 | 
					    var currentPath = path.resolve(fileDir);
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					      var fileToFind = path.join(currentPath, '.merlin');
 | 
				
			||||||
 | 
					      var hasFile = fs.existsSync(fileToFind);
 | 
				
			||||||
 | 
					      if (hasFile) {
 | 
				
			||||||
 | 
					        return path.dirname(currentPath);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (path.dirname(currentPath) === currentPath) {
 | 
				
			||||||
 | 
					        // Bail
 | 
				
			||||||
 | 
					        return '.';
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      currentPath = path.dirname(currentPath);
 | 
				
			||||||
 | 
					    } while (true);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					|};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let findNearestMerlinFile beginAtFilePath::path => {
 | 
				
			||||||
 | 
					  let result = Js.Unsafe.fun_call findNearestMerlinFile' [|Js.Unsafe.inject (Js.string path)|];
 | 
				
			||||||
 | 
					  Js.to_string result
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let createMerlinReaderFnOnce' = Js.Unsafe.js_expr {|
 | 
				
			||||||
 | 
					  function(ocamlMerlinPath, ocamlMerlinFlags, dotMerlinDir, fixedEnv) {
 | 
				
			||||||
 | 
					    var spawn = require('child_process').spawn;
 | 
				
			||||||
 | 
					    // To split while stripping out any leading/trailing space, we match on all
 | 
				
			||||||
 | 
					    // *non*-whitespace.
 | 
				
			||||||
 | 
					    var items = ocamlMerlinFlags === '' ? [] : ocamlMerlinFlags.split(/\s+/);
 | 
				
			||||||
 | 
					    var merlinProcess = spawn(ocamlMerlinPath, items, {cwd: dotMerlinDir});
 | 
				
			||||||
 | 
					    merlinProcess.stderr.on('data', function(d) {
 | 
				
			||||||
 | 
					      console.error('Ocamlmerlin: something wrong happened:');
 | 
				
			||||||
 | 
					      console.error(d.toString());
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    merlinProcess.stdout.on('close', function(d) {
 | 
				
			||||||
 | 
					      console.error('Ocamlmerlin: closed.');
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var cmdQueue = [];
 | 
				
			||||||
 | 
					    var hasStartedReading = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var readline = require('readline');
 | 
				
			||||||
 | 
					    var reader = readline.createInterface({
 | 
				
			||||||
 | 
					      input: merlinProcess.stdout,
 | 
				
			||||||
 | 
					      terminal: false,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return function(cmd, resolve, reject) {
 | 
				
			||||||
 | 
					      cmdQueue.push([resolve, reject]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!hasStartedReading) {
 | 
				
			||||||
 | 
					        hasStartedReading = true;
 | 
				
			||||||
 | 
					        reader.on('line', function(line) {
 | 
				
			||||||
 | 
					          var response;
 | 
				
			||||||
 | 
					          try {
 | 
				
			||||||
 | 
					            response = JSON.parse(line);
 | 
				
			||||||
 | 
					          } catch (err) {
 | 
				
			||||||
 | 
					            response = null;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          var resolveReject = cmdQueue.shift();
 | 
				
			||||||
 | 
					          var resolve = resolveReject[0];
 | 
				
			||||||
 | 
					          var reject = resolveReject[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (!response || !Array.isArray(response) || response.length !== 2) {
 | 
				
			||||||
 | 
					            reject(new Error('Unexpected ocamlmerlin output format: ' + line));
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          var status = response[0];
 | 
				
			||||||
 | 
					          var content = response[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          var errorResponses = {
 | 
				
			||||||
 | 
					            'failure': true,
 | 
				
			||||||
 | 
					            'error': true,
 | 
				
			||||||
 | 
					            'exception': true,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (errorResponses[status]) {
 | 
				
			||||||
 | 
					            reject(new Error('Ocamlmerlin returned an error: ' + line));
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          resolve(content);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      merlinProcess.stdin.write(JSON.stringify(cmd));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					|};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let createMerlinReaderFnOnce
 | 
				
			||||||
 | 
					    pathToMerlin::pathToMerlin
 | 
				
			||||||
 | 
					    merlinFlags::merlinFlags
 | 
				
			||||||
 | 
					    dotMerlinPath::dotMerlinPath =>
 | 
				
			||||||
 | 
					  Js.Unsafe.fun_call
 | 
				
			||||||
 | 
					    createMerlinReaderFnOnce'
 | 
				
			||||||
 | 
					    [|
 | 
				
			||||||
 | 
					      Js.Unsafe.inject (Js.string pathToMerlin),
 | 
				
			||||||
 | 
					      Js.Unsafe.inject (Js.string merlinFlags),
 | 
				
			||||||
 | 
					      Js.Unsafe.inject (Js.string dotMerlinPath),
 | 
				
			||||||
 | 
					      Js.Unsafe.inject fixedEnv
 | 
				
			||||||
 | 
					    |];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let startMerlinProcess path::path =>
 | 
				
			||||||
 | 
					  switch startedMerlin.contents {
 | 
				
			||||||
 | 
					  | Some readerFn => ()
 | 
				
			||||||
 | 
					  | None =>
 | 
				
			||||||
 | 
					    let atomReasonPathToMerlin = Atom.Config.get "atom-reason.pathToMerlin";
 | 
				
			||||||
 | 
					    let atomReasonMerlinFlags = Atom.Config.get "atom-reason.merlinFlags";
 | 
				
			||||||
 | 
					    let atomReasonMerlinLogFile = Atom.Config.get "atom-reason.merlinLogFile";
 | 
				
			||||||
 | 
					    switch atomReasonMerlinLogFile {
 | 
				
			||||||
 | 
					    | JsonString "" => ()
 | 
				
			||||||
 | 
					    | JsonString s => Atom.Env.setEnvVar "MERLIN_LOG" s
 | 
				
			||||||
 | 
					    | _ => ()
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    let readerFn =
 | 
				
			||||||
 | 
					      createMerlinReaderFnOnce
 | 
				
			||||||
 | 
					        pathToMerlin::(Atom.JsonValue.unsafeExtractString atomReasonPathToMerlin)
 | 
				
			||||||
 | 
					        merlinFlags::(Atom.JsonValue.unsafeExtractString atomReasonMerlinFlags)
 | 
				
			||||||
 | 
					        dotMerlinPath::(findNearestMerlinFile beginAtFilePath::path);
 | 
				
			||||||
 | 
					    startedMerlin.contents = Some readerFn
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let readOneLine cmd::cmd resolve reject =>
 | 
				
			||||||
 | 
					  switch startedMerlin.contents {
 | 
				
			||||||
 | 
					  | None => raise Not_found
 | 
				
			||||||
 | 
					  | Some readerFn =>
 | 
				
			||||||
 | 
					    Js.Unsafe.fun_call
 | 
				
			||||||
 | 
					      readerFn
 | 
				
			||||||
 | 
					      [|
 | 
				
			||||||
 | 
					        Js.Unsafe.inject cmd,
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.wrap_callback resolve),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.wrap_callback reject)
 | 
				
			||||||
 | 
					      |]
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* contextify is important for avoiding different buffers calling the backing merlin at the same time. */
 | 
				
			||||||
 | 
					/* https://github.com/the-lambda-church/merlin/blob/d98a08d318ca14d9c702bbd6eeadbb762d325ce7/doc/dev/PROTOCOL.md#contextual-commands */
 | 
				
			||||||
 | 
					let contextify query::query path::path => Js.Unsafe.obj [|
 | 
				
			||||||
 | 
					  ("query", Js.Unsafe.inject query),
 | 
				
			||||||
 | 
					  ("context", Js.Unsafe.inject (Js.array [|Js.string "auto", Js.string path|]))
 | 
				
			||||||
 | 
					|];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let prepareCommand text::text path::path query::query resolve reject => {
 | 
				
			||||||
 | 
					  startMerlinProcess path;
 | 
				
			||||||
 | 
					  /* These two commands should be run before every main command. */
 | 
				
			||||||
 | 
					  readOneLine
 | 
				
			||||||
 | 
					    cmd::(
 | 
				
			||||||
 | 
					      contextify
 | 
				
			||||||
 | 
					        /* The protocol command tells Merlin which API version we want to use. (2 for us) */
 | 
				
			||||||
 | 
					        query::(
 | 
				
			||||||
 | 
					          Js.array [|
 | 
				
			||||||
 | 
					            Js.Unsafe.inject (Js.string "protocol"),
 | 
				
			||||||
 | 
					            Js.Unsafe.inject (Js.string "version"),
 | 
				
			||||||
 | 
					            Js.Unsafe.inject (Js.number_of_float 2.)
 | 
				
			||||||
 | 
					          |]
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        path::path
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    (
 | 
				
			||||||
 | 
					      fun _ =>
 | 
				
			||||||
 | 
					        readOneLine
 | 
				
			||||||
 | 
					          cmd::(
 | 
				
			||||||
 | 
					            contextify
 | 
				
			||||||
 | 
					              /* The tell command allows us to synchronize our text with Merlin's internal buffer. */
 | 
				
			||||||
 | 
					              query::(
 | 
				
			||||||
 | 
					                Js.array [|Js.string "tell", Js.string "start", Js.string "end", Js.string text|]
 | 
				
			||||||
 | 
					              )
 | 
				
			||||||
 | 
					              path::path
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					          (fun _ => readOneLine cmd::(contextify query::query path::path) resolve reject)
 | 
				
			||||||
 | 
					          reject
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    reject
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let positionToJsMerlinPosition (line, col) => Js.Unsafe.obj [|
 | 
				
			||||||
 | 
					  /* lines (rows) are 1-based for merlin, not 0-based, like for Atom */
 | 
				
			||||||
 | 
					  ("line", Js.Unsafe.inject (Js.number_of_float (float_of_int (line + 1)))),
 | 
				
			||||||
 | 
					  ("col", Js.Unsafe.inject (Js.number_of_float (float_of_int col)))
 | 
				
			||||||
 | 
					|];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Actual merlin commands we'll use. */
 | 
				
			||||||
 | 
					let getTypeHint path::path text::text position::position resolve reject =>
 | 
				
			||||||
 | 
					  prepareCommand
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    query::(
 | 
				
			||||||
 | 
					      Js.array [|
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "type"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "enclosing"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "at"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (positionToJsMerlinPosition position)
 | 
				
			||||||
 | 
					      |]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let getAutoCompleteSuggestions
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    position::position
 | 
				
			||||||
 | 
					    prefix::prefix
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject =>
 | 
				
			||||||
 | 
					  prepareCommand
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    query::(
 | 
				
			||||||
 | 
					      Js.array [|
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "complete"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "prefix"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string prefix),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "at"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (positionToJsMerlinPosition position),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "with"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "doc")
 | 
				
			||||||
 | 
					      |]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let getDiagnostics path::path text::text resolve reject =>
 | 
				
			||||||
 | 
					  prepareCommand
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    query::(Js.array [|Js.Unsafe.inject (Js.string "errors")|])
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let locate path::path text::text extension::extension position::position resolve reject =>
 | 
				
			||||||
 | 
					  prepareCommand
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    query::(
 | 
				
			||||||
 | 
					      Js.array [|
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "locate"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string ""),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string extension),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "at"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (positionToJsMerlinPosition position)
 | 
				
			||||||
 | 
					      |]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* reject */
 | 
				
			||||||
 | 
					let getOccurrences path::path text::text position::position resolve reject =>
 | 
				
			||||||
 | 
					  prepareCommand
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    query::(
 | 
				
			||||||
 | 
					      Js.array [|
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "occurrences"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "ident"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "at"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (positionToJsMerlinPosition position)
 | 
				
			||||||
 | 
					      |]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let destruct
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    startPosition::startPosition
 | 
				
			||||||
 | 
					    endPosition::endPosition
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject =>
 | 
				
			||||||
 | 
					  prepareCommand
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    query::(
 | 
				
			||||||
 | 
					      Js.array [|
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "case"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "analysis"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "from"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (positionToJsMerlinPosition startPosition),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (Js.string "to"),
 | 
				
			||||||
 | 
					        Js.Unsafe.inject (positionToJsMerlinPosition endPosition)
 | 
				
			||||||
 | 
					      |]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let getOutline path::path text::text resolve reject =>
 | 
				
			||||||
 | 
					  prepareCommand
 | 
				
			||||||
 | 
					    text::text
 | 
				
			||||||
 | 
					    path::path
 | 
				
			||||||
 | 
					    query::(Js.array [|Js.Unsafe.inject (Js.string "outline")|])
 | 
				
			||||||
 | 
					    resolve
 | 
				
			||||||
 | 
					    reject;
 | 
				
			||||||
							
								
								
									
										989
									
								
								samples/Reason/Syntax.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										989
									
								
								samples/Reason/Syntax.re
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,989 @@
 | 
				
			|||||||
 | 
					/* Copyright (c) 2015-present, Facebook, Inc. All rights reserved. */
 | 
				
			||||||
 | 
					[@@@autoFormat let wrap = 80; let shift = 2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Modules.run ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Polymorphism.run ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Variants.run ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BasicStructures.run ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TestUtils.printSection "General Syntax";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Won't work! */
 | 
				
			||||||
 | 
					/* let matchingFunc a = match a with */
 | 
				
			||||||
 | 
					/*   `Thingy x => (print_string "matched thingy x"); x */
 | 
				
			||||||
 | 
					/*   | `Other x => (print_string "matched other x"); x;; */
 | 
				
			||||||
 | 
					/*  */
 | 
				
			||||||
 | 
					let matchingFunc a =>
 | 
				
			||||||
 | 
					  switch a {
 | 
				
			||||||
 | 
					  | `Thingy x =>
 | 
				
			||||||
 | 
					    print_string "matched thingy x";
 | 
				
			||||||
 | 
					    let zz = 10;
 | 
				
			||||||
 | 
					    zz
 | 
				
			||||||
 | 
					  | `Other x =>
 | 
				
			||||||
 | 
					    print_string "matched other x";
 | 
				
			||||||
 | 
					    x
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstTwoShouldBeGroupedInParens =
 | 
				
			||||||
 | 
					  (int => int) => int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type allParensCanBeRemoved =
 | 
				
			||||||
 | 
					  int => int => int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstTwoShouldBeGroupedAndFirstThree =
 | 
				
			||||||
 | 
					  ((int => int) => int) => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Same thing now but with type constructors instead of each int */
 | 
				
			||||||
 | 
					type firstTwoShouldBeGroupedInParens =
 | 
				
			||||||
 | 
					  (list int => list int) => list int => list int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type allParensCanBeRemoved =
 | 
				
			||||||
 | 
					  list int => list int => list int => list int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstTwoShouldBeGroupedAndFirstThree =
 | 
				
			||||||
 | 
					  ((list int => list int) => list int) =>
 | 
				
			||||||
 | 
					  list int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type myRecordType = {
 | 
				
			||||||
 | 
					  firstTwoShouldBeGroupedInParens:
 | 
				
			||||||
 | 
					    (int => int) => int => int,
 | 
				
			||||||
 | 
					  allParensCanBeRemoved:
 | 
				
			||||||
 | 
					    int => int => int => int,
 | 
				
			||||||
 | 
					  firstTwoShouldBeGroupedAndFirstThree:
 | 
				
			||||||
 | 
					    ((int => int) => int) => int
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstNamedArgShouldBeGroupedInParens =
 | 
				
			||||||
 | 
					  first::(int => int) => second::int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type allParensCanBeRemoved =
 | 
				
			||||||
 | 
					  first::int => second::int => third::int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstTwoShouldBeGroupedAndFirstThree =
 | 
				
			||||||
 | 
					  first::((int => int) => int) => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Same thing now, but with type constructors instead of int */
 | 
				
			||||||
 | 
					type firstNamedArgShouldBeGroupedInParens =
 | 
				
			||||||
 | 
					  first::(list int => list int) =>
 | 
				
			||||||
 | 
					  second::list int =>
 | 
				
			||||||
 | 
					  list int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type allParensCanBeRemoved =
 | 
				
			||||||
 | 
					  first::list int =>
 | 
				
			||||||
 | 
					  second::list int =>
 | 
				
			||||||
 | 
					  third::list int =>
 | 
				
			||||||
 | 
					  list int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstTwoShouldBeGroupedAndFirstThree =
 | 
				
			||||||
 | 
					  first::((list int => list int) => list int) =>
 | 
				
			||||||
 | 
					  list int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstNamedArgShouldBeGroupedInParens =
 | 
				
			||||||
 | 
					  first::(int => int)? =>
 | 
				
			||||||
 | 
					  second::int list? =>
 | 
				
			||||||
 | 
					  int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The arrow necessitates parens around the next two args. The ? isn't what
 | 
				
			||||||
 | 
					 * makes the parens necessary. */
 | 
				
			||||||
 | 
					type firstNamedArgShouldBeGroupedInParensAndSecondNamedArg =
 | 
				
			||||||
 | 
					  first::(int => int)? =>
 | 
				
			||||||
 | 
					  second::(int => int)? =>
 | 
				
			||||||
 | 
					  int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type allParensCanBeRemoved =
 | 
				
			||||||
 | 
					  first::int? =>
 | 
				
			||||||
 | 
					  second::int? =>
 | 
				
			||||||
 | 
					  third::int? =>
 | 
				
			||||||
 | 
					  int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstTwoShouldBeGroupedAndFirstThree =
 | 
				
			||||||
 | 
					  first::((int => int) => int) => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type noParens =
 | 
				
			||||||
 | 
					  one::int => int => int => two::int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type noParensNeeded =
 | 
				
			||||||
 | 
					  one::int => int => int => two::int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type firstNamedArgNeedsParens =
 | 
				
			||||||
 | 
					  one::(int => int => int) => two::int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Now, let's try type aliasing */
 | 
				
			||||||
 | 
					/* Unless wrapped in parens, types between arrows may not be aliased, may not
 | 
				
			||||||
 | 
					 * themselves be arrows. */
 | 
				
			||||||
 | 
					type parensRequiredAroundFirstArg =
 | 
				
			||||||
 | 
					  (list int as 'a) => int as 'a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type parensRequiredAroundReturnType =
 | 
				
			||||||
 | 
					  (list int as 'a) => (int as 'a);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type parensRequiredAroundReturnType =
 | 
				
			||||||
 | 
					  (list int as 'a) => (int as 'a) as 'b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type noParensNeededWhenInTuple =
 | 
				
			||||||
 | 
					  (list int as 'a, list int as 'b) as 'entireThing;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type myTypeDef 'a = list 'a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type instatiatedTypeDef = myTypeDef int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Test a type attribute for good measure */
 | 
				
			||||||
 | 
					/* We should clean up all of the attribute tagging eventually, but for now,
 | 
				
			||||||
 | 
					 * let's make it super ugly to get out of the way of all the formatting/parsing
 | 
				
			||||||
 | 
					 * implementations (fewer conflicts during parsing, fewer edge cases during
 | 
				
			||||||
 | 
					 * printing).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					type something = (
 | 
				
			||||||
 | 
					  int,
 | 
				
			||||||
 | 
					  int [@lookAtThisAttribute]
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type longWrappingTypeDefinitionExample =
 | 
				
			||||||
 | 
					  M_RK__G.Types.instance
 | 
				
			||||||
 | 
					    (TGRecognizer.tGFields unit unit)
 | 
				
			||||||
 | 
					    (TGRecognizer.tGMethods unit unit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type semiLongWrappingTypeDefinitionExample =
 | 
				
			||||||
 | 
					  M_RK__Gesture.Types.instance
 | 
				
			||||||
 | 
					    TGRecognizerFinal.tGFields
 | 
				
			||||||
 | 
					    TGRecognizerFinal.tGMethods;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type semiLongWrappingTypeWithConstraint =
 | 
				
			||||||
 | 
					  M_RK__Gesture.Types.instance
 | 
				
			||||||
 | 
					    'a
 | 
				
			||||||
 | 
					    TGRecognizerFinal.tGFields
 | 
				
			||||||
 | 
					    TGRecognizerFinal.tGMethods
 | 
				
			||||||
 | 
					constraint 'a = (unit, unit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type onelineConstrain = 'a constraint 'a = int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This must be in trunk but not in this branch of OCaml */
 | 
				
			||||||
 | 
					/* type withNestedRecords = MyConstructor {myField: int} */
 | 
				
			||||||
 | 
					type colors =
 | 
				
			||||||
 | 
					  | Red int
 | 
				
			||||||
 | 
					  | Black int
 | 
				
			||||||
 | 
					  | Green int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Another approach is to require declared variants to wrap any record */
 | 
				
			||||||
 | 
					/* type myRecord = MyRecord {name: int}; */
 | 
				
			||||||
 | 
					/* let myValue = MyRecord {name: int}; */
 | 
				
			||||||
 | 
					/* This would force importing of the module */
 | 
				
			||||||
 | 
					/* This would also lend itself naturally to pattern matching - and avoid having
 | 
				
			||||||
 | 
					   to use `.` operator at all since you normally destructure. */
 | 
				
			||||||
 | 
					type nameBlahType = {nameBlah: int};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myRecord = {nameBlah: 20};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myRecordName = myRecord.nameBlah;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let {nameBlah}: nameBlahType = {nameBlah: 20};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print_int nameBlah;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let {nameBlah: aliasedToThisVar}: nameBlahType = {
 | 
				
			||||||
 | 
					  nameBlah: 20
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print_int aliasedToThisVar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let desiredFormattingForWrappedLambda:
 | 
				
			||||||
 | 
					  int => int => int => nameBlahType =
 | 
				
			||||||
 | 
					  /*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   fun is
 | 
				
			||||||
 | 
					   pre-   /firstarg\
 | 
				
			||||||
 | 
					   fix   /-coupled--\
 | 
				
			||||||
 | 
					    |-\ /-to-prefix--\       */
 | 
				
			||||||
 | 
					  fun curriedArg anotherArg lastArg => {
 | 
				
			||||||
 | 
					    nameBlah: 10
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type longerInt = int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let desiredFormattingForWrappedLambdaWrappedArrow:
 | 
				
			||||||
 | 
					  longerInt =>
 | 
				
			||||||
 | 
					  longerInt =>
 | 
				
			||||||
 | 
					  longerInt =>
 | 
				
			||||||
 | 
					  nameBlahType =
 | 
				
			||||||
 | 
					  /*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   fun is
 | 
				
			||||||
 | 
					   pre-   /firstarg\
 | 
				
			||||||
 | 
					   fix   /-coupled--\
 | 
				
			||||||
 | 
					    |-\ /-to-prefix--\       */
 | 
				
			||||||
 | 
					  fun curriedArg anotherArg lastArg => {
 | 
				
			||||||
 | 
					    nameBlah: 10
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let desiredFormattingForWrappedLambdaReturnOnNewLine
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     fun is
 | 
				
			||||||
 | 
					     pre-   /firstarg\
 | 
				
			||||||
 | 
					     fix   /-coupled--\
 | 
				
			||||||
 | 
					      |-\ /-to-prefix--\       */
 | 
				
			||||||
 | 
					    curriedArg
 | 
				
			||||||
 | 
					    anotherArg
 | 
				
			||||||
 | 
					    lastArg => {
 | 
				
			||||||
 | 
					  nameBlah: 10
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 let is
 | 
				
			||||||
 | 
					 pre-
 | 
				
			||||||
 | 
					 fix    /-function binding name---\
 | 
				
			||||||
 | 
					 |-\   / is coupled to prefix      \   */
 | 
				
			||||||
 | 
					let desiredFormattingForWrappedSugar
 | 
				
			||||||
 | 
					    curriedArg
 | 
				
			||||||
 | 
					    anotherArg
 | 
				
			||||||
 | 
					    lastArg => {
 | 
				
			||||||
 | 
					  nameBlah: 10
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 let is
 | 
				
			||||||
 | 
					 pre-
 | 
				
			||||||
 | 
					 fix    /-function binding name---\
 | 
				
			||||||
 | 
					 |-\   / is coupled to prefix      \   */
 | 
				
			||||||
 | 
					let desiredFormattingForWrappedSugarReturnOnNewLine
 | 
				
			||||||
 | 
					    curriedArg
 | 
				
			||||||
 | 
					    anotherArg
 | 
				
			||||||
 | 
					    lastArg => {
 | 
				
			||||||
 | 
					  nameBlah: 10
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   let  : type t1 t2. t1 * t2 list -> t1 = ...
 | 
				
			||||||
 | 
					   let rec f : 't1 't2. 't1 * 't2 list -> 't1 =
 | 
				
			||||||
 | 
					     fun (type t1) (type t2) -> (... : t1 * t2 list -> t1)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					type point = {x: int, y: int};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type point3D = {x: int, y: int, z: int};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let point2D = {x: 20, y: 30};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let point3D: point3D = {
 | 
				
			||||||
 | 
					  x: 10,
 | 
				
			||||||
 | 
					  y: 11,
 | 
				
			||||||
 | 
					  z: 80 /* Optional Comma */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let printPoint (p: point) => {
 | 
				
			||||||
 | 
					  print_int p.x;
 | 
				
			||||||
 | 
					  print_int p.y
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let addPoints (p1: point, p2: point) => {
 | 
				
			||||||
 | 
					  x: p1.x + p2.x,
 | 
				
			||||||
 | 
					  y: p1.y + p2.y
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let res1 = printPoint point2D;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let res2 =
 | 
				
			||||||
 | 
					  printPoint {x: point3D.x, y: point3D.y};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					    When () were used to indicate sequences, the parser used seq_expr not only
 | 
				
			||||||
 | 
					    for grouping sequences, but also to form standard precedences.
 | 
				
			||||||
 | 
					                          /------- sequence_expr ------\
 | 
				
			||||||
 | 
					    let res3 = printPoint (addPoints (point2D, point3D));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Interestingly, it knew that tuples aren't sequences.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    To move towards semi delimited, semi-terminated, braces-grouped sequences:
 | 
				
			||||||
 | 
					    while allowing any non-sequence expression to be grouped on parens, we make
 | 
				
			||||||
 | 
					    an explicit rule that allows one single non-semi ended expression to be
 | 
				
			||||||
 | 
					    grouped in parens.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Actually: We will allow an arbitrary number of semi-delimited expressions to
 | 
				
			||||||
 | 
					    be wrapped in parens, but the braces grouped semi delimited (sequence)
 | 
				
			||||||
 | 
					    expressions must *also* be terminated with a semicolon.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This allows the parser to distinguish between
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let x = {a};    /* Record {a:a} */
 | 
				
			||||||
 | 
					        let x = {a;};   /* Single item sequence returning identifier {a} */
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					let res3 =
 | 
				
			||||||
 | 
					  printPoint (
 | 
				
			||||||
 | 
					    addPoints (
 | 
				
			||||||
 | 
					      point2D,
 | 
				
			||||||
 | 
					      {x: point3D.x, y: point3D.y}
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type person = {age: int, name: string};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type hiredPerson = {
 | 
				
			||||||
 | 
					  age: string,
 | 
				
			||||||
 | 
					  name: string,
 | 
				
			||||||
 | 
					  dateHired: int
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let o: person = {name: "bob", age: 10};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Parens needed? Nope! */
 | 
				
			||||||
 | 
					let o: person = {name: "bob", age: 10};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let printPerson (p: person) => {
 | 
				
			||||||
 | 
					  let q: person = p;
 | 
				
			||||||
 | 
					  p.name ^ p.name
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* let dontParseMeBro x y:int = x = y;*/
 | 
				
			||||||
 | 
					/* With this unification, anywhere eyou see `= fun` you can just ommit it */
 | 
				
			||||||
 | 
					let blah a => a; /* Done */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let blah a => a; /* Done (almost) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let blah a b => a; /* Done */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let blah a b => a; /* Done (almost) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* More than one consecutive pattern must have a single case */
 | 
				
			||||||
 | 
					type blah = {blahBlah: int};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let blah a {blahBlah} => a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let blah a {blahBlah} => a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let module TryToExportTwice = {
 | 
				
			||||||
 | 
					  let myVal = "hello";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Unifying top level module syntax with local module syntax is probably a bad
 | 
				
			||||||
 | 
					   idea at the moment because it makes it more difficult to continue to support
 | 
				
			||||||
 | 
					   `let .. in` bindings. We can distinguish local modules for `let..in` that
 | 
				
			||||||
 | 
					   just happen to be defined at the top level (but not exported).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     let MyModule = {let myVal = 20;} in
 | 
				
			||||||
 | 
					     MyModule.x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Wait, where would this ever be valid, even if we continued to support
 | 
				
			||||||
 | 
					   `let..in`?
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					let onlyDoingThisTopLevelLetToBypassTopLevelSequence = {
 | 
				
			||||||
 | 
					  let x = {
 | 
				
			||||||
 | 
					    print_int 1;
 | 
				
			||||||
 | 
					    print_int 20 /* Missing trailing SEMI */
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  let x = {
 | 
				
			||||||
 | 
					    print_int 1;
 | 
				
			||||||
 | 
					    print_int 20; /* Ensure missing middle SEMI reported well */
 | 
				
			||||||
 | 
					    print_int 20
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  let x = {
 | 
				
			||||||
 | 
					    print_int 1;
 | 
				
			||||||
 | 
					    print_int 20;
 | 
				
			||||||
 | 
					    10
 | 
				
			||||||
 | 
					    /* Comment in final position */
 | 
				
			||||||
 | 
					  }; /* Missing final SEMI */
 | 
				
			||||||
 | 
					  x + x
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type hasA = {a: int};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let a = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let returnsASequenceExpressionWithASingleIdentifier
 | 
				
			||||||
 | 
					    () => a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let thisReturnsA () => a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let thisReturnsAAsWell () => a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let recordVal: int = (thisReturnsARecord ()).a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Printf.printf
 | 
				
			||||||
 | 
					  "\nproof that thisReturnsARecord: %n\n"
 | 
				
			||||||
 | 
					  recordVal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Printf.printf
 | 
				
			||||||
 | 
					  "\nproof that thisReturnsA: %n\n"
 | 
				
			||||||
 | 
					  (thisReturnsA ());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Pattern matching */
 | 
				
			||||||
 | 
					let blah arg =>
 | 
				
			||||||
 | 
					  switch arg {
 | 
				
			||||||
 | 
					  /* Comment before Bar */
 | 
				
			||||||
 | 
					  | /* Comment between bar/pattern */ Red _ => 1
 | 
				
			||||||
 | 
					  /* Comment Before non-first bar */
 | 
				
			||||||
 | 
					  | /* Comment betwen bar/pattern */ Black _ => 0
 | 
				
			||||||
 | 
					  | Green _ => 0
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Any function that pattern matches a multicase match is interpretted as a
 | 
				
			||||||
 | 
					 * single arg that is then matched on. Instead of the above `blah` example:*/
 | 
				
			||||||
 | 
					let blah =
 | 
				
			||||||
 | 
					  fun
 | 
				
			||||||
 | 
					  | Red _ => 1
 | 
				
			||||||
 | 
					  | Black _ => 0
 | 
				
			||||||
 | 
					  | Green _ => 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* `fun a => a` is read as "a function that maps a to a". Then the */
 | 
				
			||||||
 | 
					/* above example is read: "a function that 'either maps' Red to.. or maps .." */
 | 
				
			||||||
 | 
					/* Thc00f564e first bar is read as "either maps" */
 | 
				
			||||||
 | 
					/* Curried form is not supported:
 | 
				
			||||||
 | 
					      let blah x | Red _ => 1 | Black _ => 0;
 | 
				
			||||||
 | 
					      Theres no sugar rule for dropping => fun, only = fun
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					/* let blahCurriedX x => fun  /* See, nothing says we can drop the => fun */ */
 | 
				
			||||||
 | 
					/*   |(Red x | Black x | Green x) => 1     /* With some effort, we can ammend the sugar rule that would */ */
 | 
				
			||||||
 | 
					/*   | Black x => 0                       /* Allow us to drop any => fun.. Just need to make pattern matching */ */
 | 
				
			||||||
 | 
					/*   | Green x => 0;                      /* Support that */ */
 | 
				
			||||||
 | 
					/*  */
 | 
				
			||||||
 | 
					let blahCurriedX x =>
 | 
				
			||||||
 | 
					  fun
 | 
				
			||||||
 | 
					  | Red x
 | 
				
			||||||
 | 
					  | Black x
 | 
				
			||||||
 | 
					  | Green x =>
 | 
				
			||||||
 | 
					    1 /* With some effort, we can ammend the sugar rule that would */
 | 
				
			||||||
 | 
					  | Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */
 | 
				
			||||||
 | 
					  | Green x => 0; /* Support that */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let sameThingInLocal = {
 | 
				
			||||||
 | 
					  let blahCurriedX x =>
 | 
				
			||||||
 | 
					    fun
 | 
				
			||||||
 | 
					    | Red x
 | 
				
			||||||
 | 
					    | Black x
 | 
				
			||||||
 | 
					    | Green x =>
 | 
				
			||||||
 | 
					      1 /* With some effort, we can ammend the sugar rule that would */
 | 
				
			||||||
 | 
					    | Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */
 | 
				
			||||||
 | 
					    | Green x => 0; /* Support that */
 | 
				
			||||||
 | 
					  blahCurriedX
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This should be parsed/printed exactly as the previous */
 | 
				
			||||||
 | 
					let blahCurriedX x =>
 | 
				
			||||||
 | 
					  fun
 | 
				
			||||||
 | 
					  | Red x
 | 
				
			||||||
 | 
					  | Black x
 | 
				
			||||||
 | 
					  | Green x => 1
 | 
				
			||||||
 | 
					  | Black x => 0
 | 
				
			||||||
 | 
					  | Green x => 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Any time there are multiple match cases we require a leading BAR */
 | 
				
			||||||
 | 
					let v = Red 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let Black x | Red x | Green x = v; /* So this NON-function still parses */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This doesn't parse, however (and it doesn't in OCaml either):
 | 
				
			||||||
 | 
					     let | Black x | Red x | Green x = v;
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					print_int x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Scoping: Let sequences. Familiar syntax for lexical ML style scope and
 | 
				
			||||||
 | 
					   sequences. */
 | 
				
			||||||
 | 
					let res = {
 | 
				
			||||||
 | 
					  let a = "a starts out as";
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    print_string a;
 | 
				
			||||||
 | 
					    let a = 20;
 | 
				
			||||||
 | 
					    print_int a
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  print_string a
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let res = {
 | 
				
			||||||
 | 
					  let a = "first its a string";
 | 
				
			||||||
 | 
					  let a = 20;
 | 
				
			||||||
 | 
					  print_int a;
 | 
				
			||||||
 | 
					  print_int a;
 | 
				
			||||||
 | 
					  print_int a
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let res = {
 | 
				
			||||||
 | 
					  let a = "a is always a string";
 | 
				
			||||||
 | 
					  print_string a;
 | 
				
			||||||
 | 
					  let b = 30;
 | 
				
			||||||
 | 
					  print_int b
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* let result = LyList.map (fun | [] => true | _ => false) []; */
 | 
				
			||||||
 | 
					/* OTHERWISE: You cannot tell if a is the first match case falling through or
 | 
				
			||||||
 | 
					 * a curried first arg */
 | 
				
			||||||
 | 
					/* let blah = fun a | patt => 0 | anotherPatt => 1; */
 | 
				
			||||||
 | 
					/* let blah a patt => 0 | anotherPatt => 1; */
 | 
				
			||||||
 | 
					/*simple pattern  EQUALGREATER      expr */
 | 
				
			||||||
 | 
					let blah a {blahBlah} => a;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*            match_case             */
 | 
				
			||||||
 | 
					/*     pattern EQUALGREATER  expr */
 | 
				
			||||||
 | 
					let blah =
 | 
				
			||||||
 | 
					  fun
 | 
				
			||||||
 | 
					  | Red _ => 1
 | 
				
			||||||
 | 
					  | Black _ => 0
 | 
				
			||||||
 | 
					  | Green _ => 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Won't work! */
 | 
				
			||||||
 | 
					/* let arrowFunc = fun a b => print_string "returning aplusb from arrow"; a + b;;  */
 | 
				
			||||||
 | 
					let arrowFunc a b => {
 | 
				
			||||||
 | 
					  print_string "returning aplusb from arrow";
 | 
				
			||||||
 | 
					  a + b
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let add a b => {
 | 
				
			||||||
 | 
					  let extra = {
 | 
				
			||||||
 | 
					    print_string "adding";
 | 
				
			||||||
 | 
					    0
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  let anotherExtra = 0;
 | 
				
			||||||
 | 
					  extra + a + b + anotherExtra
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print_string (string_of_int (add 4 34));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let dummy _ => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dummy res1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dummy res2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dummy res3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Some edge cases */
 | 
				
			||||||
 | 
					let myFun firstArg (Red x | Black x | Green x) =>
 | 
				
			||||||
 | 
					  firstArg + x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let matchesWithWhen a =>
 | 
				
			||||||
 | 
					  switch a {
 | 
				
			||||||
 | 
					  | Red x when 1 > 0 => 10
 | 
				
			||||||
 | 
					  | Red _ => 10
 | 
				
			||||||
 | 
					  | Black x => 10
 | 
				
			||||||
 | 
					  | Green x => 10
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let matchesWithWhen =
 | 
				
			||||||
 | 
					  fun
 | 
				
			||||||
 | 
					  | Red x when 1 > 0 => 10
 | 
				
			||||||
 | 
					  | Red _ => 10
 | 
				
			||||||
 | 
					  | Black x => 10
 | 
				
			||||||
 | 
					  | Green x => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let matchesOne (`Red x) => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 Typical OCaml would make you *wrap the functions in parens*! This is because it
 | 
				
			||||||
 | 
					 can't tell if a semicolon is a sequence operator. Even if we had records use
 | 
				
			||||||
 | 
					 commas to separate fields,
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					type adders = {
 | 
				
			||||||
 | 
					  addTwoNumbers: int => int => int,
 | 
				
			||||||
 | 
					  addThreeNumbers: int => int => int => int,
 | 
				
			||||||
 | 
					  addThreeNumbersTupled: (int, int, int) => int
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myRecordWithFunctions = {
 | 
				
			||||||
 | 
					  addTwoNumbers: fun a b => a + b,
 | 
				
			||||||
 | 
					  addThreeNumbers: fun a b c => a + b + c,
 | 
				
			||||||
 | 
					  addThreeNumbersTupled: fun (a, b, c) =>
 | 
				
			||||||
 | 
					    a + b + c
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let result =
 | 
				
			||||||
 | 
					  myRecordWithFunctions.addThreeNumbers 10 20 30;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let result =
 | 
				
			||||||
 | 
					  myRecordWithFunctions.addThreeNumbersTupled (
 | 
				
			||||||
 | 
					    10,
 | 
				
			||||||
 | 
					    20,
 | 
				
			||||||
 | 
					    30
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let lookTuplesRequireParens = (1, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* let thisDoesntParse = 1, 2;  */
 | 
				
			||||||
 | 
					let tupleInsideAParenSequence = {
 | 
				
			||||||
 | 
					  print_string "look, a tuple inside a sequence";
 | 
				
			||||||
 | 
					  let x = 10;
 | 
				
			||||||
 | 
					  (x, x)
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let tupleInsideALetSequence = {
 | 
				
			||||||
 | 
					  print_string "look, a tuple inside a sequence";
 | 
				
			||||||
 | 
					  let x = 10;
 | 
				
			||||||
 | 
					  (x, x)
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* We *require* that function return types be wrapped in
 | 
				
			||||||
 | 
					   parenthesis. In this example, there's no ambiguity */
 | 
				
			||||||
 | 
					let makeIncrementer (delta: int) :(int => int) =>
 | 
				
			||||||
 | 
					  fun a => a + delta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* We could even force that consistency with let bindings - it's allowed
 | 
				
			||||||
 | 
					      currently but not forced.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					let myAnnotatedValBinding: int = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Class functions (constructors) and methods are unified in the same way */
 | 
				
			||||||
 | 
					class classWithNoArg = {
 | 
				
			||||||
 | 
					  method x = 0;
 | 
				
			||||||
 | 
					  method y = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This parses but doesn't type check
 | 
				
			||||||
 | 
					     class myClass init => object
 | 
				
			||||||
 | 
					       method x => init
 | 
				
			||||||
 | 
					       method y => init
 | 
				
			||||||
 | 
					     end;
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					let myFunc (a: int) (b: int) :(int, int) => (
 | 
				
			||||||
 | 
					  a,
 | 
				
			||||||
 | 
					  b
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myFunc (a: int) (b: int) :list int => [1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myFunc (a: int) (b: int) :point => {
 | 
				
			||||||
 | 
					  x: a,
 | 
				
			||||||
 | 
					  y: b
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let myFunc (a: int, b: int) :point => {
 | 
				
			||||||
 | 
					  x: a,
 | 
				
			||||||
 | 
					  y: b
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type myThing = (int, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type stillARecord = {name: string, age: int};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Rebase latest OCaml to get the following: And fixup
 | 
				
			||||||
 | 
					   `generalized_constructor_arguments` according to master. */
 | 
				
			||||||
 | 
					/* type ('a, 'b) myOtherThing = Leaf {first:'a, second: 'b} | Null; */
 | 
				
			||||||
 | 
					type branch 'a 'b = {first: 'a, second: 'b};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type myOtherThing 'a 'b =
 | 
				
			||||||
 | 
					  | Leaf (branch 'a 'b)
 | 
				
			||||||
 | 
					  | Null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type yourThing = myOtherThing int int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Conveniently - this parses exactly how you would intend! No *need* to wrap
 | 
				
			||||||
 | 
					   in an extra [], but it doesn't hurt */
 | 
				
			||||||
 | 
					/* FIXME type lookAtThesePolyVariants = list [`Red] ; */
 | 
				
			||||||
 | 
					/* FIXME type bracketsGroupMultipleParamsAndPrecedence = list (list (list [`Red])); */
 | 
				
			||||||
 | 
					/* FIXME type youCanWrapExtraIfYouWant = (list [`Red]); */
 | 
				
			||||||
 | 
					/* FIXME type hereAreMultiplePolyVariants = list [`Red | `Black]; */
 | 
				
			||||||
 | 
					/* FIXME type hereAreMultiplePolyVariantsWithOptionalWrapping = list ([`Red | `Black]); */
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   /* Proposal: ES6 style lambdas: */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* Currying */
 | 
				
			||||||
 | 
					   let lookES6Style = (`Red x) (`Black y) => { };
 | 
				
			||||||
 | 
					   let lookES6Style (`Red x) (`Black y) => { };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* Matching the single argument */
 | 
				
			||||||
 | 
					   let lookES6Style = oneArg => match oneArg with
 | 
				
			||||||
 | 
					     | `Red x => x
 | 
				
			||||||
 | 
					     | `Black x => x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* The "trick" to currying that we already have is basically the same - we just
 | 
				
			||||||
 | 
					    * have to reword it a bit:
 | 
				
			||||||
 | 
					    * From:
 | 
				
			||||||
 | 
					    * "Any time you see [let x = fun ...] just replace it with [let x ...]"
 | 
				
			||||||
 | 
					    * To:
 | 
				
			||||||
 | 
					    * "Any time you see [let x = ... => ] just replace it with [let x ... => ]"
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					   let lookES6Style oneArg => match oneArg with
 | 
				
			||||||
 | 
					     | `Red x => x
 | 
				
			||||||
 | 
					     | `Black x => x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Current OCaml Named Arguments. Any aliasing is more than just aliasing!
 | 
				
			||||||
 | 
					    OCaml allows full on pattern matching of named args. */
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 A: let named              ~a    ~b                = aa + bb in
 | 
				
			||||||
 | 
					 B: let namedAlias         ~a:aa ~b:bb             = aa + bb in
 | 
				
			||||||
 | 
					 C: let namedAnnot         ~(a:int) ~(b:int)       = a + b in
 | 
				
			||||||
 | 
					 D: let namedAliasAnnot    ~a:(aa:int) ~b:(bb:int) = aa + bb in
 | 
				
			||||||
 | 
					 E: let optional           ?a    ?b                              = 10 in
 | 
				
			||||||
 | 
					 F: let optionalAlias      ?a:aa ?b:bb                           = 10 in
 | 
				
			||||||
 | 
					 G: let optionalAnnot      ?(a:int option) ?(b:int option)       = 10 in
 | 
				
			||||||
 | 
					 H: let optionalAliasAnnot ?a:(aa:int option) ?b:(bb:int option) = 10 in
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					 Look! When a default is provided, annotation causes inferred type of argument
 | 
				
			||||||
 | 
					 to not be "option" since it's automatically destructured (because we know it
 | 
				
			||||||
 | 
					 will always be available one way or another.)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 I: let defOptional           ?(a=10)    ?(b=10)                 = 10 in
 | 
				
			||||||
 | 
					 J: let defOptionalAlias      ?a:(aa=10) ?b:(bb=10)              = 10 in
 | 
				
			||||||
 | 
					 K: let defOptionalAnnot      ?(a:int=10) ?(b:int=10)            = 10 in
 | 
				
			||||||
 | 
					                             \       \
 | 
				
			||||||
 | 
					                              \label_let_pattern opt_default: no longer needed in SugarML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 L: let defOptionalAliasAnnot ?a:(aa:int=10) ?b:(bb:int=10)      = 10 in
 | 
				
			||||||
 | 
					                               \        \
 | 
				
			||||||
 | 
					                                \let_pattern: still a useful syntactic building block in SugarML
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * In Reason, the syntax for named args uses double semicolon, since
 | 
				
			||||||
 | 
					 * the syntax for lists uses ES6 style [], freeing up the ::.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					let a = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let b = 20;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*A*/
 | 
				
			||||||
 | 
					let named a::a b::b => a + b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type named = a::int => b::int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*B*/
 | 
				
			||||||
 | 
					let namedAlias a::aa b::bb => aa + bb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let namedAlias a::aa b::bb => aa + bb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type namedAlias = a::int => b::int => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*C*/
 | 
				
			||||||
 | 
					let namedAnnot a::(a: int) b::(b: int) => 20;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*D*/
 | 
				
			||||||
 | 
					let namedAliasAnnot a::(aa: int) b::(bb: int) => 20;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*E*/
 | 
				
			||||||
 | 
					let myOptional a::a=? b::b=? () => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type named = a::int? => b::int? => unit => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*F*/
 | 
				
			||||||
 | 
					let optionalAlias a::aa=? b::bb=? () => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*G*/
 | 
				
			||||||
 | 
					let optionalAnnot a::(a: int)=? b::(b: int)=? () => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*H*/
 | 
				
			||||||
 | 
					let optionalAliasAnnot
 | 
				
			||||||
 | 
					    a::(aa: int)=?
 | 
				
			||||||
 | 
					    b::(bb: int)=?
 | 
				
			||||||
 | 
					    () => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*I: */
 | 
				
			||||||
 | 
					let defOptional a::a=10 b::b=10 () => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type named = a::int? => b::int? => unit => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*J*/
 | 
				
			||||||
 | 
					let defOptionalAlias a::aa=10 b::bb=10 () => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*K*/
 | 
				
			||||||
 | 
					let defOptionalAnnot
 | 
				
			||||||
 | 
					    a::(a: int)=10
 | 
				
			||||||
 | 
					    b::(b: int)=10
 | 
				
			||||||
 | 
					    () => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*L*/
 | 
				
			||||||
 | 
					let defOptionalAliasAnnot
 | 
				
			||||||
 | 
					    a::(aa: int)=10
 | 
				
			||||||
 | 
					    b::(bb: int)=10
 | 
				
			||||||
 | 
					    () => 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*M: Invoking them - Punned */
 | 
				
			||||||
 | 
					let resNotAnnotated = named a::a b::b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*N:*/
 | 
				
			||||||
 | 
					let resAnnotated: int = named a::a b::b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*O: Invoking them */
 | 
				
			||||||
 | 
					let resNotAnnotated = named a::a b::b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*P: Invoking them */
 | 
				
			||||||
 | 
					let resAnnotated: int = named a::a b::b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Q: Here's why "punning" doesn't work!  */
 | 
				
			||||||
 | 
					/* Is b:: punned with a final non-named arg, or is b:: supplied b as one named arg? */
 | 
				
			||||||
 | 
					let b = 20;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let resAnnotated = named a::a b::b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*R: Proof that there are no ambiguities with return values being annotated */
 | 
				
			||||||
 | 
					let resAnnotated: ty = named a::a b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*S: Explicitly passed optionals are a nice way to say "use the default value"*/
 | 
				
			||||||
 | 
					let explictlyPassed =
 | 
				
			||||||
 | 
					  myOptional a::?None b::?None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*T: Annotating the return value of the entire function call */
 | 
				
			||||||
 | 
					let explictlyPassedAnnotated: int =
 | 
				
			||||||
 | 
					  myOptional a::?None b::?None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*U: Explicitly passing optional with identifier expression */
 | 
				
			||||||
 | 
					let a = None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let explictlyPassed = myOptional a::?a b::?None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let explictlyPassedAnnotated: int =
 | 
				
			||||||
 | 
					  myOptional a::?a b::?None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let nestedLet = {
 | 
				
			||||||
 | 
					  let _ = 1;
 | 
				
			||||||
 | 
					  ()
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let nestedLet = {
 | 
				
			||||||
 | 
					  let _ = 1;
 | 
				
			||||||
 | 
					  ()
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let nestedLet = {
 | 
				
			||||||
 | 
					  let _ = 1;
 | 
				
			||||||
 | 
					  ()
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let nestedLet = {
 | 
				
			||||||
 | 
					  let _ = 1;
 | 
				
			||||||
 | 
					  2
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Showing many combinations of type annotations and named arguments.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					type typeWithNestedNamedArgs =
 | 
				
			||||||
 | 
					  outerOne::(
 | 
				
			||||||
 | 
					    innerOne::int => innerTwo::int => int
 | 
				
			||||||
 | 
					  ) =>
 | 
				
			||||||
 | 
					  outerTwo::int =>
 | 
				
			||||||
 | 
					  int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type typeWithNestedOptionalNamedArgs =
 | 
				
			||||||
 | 
					  outerOne::
 | 
				
			||||||
 | 
					    (innerOne::int => innerTwo::int => int)? =>
 | 
				
			||||||
 | 
					  outerTwo::int? =>
 | 
				
			||||||
 | 
					  int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type typeWithNestedOptionalNamedArgs =
 | 
				
			||||||
 | 
					  outerOne::list string? => outerTwo::int? => int;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let x =
 | 
				
			||||||
 | 
					  callSomeFunction
 | 
				
			||||||
 | 
					    withArg::10 andOtherArg::wrappedArg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let res = {
 | 
				
			||||||
 | 
					  (constraintedSequenceItem: string);
 | 
				
			||||||
 | 
					  (dontKnowWheYoudWantToActuallyDoThis: string)
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let res = {
 | 
				
			||||||
 | 
					  (
 | 
				
			||||||
 | 
					    butTheyWillBePrintedWithAppropriateSpacing: string
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					  (soAsToInstillBestDevelopmentPractices: string)
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let x = [
 | 
				
			||||||
 | 
					  (eachItemInListCanBeAnnotated: int),
 | 
				
			||||||
 | 
					  (typeConstraints: float),
 | 
				
			||||||
 | 
					  (
 | 
				
			||||||
 | 
					    tupleConstraints: int,
 | 
				
			||||||
 | 
					    andNotFunctionInvocations: int
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let x = [
 | 
				
			||||||
 | 
					  (butWeWillPrint: int),
 | 
				
			||||||
 | 
					  (themAsSpaceSeparated: float),
 | 
				
			||||||
 | 
					  (toInfluenceYour: int, developmentHabbits: int)
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let newRecord = {
 | 
				
			||||||
 | 
					  ...(annotatedSpreadRecord: someRec),
 | 
				
			||||||
 | 
					  x: y
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let newRecord = {
 | 
				
			||||||
 | 
					  ...(annotatedSpreadRecord: someRec),
 | 
				
			||||||
 | 
					  blah: 0,
 | 
				
			||||||
 | 
					  foo: 1
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let newRecord = {
 | 
				
			||||||
 | 
					  ...(
 | 
				
			||||||
 | 
					    youCanEvenCallMethodsHereAndAnnotate them: someRec
 | 
				
			||||||
 | 
					  ),
 | 
				
			||||||
 | 
					  blah: 0,
 | 
				
			||||||
 | 
					  foo: 1
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let newRecord = {
 | 
				
			||||||
 | 
					  ...(
 | 
				
			||||||
 | 
					    youCanEvenCallMethodsHereAndAnnotate
 | 
				
			||||||
 | 
					      them named::10: someRec
 | 
				
			||||||
 | 
					  ),
 | 
				
			||||||
 | 
					  blah: 0,
 | 
				
			||||||
 | 
					  foo: 1
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let something: thing blah = aTypeAnnotation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let something: thing blah = thisIsANamedArg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let something: thing blah = aTypeAnnotation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let something: blah = thisIsANamedArg thing;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let something: blah = typeAnnotation thing;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let newRecord = {
 | 
				
			||||||
 | 
					  ...(
 | 
				
			||||||
 | 
					    heresAFunctionWithNamedArgs argOne::i: annotatedResult
 | 
				
			||||||
 | 
					  ),
 | 
				
			||||||
 | 
					  soAsToInstill: 0,
 | 
				
			||||||
 | 
					  developmentHabbits: 1
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[@@@thisIsAThing];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let x = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Ensure that the parenthesis are preserved here because they are
 | 
				
			||||||
 | 
					 * important:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					let something =
 | 
				
			||||||
 | 
					  fun
 | 
				
			||||||
 | 
					  | None => (
 | 
				
			||||||
 | 
					      fun
 | 
				
			||||||
 | 
					      | [] => "emptyList"
 | 
				
			||||||
 | 
					      | [_, ..._] => "nonEmptyList"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  | Some _ => (
 | 
				
			||||||
 | 
					      fun
 | 
				
			||||||
 | 
					      | [] => "emptyList"
 | 
				
			||||||
 | 
					      | [_, ..._] => "nonEmptyList"
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  A | B = X; */
 | 
				
			||||||
 | 
					let A | B = X;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  A | (B | C) = X; */
 | 
				
			||||||
 | 
					let A | (B | C) = X;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* (A | B) | (C | D) = X; */
 | 
				
			||||||
 | 
					let A | B | (C | D) = X;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  A | B | (C | D) = X; */
 | 
				
			||||||
 | 
					let A | B | (C | D) = X;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* (A | B) | C = X; */
 | 
				
			||||||
 | 
					let A | B | C = X;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  A | B | C = X; */
 | 
				
			||||||
 | 
					let A | B | C = X;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** External function declaration
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					external f : int => int = "foo";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let x = {contents: 0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let unitVal = x.contents = 210;
 | 
				
			||||||
							
								
								
									
										19
									
								
								samples/Regular Expression/modeline-emacs.regexp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/Regular Expression/modeline-emacs.regexp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					-\*-
 | 
				
			||||||
 | 
					(?:
 | 
				
			||||||
 | 
						\s*
 | 
				
			||||||
 | 
						(?= [^:;\s]+ \s* -\*-)
 | 
				
			||||||
 | 
						|
 | 
				
			||||||
 | 
						(?:
 | 
				
			||||||
 | 
							.*?[;\s]
 | 
				
			||||||
 | 
							|
 | 
				
			||||||
 | 
							(?<=-\*-)
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						mode\s*:\s*
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					([^:;\s]+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(?=
 | 
				
			||||||
 | 
						[\s;] | (?<![-*]) -\*-
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					.*?
 | 
				
			||||||
 | 
					-\*-
 | 
				
			||||||
							
								
								
									
										27
									
								
								samples/Regular Expression/modeline-vim.regexp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								samples/Regular Expression/modeline-vim.regexp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					(?:
 | 
				
			||||||
 | 
						(?:\s|^)
 | 
				
			||||||
 | 
						vi
 | 
				
			||||||
 | 
						(?:m[<=>]?\d+|m)?
 | 
				
			||||||
 | 
						|
 | 
				
			||||||
 | 
						[\t\x20]
 | 
				
			||||||
 | 
						ex
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					(?=
 | 
				
			||||||
 | 
						: (?=\s* set? \s [^\n:]+ :) |
 | 
				
			||||||
 | 
						: (?!\s* set? \s)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(?:
 | 
				
			||||||
 | 
						(?:\s|\s*:\s*)
 | 
				
			||||||
 | 
						\w*
 | 
				
			||||||
 | 
						(?:
 | 
				
			||||||
 | 
							\s*=
 | 
				
			||||||
 | 
							(?:[^\n\\\s]|\\.)*
 | 
				
			||||||
 | 
						)?
 | 
				
			||||||
 | 
					)*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[\s:]
 | 
				
			||||||
 | 
					(?:filetype|ft|syntax)
 | 
				
			||||||
 | 
					\s*=
 | 
				
			||||||
 | 
					(MODE_NAME_HERE)
 | 
				
			||||||
 | 
					(?=\s|:|$)
 | 
				
			||||||
							
								
								
									
										1
									
								
								samples/Regular Expression/ordinal.regex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Regular Expression/ordinal.regex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					\b(\d*1[1-3]th|\d*0th|(?:(?!11st)\d)*1st|\d*2nd|(?:(?!13rd)\d*)3rd|\d*[4-9]th)\b
 | 
				
			||||||
							
								
								
									
										1
									
								
								samples/Regular Expression/url.regex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Regular Expression/url.regex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					/^([^\/#\?]*:?\/\/)?(\/?(?:[^\/#\?]+\/)*)?([^\/#\?]+)?(?:\/(?=$))?(\?[^#]*)?(#.*)?$/
 | 
				
			||||||
							
								
								
									
										2934
									
								
								samples/SQL/zipcodes.uk.mysql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2934
									
								
								samples/SQL/zipcodes.uk.mysql
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										54
									
								
								samples/Text/filenames/COPYING.regex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								samples/Text/filenames/COPYING.regex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					$OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright 1992, 1993, 1994 Henry Spencer.  All rights reserved.
 | 
				
			||||||
 | 
					This software is not subject to any license of the American Telephone
 | 
				
			||||||
 | 
					and Telegraph Company or of the Regents of the University of California.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission is granted to anyone to use this software for any purpose on
 | 
				
			||||||
 | 
					any computer system, and to alter it and redistribute it, subject
 | 
				
			||||||
 | 
					to the following restrictions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. The author is not responsible for the consequences of use of this
 | 
				
			||||||
 | 
					   software, no matter how awful, even if they arise from flaws in it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. The origin of this software must not be misrepresented, either by
 | 
				
			||||||
 | 
					   explicit claim or by omission.  Since few users ever read sources,
 | 
				
			||||||
 | 
					   credits must appear in the documentation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. Altered versions must be plainly marked as such, and must not be
 | 
				
			||||||
 | 
					   misrepresented as being the original software.  Since few users
 | 
				
			||||||
 | 
					   ever read sources, credits must appear in the documentation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4. This notice may not be removed or altered.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 | 
				
			||||||
 | 
					/*-
 | 
				
			||||||
 | 
					 * Copyright (c) 1994
 | 
				
			||||||
 | 
					 *	The Regents of the University of California.  All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 * 1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 * 2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *    notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *    documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 * 3. Neither the name of the University nor the names of its contributors
 | 
				
			||||||
 | 
					 *    may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *    without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
				
			||||||
 | 
					 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
				
			||||||
 | 
					 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
				
			||||||
 | 
					 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
				
			||||||
 | 
					 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
				
			||||||
 | 
					 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					 * SUCH DAMAGE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	@(#)COPYRIGHT	8.1 (Berkeley) 3/16/94
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										339
									
								
								samples/Text/filenames/LICENSE.mysql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								samples/Text/filenames/LICENSE.mysql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,339 @@
 | 
				
			|||||||
 | 
					                    GNU GENERAL PUBLIC LICENSE
 | 
				
			||||||
 | 
					                       Version 2, June 1991
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 | 
				
			||||||
 | 
					 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
				
			||||||
 | 
					 Everyone is permitted to copy and distribute verbatim copies
 | 
				
			||||||
 | 
					 of this license document, but changing it is not allowed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            Preamble
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The licenses for most software are designed to take away your
 | 
				
			||||||
 | 
					freedom to share and change it.  By contrast, the GNU General Public
 | 
				
			||||||
 | 
					License is intended to guarantee your freedom to share and change free
 | 
				
			||||||
 | 
					software--to make sure the software is free for all its users.  This
 | 
				
			||||||
 | 
					General Public License applies to most of the Free Software
 | 
				
			||||||
 | 
					Foundation's software and to any other program whose authors commit to
 | 
				
			||||||
 | 
					using it.  (Some other Free Software Foundation software is covered by
 | 
				
			||||||
 | 
					the GNU Lesser General Public License instead.)  You can apply it to
 | 
				
			||||||
 | 
					your programs, too.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  When we speak of free software, we are referring to freedom, not
 | 
				
			||||||
 | 
					price.  Our General Public Licenses are designed to make sure that you
 | 
				
			||||||
 | 
					have the freedom to distribute copies of free software (and charge for
 | 
				
			||||||
 | 
					this service if you wish), that you receive source code or can get it
 | 
				
			||||||
 | 
					if you want it, that you can change the software or use pieces of it
 | 
				
			||||||
 | 
					in new free programs; and that you know you can do these things.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  To protect your rights, we need to make restrictions that forbid
 | 
				
			||||||
 | 
					anyone to deny you these rights or to ask you to surrender the rights.
 | 
				
			||||||
 | 
					These restrictions translate to certain responsibilities for you if you
 | 
				
			||||||
 | 
					distribute copies of the software, or if you modify it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  For example, if you distribute copies of such a program, whether
 | 
				
			||||||
 | 
					gratis or for a fee, you must give the recipients all the rights that
 | 
				
			||||||
 | 
					you have.  You must make sure that they, too, receive or can get the
 | 
				
			||||||
 | 
					source code.  And you must show them these terms so they know their
 | 
				
			||||||
 | 
					rights.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  We protect your rights with two steps: (1) copyright the software, and
 | 
				
			||||||
 | 
					(2) offer you this license which gives you legal permission to copy,
 | 
				
			||||||
 | 
					distribute and/or modify the software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Also, for each author's protection and ours, we want to make certain
 | 
				
			||||||
 | 
					that everyone understands that there is no warranty for this free
 | 
				
			||||||
 | 
					software.  If the software is modified by someone else and passed on, we
 | 
				
			||||||
 | 
					want its recipients to know that what they have is not the original, so
 | 
				
			||||||
 | 
					that any problems introduced by others will not reflect on the original
 | 
				
			||||||
 | 
					authors' reputations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Finally, any free program is threatened constantly by software
 | 
				
			||||||
 | 
					patents.  We wish to avoid the danger that redistributors of a free
 | 
				
			||||||
 | 
					program will individually obtain patent licenses, in effect making the
 | 
				
			||||||
 | 
					program proprietary.  To prevent this, we have made it clear that any
 | 
				
			||||||
 | 
					patent must be licensed for everyone's free use or not licensed at all.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The precise terms and conditions for copying, distribution and
 | 
				
			||||||
 | 
					modification follow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    GNU GENERAL PUBLIC LICENSE
 | 
				
			||||||
 | 
					   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  0. This License applies to any program or other work which contains
 | 
				
			||||||
 | 
					a notice placed by the copyright holder saying it may be distributed
 | 
				
			||||||
 | 
					under the terms of this General Public License.  The "Program", below,
 | 
				
			||||||
 | 
					refers to any such program or work, and a "work based on the Program"
 | 
				
			||||||
 | 
					means either the Program or any derivative work under copyright law:
 | 
				
			||||||
 | 
					that is to say, a work containing the Program or a portion of it,
 | 
				
			||||||
 | 
					either verbatim or with modifications and/or translated into another
 | 
				
			||||||
 | 
					language.  (Hereinafter, translation is included without limitation in
 | 
				
			||||||
 | 
					the term "modification".)  Each licensee is addressed as "you".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Activities other than copying, distribution and modification are not
 | 
				
			||||||
 | 
					covered by this License; they are outside its scope.  The act of
 | 
				
			||||||
 | 
					running the Program is not restricted, and the output from the Program
 | 
				
			||||||
 | 
					is covered only if its contents constitute a work based on the
 | 
				
			||||||
 | 
					Program (independent of having been made by running the Program).
 | 
				
			||||||
 | 
					Whether that is true depends on what the Program does.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  1. You may copy and distribute verbatim copies of the Program's
 | 
				
			||||||
 | 
					source code as you receive it, in any medium, provided that you
 | 
				
			||||||
 | 
					conspicuously and appropriately publish on each copy an appropriate
 | 
				
			||||||
 | 
					copyright notice and disclaimer of warranty; keep intact all the
 | 
				
			||||||
 | 
					notices that refer to this License and to the absence of any warranty;
 | 
				
			||||||
 | 
					and give any other recipients of the Program a copy of this License
 | 
				
			||||||
 | 
					along with the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may charge a fee for the physical act of transferring a copy, and
 | 
				
			||||||
 | 
					you may at your option offer warranty protection in exchange for a fee.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  2. You may modify your copy or copies of the Program or any portion
 | 
				
			||||||
 | 
					of it, thus forming a work based on the Program, and copy and
 | 
				
			||||||
 | 
					distribute such modifications or work under the terms of Section 1
 | 
				
			||||||
 | 
					above, provided that you also meet all of these conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    a) You must cause the modified files to carry prominent notices
 | 
				
			||||||
 | 
					    stating that you changed the files and the date of any change.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    b) You must cause any work that you distribute or publish, that in
 | 
				
			||||||
 | 
					    whole or in part contains or is derived from the Program or any
 | 
				
			||||||
 | 
					    part thereof, to be licensed as a whole at no charge to all third
 | 
				
			||||||
 | 
					    parties under the terms of this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    c) If the modified program normally reads commands interactively
 | 
				
			||||||
 | 
					    when run, you must cause it, when started running for such
 | 
				
			||||||
 | 
					    interactive use in the most ordinary way, to print or display an
 | 
				
			||||||
 | 
					    announcement including an appropriate copyright notice and a
 | 
				
			||||||
 | 
					    notice that there is no warranty (or else, saying that you provide
 | 
				
			||||||
 | 
					    a warranty) and that users may redistribute the program under
 | 
				
			||||||
 | 
					    these conditions, and telling the user how to view a copy of this
 | 
				
			||||||
 | 
					    License.  (Exception: if the Program itself is interactive but
 | 
				
			||||||
 | 
					    does not normally print such an announcement, your work based on
 | 
				
			||||||
 | 
					    the Program is not required to print an announcement.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These requirements apply to the modified work as a whole.  If
 | 
				
			||||||
 | 
					identifiable sections of that work are not derived from the Program,
 | 
				
			||||||
 | 
					and can be reasonably considered independent and separate works in
 | 
				
			||||||
 | 
					themselves, then this License, and its terms, do not apply to those
 | 
				
			||||||
 | 
					sections when you distribute them as separate works.  But when you
 | 
				
			||||||
 | 
					distribute the same sections as part of a whole which is a work based
 | 
				
			||||||
 | 
					on the Program, the distribution of the whole must be on the terms of
 | 
				
			||||||
 | 
					this License, whose permissions for other licensees extend to the
 | 
				
			||||||
 | 
					entire whole, and thus to each and every part regardless of who wrote it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thus, it is not the intent of this section to claim rights or contest
 | 
				
			||||||
 | 
					your rights to work written entirely by you; rather, the intent is to
 | 
				
			||||||
 | 
					exercise the right to control the distribution of derivative or
 | 
				
			||||||
 | 
					collective works based on the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In addition, mere aggregation of another work not based on the Program
 | 
				
			||||||
 | 
					with the Program (or with a work based on the Program) on a volume of
 | 
				
			||||||
 | 
					a storage or distribution medium does not bring the other work under
 | 
				
			||||||
 | 
					the scope of this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  3. You may copy and distribute the Program (or a work based on it,
 | 
				
			||||||
 | 
					under Section 2) in object code or executable form under the terms of
 | 
				
			||||||
 | 
					Sections 1 and 2 above provided that you also do one of the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    a) Accompany it with the complete corresponding machine-readable
 | 
				
			||||||
 | 
					    source code, which must be distributed under the terms of Sections
 | 
				
			||||||
 | 
					    1 and 2 above on a medium customarily used for software interchange; or,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    b) Accompany it with a written offer, valid for at least three
 | 
				
			||||||
 | 
					    years, to give any third party, for a charge no more than your
 | 
				
			||||||
 | 
					    cost of physically performing source distribution, a complete
 | 
				
			||||||
 | 
					    machine-readable copy of the corresponding source code, to be
 | 
				
			||||||
 | 
					    distributed under the terms of Sections 1 and 2 above on a medium
 | 
				
			||||||
 | 
					    customarily used for software interchange; or,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    c) Accompany it with the information you received as to the offer
 | 
				
			||||||
 | 
					    to distribute corresponding source code.  (This alternative is
 | 
				
			||||||
 | 
					    allowed only for noncommercial distribution and only if you
 | 
				
			||||||
 | 
					    received the program in object code or executable form with such
 | 
				
			||||||
 | 
					    an offer, in accord with Subsection b above.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The source code for a work means the preferred form of the work for
 | 
				
			||||||
 | 
					making modifications to it.  For an executable work, complete source
 | 
				
			||||||
 | 
					code means all the source code for all modules it contains, plus any
 | 
				
			||||||
 | 
					associated interface definition files, plus the scripts used to
 | 
				
			||||||
 | 
					control compilation and installation of the executable.  However, as a
 | 
				
			||||||
 | 
					special exception, the source code distributed need not include
 | 
				
			||||||
 | 
					anything that is normally distributed (in either source or binary
 | 
				
			||||||
 | 
					form) with the major components (compiler, kernel, and so on) of the
 | 
				
			||||||
 | 
					operating system on which the executable runs, unless that component
 | 
				
			||||||
 | 
					itself accompanies the executable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If distribution of executable or object code is made by offering
 | 
				
			||||||
 | 
					access to copy from a designated place, then offering equivalent
 | 
				
			||||||
 | 
					access to copy the source code from the same place counts as
 | 
				
			||||||
 | 
					distribution of the source code, even though third parties are not
 | 
				
			||||||
 | 
					compelled to copy the source along with the object code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  4. You may not copy, modify, sublicense, or distribute the Program
 | 
				
			||||||
 | 
					except as expressly provided under this License.  Any attempt
 | 
				
			||||||
 | 
					otherwise to copy, modify, sublicense or distribute the Program is
 | 
				
			||||||
 | 
					void, and will automatically terminate your rights under this License.
 | 
				
			||||||
 | 
					However, parties who have received copies, or rights, from you under
 | 
				
			||||||
 | 
					this License will not have their licenses terminated so long as such
 | 
				
			||||||
 | 
					parties remain in full compliance.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  5. You are not required to accept this License, since you have not
 | 
				
			||||||
 | 
					signed it.  However, nothing else grants you permission to modify or
 | 
				
			||||||
 | 
					distribute the Program or its derivative works.  These actions are
 | 
				
			||||||
 | 
					prohibited by law if you do not accept this License.  Therefore, by
 | 
				
			||||||
 | 
					modifying or distributing the Program (or any work based on the
 | 
				
			||||||
 | 
					Program), you indicate your acceptance of this License to do so, and
 | 
				
			||||||
 | 
					all its terms and conditions for copying, distributing or modifying
 | 
				
			||||||
 | 
					the Program or works based on it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  6. Each time you redistribute the Program (or any work based on the
 | 
				
			||||||
 | 
					Program), the recipient automatically receives a license from the
 | 
				
			||||||
 | 
					original licensor to copy, distribute or modify the Program subject to
 | 
				
			||||||
 | 
					these terms and conditions.  You may not impose any further
 | 
				
			||||||
 | 
					restrictions on the recipients' exercise of the rights granted herein.
 | 
				
			||||||
 | 
					You are not responsible for enforcing compliance by third parties to
 | 
				
			||||||
 | 
					this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  7. If, as a consequence of a court judgment or allegation of patent
 | 
				
			||||||
 | 
					infringement or for any other reason (not limited to patent issues),
 | 
				
			||||||
 | 
					conditions are imposed on you (whether by court order, agreement or
 | 
				
			||||||
 | 
					otherwise) that contradict the conditions of this License, they do not
 | 
				
			||||||
 | 
					excuse you from the conditions of this License.  If you cannot
 | 
				
			||||||
 | 
					distribute so as to satisfy simultaneously your obligations under this
 | 
				
			||||||
 | 
					License and any other pertinent obligations, then as a consequence you
 | 
				
			||||||
 | 
					may not distribute the Program at all.  For example, if a patent
 | 
				
			||||||
 | 
					license would not permit royalty-free redistribution of the Program by
 | 
				
			||||||
 | 
					all those who receive copies directly or indirectly through you, then
 | 
				
			||||||
 | 
					the only way you could satisfy both it and this License would be to
 | 
				
			||||||
 | 
					refrain entirely from distribution of the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If any portion of this section is held invalid or unenforceable under
 | 
				
			||||||
 | 
					any particular circumstance, the balance of the section is intended to
 | 
				
			||||||
 | 
					apply and the section as a whole is intended to apply in other
 | 
				
			||||||
 | 
					circumstances.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It is not the purpose of this section to induce you to infringe any
 | 
				
			||||||
 | 
					patents or other property right claims or to contest validity of any
 | 
				
			||||||
 | 
					such claims; this section has the sole purpose of protecting the
 | 
				
			||||||
 | 
					integrity of the free software distribution system, which is
 | 
				
			||||||
 | 
					implemented by public license practices.  Many people have made
 | 
				
			||||||
 | 
					generous contributions to the wide range of software distributed
 | 
				
			||||||
 | 
					through that system in reliance on consistent application of that
 | 
				
			||||||
 | 
					system; it is up to the author/donor to decide if he or she is willing
 | 
				
			||||||
 | 
					to distribute software through any other system and a licensee cannot
 | 
				
			||||||
 | 
					impose that choice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This section is intended to make thoroughly clear what is believed to
 | 
				
			||||||
 | 
					be a consequence of the rest of this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  8. If the distribution and/or use of the Program is restricted in
 | 
				
			||||||
 | 
					certain countries either by patents or by copyrighted interfaces, the
 | 
				
			||||||
 | 
					original copyright holder who places the Program under this License
 | 
				
			||||||
 | 
					may add an explicit geographical distribution limitation excluding
 | 
				
			||||||
 | 
					those countries, so that distribution is permitted only in or among
 | 
				
			||||||
 | 
					countries not thus excluded.  In such case, this License incorporates
 | 
				
			||||||
 | 
					the limitation as if written in the body of this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  9. The Free Software Foundation may publish revised and/or new versions
 | 
				
			||||||
 | 
					of the General Public License from time to time.  Such new versions will
 | 
				
			||||||
 | 
					be similar in spirit to the present version, but may differ in detail to
 | 
				
			||||||
 | 
					address new problems or concerns.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each version is given a distinguishing version number.  If the Program
 | 
				
			||||||
 | 
					specifies a version number of this License which applies to it and "any
 | 
				
			||||||
 | 
					later version", you have the option of following the terms and conditions
 | 
				
			||||||
 | 
					either of that version or of any later version published by the Free
 | 
				
			||||||
 | 
					Software Foundation.  If the Program does not specify a version number of
 | 
				
			||||||
 | 
					this License, you may choose any version ever published by the Free Software
 | 
				
			||||||
 | 
					Foundation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  10. If you wish to incorporate parts of the Program into other free
 | 
				
			||||||
 | 
					programs whose distribution conditions are different, write to the author
 | 
				
			||||||
 | 
					to ask for permission.  For software which is copyrighted by the Free
 | 
				
			||||||
 | 
					Software Foundation, write to the Free Software Foundation; we sometimes
 | 
				
			||||||
 | 
					make exceptions for this.  Our decision will be guided by the two goals
 | 
				
			||||||
 | 
					of preserving the free status of all derivatives of our free software and
 | 
				
			||||||
 | 
					of promoting the sharing and reuse of software generally.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            NO WARRANTY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 | 
				
			||||||
 | 
					FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
 | 
				
			||||||
 | 
					OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 | 
				
			||||||
 | 
					PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 | 
				
			||||||
 | 
					OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
				
			||||||
 | 
					MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
 | 
				
			||||||
 | 
					TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
 | 
				
			||||||
 | 
					PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 | 
				
			||||||
 | 
					REPAIR OR CORRECTION.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
				
			||||||
 | 
					WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 | 
				
			||||||
 | 
					REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 | 
				
			||||||
 | 
					INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 | 
				
			||||||
 | 
					OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 | 
				
			||||||
 | 
					TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 | 
				
			||||||
 | 
					YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 | 
				
			||||||
 | 
					PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 | 
				
			||||||
 | 
					POSSIBILITY OF SUCH DAMAGES.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     END OF TERMS AND CONDITIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            How to Apply These Terms to Your New Programs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  If you develop a new program, and you want it to be of the greatest
 | 
				
			||||||
 | 
					possible use to the public, the best way to achieve this is to make it
 | 
				
			||||||
 | 
					free software which everyone can redistribute and change under these terms.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  To do so, attach the following notices to the program.  It is safest
 | 
				
			||||||
 | 
					to attach them to the start of each source file to most effectively
 | 
				
			||||||
 | 
					convey the exclusion of warranty; and each file should have at least
 | 
				
			||||||
 | 
					the "copyright" line and a pointer to where the full notice is found.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <one line to give the program's name and a brief idea of what it does.>
 | 
				
			||||||
 | 
					    Copyright (C) <year>  <name of author>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 | 
					    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					    the Free Software Foundation; either version 2 of the License, or
 | 
				
			||||||
 | 
					    (at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU General Public License along
 | 
				
			||||||
 | 
					    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
				
			||||||
 | 
					    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Also add information on how to contact you by electronic and paper mail.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If the program is interactive, make it output a short notice like this
 | 
				
			||||||
 | 
					when it starts in an interactive mode:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Gnomovision version 69, Copyright (C) year name of author
 | 
				
			||||||
 | 
					    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 | 
				
			||||||
 | 
					    This is free software, and you are welcome to redistribute it
 | 
				
			||||||
 | 
					    under certain conditions; type `show c' for details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The hypothetical commands `show w' and `show c' should show the appropriate
 | 
				
			||||||
 | 
					parts of the General Public License.  Of course, the commands you use may
 | 
				
			||||||
 | 
					be called something other than `show w' and `show c'; they could even be
 | 
				
			||||||
 | 
					mouse-clicks or menu items--whatever suits your program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You should also get your employer (if you work as a programmer) or your
 | 
				
			||||||
 | 
					school, if any, to sign a "copyright disclaimer" for the program, if
 | 
				
			||||||
 | 
					necessary.  Here is a sample; alter the names:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 | 
				
			||||||
 | 
					  `Gnomovision' (which makes passes at compilers) written by James Hacker.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <signature of Ty Coon>, 1 April 1989
 | 
				
			||||||
 | 
					  Ty Coon, President of Vice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This General Public License does not permit incorporating your program into
 | 
				
			||||||
 | 
					proprietary programs.  If your program is a subroutine library, you may
 | 
				
			||||||
 | 
					consider it more useful to permit linking proprietary applications with the
 | 
				
			||||||
 | 
					library.  If this is what you want to do, use the GNU Lesser General
 | 
				
			||||||
 | 
					Public License instead of this License.
 | 
				
			||||||
							
								
								
									
										24
									
								
								samples/Text/filenames/README.mysql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								samples/Text/filenames/README.mysql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					README for users interested in using MySQL as a triplestore backend
 | 
				
			||||||
 | 
					===================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The KiWi Triple Store used by Apache Marmotta supports different database
 | 
				
			||||||
 | 
					backends, including H2, PostgreSQL and MySQL. However, for legal reasons,
 | 
				
			||||||
 | 
					we are not allowed to distribute the MySQL connector library together with
 | 
				
			||||||
 | 
					the Apache Marmotta source code or binaries, as it is licensed under GPL
 | 
				
			||||||
 | 
					license.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Nonetheless, it is possible to use MySQL by downloading and installing the
 | 
				
			||||||
 | 
					connector manually:
 | 
				
			||||||
 | 
					    1.  download and unpack the MySQL Connector/J from
 | 
				
			||||||
 | 
					        http://dev.mysql.com/downloads/connector/j/
 | 
				
			||||||
 | 
					    2.  copy the mysql-connector-java-5.x.x.jar file to
 | 
				
			||||||
 | 
					        a. the library directory of the application server
 | 
				
			||||||
 | 
					           (e.g. $TOMCAT_HOME/lib)
 | 
				
			||||||
 | 
					        -- OR --
 | 
				
			||||||
 | 
					        b. the library directory of the Apache Marmotta Web application
 | 
				
			||||||
 | 
					           (e.g. $TOMCAT_HOME/webapps/marmotta/WEB-INF/lib)
 | 
				
			||||||
 | 
					    3.  restart the application server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Apache Marmotta will then automatically be able to use the MySQL connector
 | 
				
			||||||
 | 
					to connect to a MySQL database. Please note that Marmotta requires at least
 | 
				
			||||||
 | 
					MySQL 5.x, because it makes use of nested queries and foreign keys.
 | 
				
			||||||
							
								
								
									
										1297
									
								
								samples/XCompose/filenames/XCompose
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1297
									
								
								samples/XCompose/filenames/XCompose
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										42
									
								
								samples/YAML/database.yml.mysql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								samples/YAML/database.yml.mysql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# PRODUCTION
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					production:
 | 
				
			||||||
 | 
					  adapter: mysql2
 | 
				
			||||||
 | 
					  encoding: utf8mb4
 | 
				
			||||||
 | 
					  collation: utf8mb4_general_ci
 | 
				
			||||||
 | 
					  reconnect: false
 | 
				
			||||||
 | 
					  database: gitlabhq_production
 | 
				
			||||||
 | 
					  pool: 10
 | 
				
			||||||
 | 
					  username: git
 | 
				
			||||||
 | 
					  password: "secure password"
 | 
				
			||||||
 | 
					  # host: localhost
 | 
				
			||||||
 | 
					  # socket: /tmp/mysql.sock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Development specific
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					development:
 | 
				
			||||||
 | 
					  adapter: mysql2
 | 
				
			||||||
 | 
					  encoding: utf8mb4
 | 
				
			||||||
 | 
					  collation: utf8mb4_general_ci
 | 
				
			||||||
 | 
					  reconnect: false
 | 
				
			||||||
 | 
					  database: gitlabhq_development
 | 
				
			||||||
 | 
					  pool: 5
 | 
				
			||||||
 | 
					  username: root
 | 
				
			||||||
 | 
					  password: "secure password"
 | 
				
			||||||
 | 
					  # socket: /tmp/mysql.sock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Warning: The database defined as "test" will be erased and
 | 
				
			||||||
 | 
					# re-generated from your development database when you run "rake".
 | 
				
			||||||
 | 
					# Do not set this db to the same as development or production.
 | 
				
			||||||
 | 
					test: &test
 | 
				
			||||||
 | 
					  adapter: mysql2
 | 
				
			||||||
 | 
					  encoding: utf8mb4
 | 
				
			||||||
 | 
					  collation: utf8mb4_general_ci
 | 
				
			||||||
 | 
					  reconnect: false
 | 
				
			||||||
 | 
					  database: gitlabhq_test
 | 
				
			||||||
 | 
					  pool: 5
 | 
				
			||||||
 | 
					  username: root
 | 
				
			||||||
 | 
					  password:
 | 
				
			||||||
 | 
					  # socket: /tmp/mysql.sock
 | 
				
			||||||
@@ -84,6 +84,7 @@ if repo_old
 | 
				
			|||||||
  log "Deregistering: #{repo_old}"
 | 
					  log "Deregistering: #{repo_old}"
 | 
				
			||||||
  `git submodule deinit #{repo_old}`
 | 
					  `git submodule deinit #{repo_old}`
 | 
				
			||||||
  `git rm -rf #{repo_old}`
 | 
					  `git rm -rf #{repo_old}`
 | 
				
			||||||
 | 
					  `script/convert-grammars`
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
log "Registering new submodule: #{repo_new}"
 | 
					log "Registering new submodule: #{repo_new}"
 | 
				
			||||||
@@ -92,7 +93,11 @@ exit 1 if $?.exitstatus > 0
 | 
				
			|||||||
`script/convert-grammars --add #{repo_new}`
 | 
					`script/convert-grammars --add #{repo_new}`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
log "Confirming license"
 | 
					log "Confirming license"
 | 
				
			||||||
`script/licensed --module "#{repo_new}"`
 | 
					if repo_old
 | 
				
			||||||
 | 
					  `script/licensed`
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					  `script/licensed --module "#{repo_new}"`
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
log "Updating grammar documentation in vendor/REAEDME.md"
 | 
					log "Updating grammar documentation in vendor/REAEDME.md"
 | 
				
			||||||
`bundle exec rake samples`
 | 
					`bundle exec rake samples`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -174,6 +174,7 @@ end
 | 
				
			|||||||
def load_grammars(tmp_dir, source, all_scopes)
 | 
					def load_grammars(tmp_dir, source, all_scopes)
 | 
				
			||||||
  is_url = source.start_with?("http:", "https:")
 | 
					  is_url = source.start_with?("http:", "https:")
 | 
				
			||||||
  return [] if is_url && !$options[:remote]
 | 
					  return [] if is_url && !$options[:remote]
 | 
				
			||||||
 | 
					  return [] if !is_url && !File.exist?(source)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  p = if !is_url
 | 
					  p = if !is_url
 | 
				
			||||||
        if File.directory?(source)
 | 
					        if File.directory?(source)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ SUBMODULES.partition { |submodule| SLOW_SUBMODULES.include?(submodule) }.flatten
 | 
				
			|||||||
  submodules.push(submodule)
 | 
					  submodules.push(submodule)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
8.times do
 | 
					(ARGV.first || 8).to_i.times do
 | 
				
			||||||
  Thread.new { run_thread(submodules, results) }
 | 
					  Thread.new { run_thread(submodules, results) }
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,7 +71,7 @@ class GrammarList
 | 
				
			|||||||
      when "https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz"
 | 
					      when "https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz"
 | 
				
			||||||
        short_url = "bitbucket:Clams/sublimesystemverilog"
 | 
					        short_url = "bitbucket:Clams/sublimesystemverilog"
 | 
				
			||||||
        long_url  = "https://bitbucket.org/Clams/sublimesystemverilog"
 | 
					        long_url  = "https://bitbucket.org/Clams/sublimesystemverilog"
 | 
				
			||||||
      when "http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage"
 | 
					      when "https://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage"
 | 
				
			||||||
        short_url = "genshi.edgewall.org/query"
 | 
					        short_url = "genshi.edgewall.org/query"
 | 
				
			||||||
        long_url  = "https://genshi.edgewall.org/query"
 | 
					        long_url  = "https://genshi.edgewall.org/query"
 | 
				
			||||||
      when "vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage"
 | 
					      when "vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								test/fixtures/Data/yarn.lock
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								test/fixtures/Data/yarn.lock
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
 | 
				
			||||||
 | 
					# yarn lockfile v1
 | 
				
			||||||
 | 
					abab@^1.0.0:
 | 
				
			||||||
 | 
					  version "1.0.3"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abbrev@1, abbrev@1.0.x:
 | 
				
			||||||
 | 
					  version "1.0.9"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
 | 
				
			||||||
@@ -187,6 +187,9 @@ class TestBlob < Minitest::Test
 | 
				
			|||||||
    assert sample_blob_memory("JavaScript/intro.js").generated?
 | 
					    assert sample_blob_memory("JavaScript/intro.js").generated?
 | 
				
			||||||
    assert sample_blob_memory("JavaScript/classes.js").generated?
 | 
					    assert sample_blob_memory("JavaScript/classes.js").generated?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert sample_blob_memory("JavaScript/ccalc-lex.js").generated?
 | 
				
			||||||
 | 
					    assert sample_blob_memory("JavaScript/ccalc-parse.js").generated?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Protocol Buffer generated code
 | 
					    # Protocol Buffer generated code
 | 
				
			||||||
    assert sample_blob_memory("C++/protocol-buffer.pb.h").generated?
 | 
					    assert sample_blob_memory("C++/protocol-buffer.pb.h").generated?
 | 
				
			||||||
    assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated?
 | 
					    assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated?
 | 
				
			||||||
@@ -194,6 +197,7 @@ class TestBlob < Minitest::Test
 | 
				
			|||||||
    assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated?
 | 
					    assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated?
 | 
				
			||||||
    assert sample_blob_memory("Go/api.pb.go").generated?
 | 
					    assert sample_blob_memory("Go/api.pb.go").generated?
 | 
				
			||||||
    assert sample_blob_memory("Go/embedded.go").generated?
 | 
					    assert sample_blob_memory("Go/embedded.go").generated?
 | 
				
			||||||
 | 
					    assert sample_blob_memory("JavaScript/proto.js").generated?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Apache Thrift generated code
 | 
					    # Apache Thrift generated code
 | 
				
			||||||
    assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated?
 | 
					    assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated?
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,4 +53,8 @@ class TestClassifier < Minitest::Test
 | 
				
			|||||||
      assert_equal language.name, results.first[0], "#{sample[:path]}\n#{results.inspect}"
 | 
					      assert_equal language.name, results.first[0], "#{sample[:path]}\n#{results.inspect}"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_classify_empty_languages
 | 
				
			||||||
 | 
					    assert_equal [], Classifier.classify(Samples.cache, fixture("Ruby/foo.rb"), [])
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -79,6 +79,9 @@ class TestGenerated < Minitest::Test
 | 
				
			|||||||
    generated_fixture_loading_data("Data/sourcemap.v3.map")
 | 
					    generated_fixture_loading_data("Data/sourcemap.v3.map")
 | 
				
			||||||
    generated_fixture_loading_data("Data/sourcemap.v1.map")
 | 
					    generated_fixture_loading_data("Data/sourcemap.v1.map")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Yarn locfile
 | 
				
			||||||
 | 
					    generated_fixture_loading_data("Data/yarn.lock")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Specflow
 | 
					    # Specflow
 | 
				
			||||||
    generated_fixture_without_loading_data("Features/BindingCulture.feature.cs")
 | 
					    generated_fixture_without_loading_data("Features/BindingCulture.feature.cs")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -87,5 +90,8 @@ class TestGenerated < Minitest::Test
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # GrammarKit
 | 
					    # GrammarKit
 | 
				
			||||||
    generated_sample_loading_data("Java/GrammarKit.java")
 | 
					    generated_sample_loading_data("Java/GrammarKit.java")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # roxygen2
 | 
				
			||||||
 | 
					    generated_sample_loading_data("R/import.Rd")
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ class TestGrammars < Minitest::Test
 | 
				
			|||||||
    "b5432a1e1055de7eeede2dddf91e009480651fd6", # jasmin-sublime
 | 
					    "b5432a1e1055de7eeede2dddf91e009480651fd6", # jasmin-sublime
 | 
				
			||||||
    "74143c4d2a5649eb179105afcb37f466558c22ce", # language-clojure
 | 
					    "74143c4d2a5649eb179105afcb37f466558c22ce", # language-clojure
 | 
				
			||||||
    "760471435f5ab0b9dc99a628203cd8f9156d28ce", # language-coffee-script
 | 
					    "760471435f5ab0b9dc99a628203cd8f9156d28ce", # language-coffee-script
 | 
				
			||||||
    "330e6d465e26bdd232aafcd3f5dba6a1d098a20e", # language-csharp
 | 
					    "94fbd554ec1837fb7c508fd7425326639c3f4103", # language-csharp
 | 
				
			||||||
    "70fb557a431891c2d634c33fa7367feab5066fd6", # language-javascript
 | 
					    "70fb557a431891c2d634c33fa7367feab5066fd6", # language-javascript
 | 
				
			||||||
    "e0528c23cd967f999e058f1408ccb5b7237daaba", # language-python
 | 
					    "e0528c23cd967f999e058f1408ccb5b7237daaba", # language-python
 | 
				
			||||||
    "8653305b358375d0fced85dc24793b99919b11ef", # language-shellscript
 | 
					    "8653305b358375d0fced85dc24793b99919b11ef", # language-shellscript
 | 
				
			||||||
@@ -36,11 +36,13 @@ class TestGrammars < Minitest::Test
 | 
				
			|||||||
    "c78ec142ac3126cf639cfd67bd646ed8226d8b74", # atom-language-purescript
 | 
					    "c78ec142ac3126cf639cfd67bd646ed8226d8b74", # atom-language-purescript
 | 
				
			||||||
    "341d7f66806fc41d081133d6e51ade856352e056", # FreeMarker.tmbundle
 | 
					    "341d7f66806fc41d081133d6e51ade856352e056", # FreeMarker.tmbundle
 | 
				
			||||||
    "15a394f6bc43400946570b299aee8ae264a1e3ff", # language-renpy
 | 
					    "15a394f6bc43400946570b299aee8ae264a1e3ff", # language-renpy
 | 
				
			||||||
    "c9118c370411f2f049c746c0fd096554e877aea2", # perl6fe
 | 
					 | 
				
			||||||
    "8ccf886749c32fb7e65d4d1316a7ed0479c93dc9", # language-less
 | 
					    "8ccf886749c32fb7e65d4d1316a7ed0479c93dc9", # language-less
 | 
				
			||||||
    "2f03492b52d7dd83b4e7472f01b87c6121e5b1a4", # monkey
 | 
					    "2f03492b52d7dd83b4e7472f01b87c6121e5b1a4", # monkey
 | 
				
			||||||
    "241e5ddbb4423d792216783e9f668bd670b026e4", # ant.tmbundle
 | 
					    "241e5ddbb4423d792216783e9f668bd670b026e4", # ant.tmbundle
 | 
				
			||||||
    "bdab9fdc21e6790b479ccb5945b78bc0f6ce2493"  # language-blade
 | 
					    "bdab9fdc21e6790b479ccb5945b78bc0f6ce2493", # language-blade
 | 
				
			||||||
 | 
					    "81711c69aa40135de7266c88b2f6ab28dbc1d81e", # atom-language-perl6
 | 
				
			||||||
 | 
					    "808e27f5e44167113198d277f47926c5d482eac8", # atom-language-rust
 | 
				
			||||||
 | 
					    "304be6184f7f344d44a1d13bddf511019624fd22", # language-css
 | 
				
			||||||
  ].freeze
 | 
					  ].freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # List of allowed SPDX license names
 | 
					  # List of allowed SPDX license names
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -460,4 +460,8 @@ class TestLanguage < Minitest::Test
 | 
				
			|||||||
      assert !language.color, "Unused colour assigned to #{language.name}"
 | 
					      assert !language.color, "Unused colour assigned to #{language.name}"
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_non_crash_on_comma
 | 
				
			||||||
 | 
					    assert_nil Language[',']
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/CodeMirror
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/CodeMirror
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/CodeMirror updated: 900659feeb...268cf99055
									
								
							
							
								
								
									
										25
									
								
								vendor/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/README.md
									
									
									
									
										vendored
									
									
								
							@@ -76,8 +76,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **Csound:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
 | 
					- **Csound:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
 | 
				
			||||||
- **Csound Document:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
 | 
					- **Csound Document:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
 | 
				
			||||||
- **Csound Score:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
 | 
					- **Csound Score:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
 | 
				
			||||||
- **CSS:** [textmate/css.tmbundle](https://github.com/textmate/css.tmbundle)
 | 
					- **CSS:** [atom/language-css](https://github.com/atom/language-css)
 | 
				
			||||||
- **Cucumber:** [cucumber/cucumber-tmbundle](https://github.com/cucumber/cucumber-tmbundle)
 | 
					 | 
				
			||||||
- **Cuda:** [harrism/sublimetext-cuda-cpp](https://github.com/harrism/sublimetext-cuda-cpp)
 | 
					- **Cuda:** [harrism/sublimetext-cuda-cpp](https://github.com/harrism/sublimetext-cuda-cpp)
 | 
				
			||||||
- **Cycript:** [atom/language-javascript](https://github.com/atom/language-javascript)
 | 
					- **Cycript:** [atom/language-javascript](https://github.com/atom/language-javascript)
 | 
				
			||||||
- **Cython:** [textmate/cython.tmbundle](https://github.com/textmate/cython.tmbundle)
 | 
					- **Cython:** [textmate/cython.tmbundle](https://github.com/textmate/cython.tmbundle)
 | 
				
			||||||
@@ -109,13 +108,12 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **Fancy:** [fancy-lang/fancy-tmbundle](https://github.com/fancy-lang/fancy-tmbundle)
 | 
					- **Fancy:** [fancy-lang/fancy-tmbundle](https://github.com/fancy-lang/fancy-tmbundle)
 | 
				
			||||||
- **fish:** [l15n/fish-tmbundle](https://github.com/l15n/fish-tmbundle)
 | 
					- **fish:** [l15n/fish-tmbundle](https://github.com/l15n/fish-tmbundle)
 | 
				
			||||||
- **Forth:** [textmate/forth.tmbundle](https://github.com/textmate/forth.tmbundle)
 | 
					- **Forth:** [textmate/forth.tmbundle](https://github.com/textmate/forth.tmbundle)
 | 
				
			||||||
- **FORTRAN:** [textmate/fortran.tmbundle](https://github.com/textmate/fortran.tmbundle)
 | 
					- **Fortran:** [textmate/fortran.tmbundle](https://github.com/textmate/fortran.tmbundle)
 | 
				
			||||||
- **FreeMarker:** [freemarker/FreeMarker.tmbundle](https://github.com/freemarker/FreeMarker.tmbundle)
 | 
					- **FreeMarker:** [freemarker/FreeMarker.tmbundle](https://github.com/freemarker/FreeMarker.tmbundle)
 | 
				
			||||||
- **Frege:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
 | 
					- **Frege:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
 | 
				
			||||||
- **G-code:** [robotmaster/sublime-text-syntax-highlighting](https://github.com/robotmaster/sublime-text-syntax-highlighting)
 | 
					- **G-code:** [robotmaster/sublime-text-syntax-highlighting](https://github.com/robotmaster/sublime-text-syntax-highlighting)
 | 
				
			||||||
- **Game Maker Language:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
 | 
					- **Game Maker Language:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
 | 
				
			||||||
- **GAP:** [dhowden/gap-tmbundle](https://github.com/dhowden/gap-tmbundle)
 | 
					- **GAP:** [dhowden/gap-tmbundle](https://github.com/dhowden/gap-tmbundle)
 | 
				
			||||||
- **GAS:** [Nessphoro/sublimeassembly](https://github.com/Nessphoro/sublimeassembly)
 | 
					 | 
				
			||||||
- **GCC Machine Description:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
 | 
					- **GCC Machine Description:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
 | 
				
			||||||
- **GDB:** [quarnster/SublimeGDB](https://github.com/quarnster/SublimeGDB)
 | 
					- **GDB:** [quarnster/SublimeGDB](https://github.com/quarnster/SublimeGDB)
 | 
				
			||||||
- **GDScript:** [beefsack/GDScript-sublime](https://github.com/beefsack/GDScript-sublime)
 | 
					- **GDScript:** [beefsack/GDScript-sublime](https://github.com/beefsack/GDScript-sublime)
 | 
				
			||||||
@@ -123,6 +121,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **Gentoo Ebuild:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
 | 
					- **Gentoo Ebuild:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
 | 
				
			||||||
- **Gentoo Eclass:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
 | 
					- **Gentoo Eclass:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
 | 
				
			||||||
- **Gettext Catalog:** [textmate/gettext.tmbundle](https://github.com/textmate/gettext.tmbundle)
 | 
					- **Gettext Catalog:** [textmate/gettext.tmbundle](https://github.com/textmate/gettext.tmbundle)
 | 
				
			||||||
 | 
					- **Gherkin:** [cucumber/cucumber-tmbundle](https://github.com/cucumber/cucumber-tmbundle)
 | 
				
			||||||
- **GLSL:** [euler0/sublime-glsl](https://github.com/euler0/sublime-glsl)
 | 
					- **GLSL:** [euler0/sublime-glsl](https://github.com/euler0/sublime-glsl)
 | 
				
			||||||
- **Glyph:** [textmate/tcl.tmbundle](https://github.com/textmate/tcl.tmbundle)
 | 
					- **Glyph:** [textmate/tcl.tmbundle](https://github.com/textmate/tcl.tmbundle)
 | 
				
			||||||
- **GN:** [devoncarew/language-gn](https://github.com/devoncarew/language-gn)
 | 
					- **GN:** [devoncarew/language-gn](https://github.com/devoncarew/language-gn)
 | 
				
			||||||
@@ -135,7 +134,6 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **Grammatical Framework:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
 | 
					- **Grammatical Framework:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell)
 | 
				
			||||||
- **GraphQL:** [rmosolgo/language-graphql](https://github.com/rmosolgo/language-graphql)
 | 
					- **GraphQL:** [rmosolgo/language-graphql](https://github.com/rmosolgo/language-graphql)
 | 
				
			||||||
- **Graphviz (DOT):** [textmate/graphviz.tmbundle](https://github.com/textmate/graphviz.tmbundle)
 | 
					- **Graphviz (DOT):** [textmate/graphviz.tmbundle](https://github.com/textmate/graphviz.tmbundle)
 | 
				
			||||||
- **Groff:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
 | 
					 | 
				
			||||||
- **Groovy:** [textmate/groovy.tmbundle](https://github.com/textmate/groovy.tmbundle)
 | 
					- **Groovy:** [textmate/groovy.tmbundle](https://github.com/textmate/groovy.tmbundle)
 | 
				
			||||||
- **Groovy Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
 | 
					- **Groovy Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
 | 
				
			||||||
- **Hack:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
 | 
					- **Hack:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
 | 
				
			||||||
@@ -152,7 +150,6 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **HTML+ERB:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
 | 
					- **HTML+ERB:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
 | 
				
			||||||
- **HTML+PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
 | 
					- **HTML+PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
 | 
				
			||||||
- **HTTP:** [httpspec/sublime-highlighting](https://github.com/httpspec/sublime-highlighting)
 | 
					- **HTTP:** [httpspec/sublime-highlighting](https://github.com/httpspec/sublime-highlighting)
 | 
				
			||||||
- **Hy:** [rwtolbert/language-hy](https://github.com/rwtolbert/language-hy)
 | 
					 | 
				
			||||||
- **IDL:** [mgalloy/idl.tmbundle](https://github.com/mgalloy/idl.tmbundle)
 | 
					- **IDL:** [mgalloy/idl.tmbundle](https://github.com/mgalloy/idl.tmbundle)
 | 
				
			||||||
- **Idris:** [idris-hackers/idris-sublime](https://github.com/idris-hackers/idris-sublime)
 | 
					- **Idris:** [idris-hackers/idris-sublime](https://github.com/idris-hackers/idris-sublime)
 | 
				
			||||||
- **Inform 7:** [erkyrath/language-inform7](https://github.com/erkyrath/language-inform7)
 | 
					- **Inform 7:** [erkyrath/language-inform7](https://github.com/erkyrath/language-inform7)
 | 
				
			||||||
@@ -162,7 +159,6 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **Isabelle:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle)
 | 
					- **Isabelle:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle)
 | 
				
			||||||
- **Isabelle ROOT:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle)
 | 
					- **Isabelle ROOT:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle)
 | 
				
			||||||
- **J:** [bcj/JSyntax](https://github.com/bcj/JSyntax)
 | 
					- **J:** [bcj/JSyntax](https://github.com/bcj/JSyntax)
 | 
				
			||||||
- **Jade:** [davidrios/jade-tmbundle](https://github.com/davidrios/jade-tmbundle)
 | 
					 | 
				
			||||||
- **Jasmin:** [atmarksharp/jasmin-sublime](https://github.com/atmarksharp/jasmin-sublime)
 | 
					- **Jasmin:** [atmarksharp/jasmin-sublime](https://github.com/atmarksharp/jasmin-sublime)
 | 
				
			||||||
- **Java:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
 | 
					- **Java:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
 | 
				
			||||||
- **Java Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
 | 
					- **Java Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
 | 
				
			||||||
@@ -224,7 +220,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **NetLogo:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
 | 
					- **NetLogo:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
 | 
				
			||||||
- **NewLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
 | 
					- **NewLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
 | 
				
			||||||
- **Nginx:** [brandonwamboldt/sublime-nginx](https://github.com/brandonwamboldt/sublime-nginx)
 | 
					- **Nginx:** [brandonwamboldt/sublime-nginx](https://github.com/brandonwamboldt/sublime-nginx)
 | 
				
			||||||
- **Nimrod:** [Varriount/NimLime](https://github.com/Varriount/NimLime)
 | 
					- **Nim:** [Varriount/NimLime](https://github.com/Varriount/NimLime)
 | 
				
			||||||
- **Ninja:** [khyo/language-ninja](https://github.com/khyo/language-ninja)
 | 
					- **Ninja:** [khyo/language-ninja](https://github.com/khyo/language-ninja)
 | 
				
			||||||
- **Nit:** [R4PaSs/Sublime-Nit](https://github.com/R4PaSs/Sublime-Nit)
 | 
					- **Nit:** [R4PaSs/Sublime-Nit](https://github.com/R4PaSs/Sublime-Nit)
 | 
				
			||||||
- **Nix:** [wmertens/sublime-nix](https://github.com/wmertens/sublime-nix)
 | 
					- **Nix:** [wmertens/sublime-nix](https://github.com/wmertens/sublime-nix)
 | 
				
			||||||
@@ -249,7 +245,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **Pascal:** [textmate/pascal.tmbundle](https://github.com/textmate/pascal.tmbundle)
 | 
					- **Pascal:** [textmate/pascal.tmbundle](https://github.com/textmate/pascal.tmbundle)
 | 
				
			||||||
- **PAWN:** [Southclaw/pawn-sublime-language](https://github.com/Southclaw/pawn-sublime-language)
 | 
					- **PAWN:** [Southclaw/pawn-sublime-language](https://github.com/Southclaw/pawn-sublime-language)
 | 
				
			||||||
- **Perl:** [textmate/perl.tmbundle](https://github.com/textmate/perl.tmbundle)
 | 
					- **Perl:** [textmate/perl.tmbundle](https://github.com/textmate/perl.tmbundle)
 | 
				
			||||||
- **Perl6:** [MadcapJake/language-perl6fe](https://github.com/MadcapJake/language-perl6fe)
 | 
					- **Perl6:** [perl6/atom-language-perl6](https://github.com/perl6/atom-language-perl6)
 | 
				
			||||||
- **PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
 | 
					- **PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
 | 
				
			||||||
- **Pic:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
 | 
					- **Pic:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
 | 
				
			||||||
- **PicoLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
 | 
					- **PicoLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
 | 
				
			||||||
@@ -265,6 +261,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **Prolog:** [alnkpa/sublimeprolog](https://github.com/alnkpa/sublimeprolog)
 | 
					- **Prolog:** [alnkpa/sublimeprolog](https://github.com/alnkpa/sublimeprolog)
 | 
				
			||||||
- **Propeller Spin:** [bitbased/sublime-spintools](https://github.com/bitbased/sublime-spintools)
 | 
					- **Propeller Spin:** [bitbased/sublime-spintools](https://github.com/bitbased/sublime-spintools)
 | 
				
			||||||
- **Protocol Buffer:** [michaeledgar/protobuf-tmbundle](https://github.com/michaeledgar/protobuf-tmbundle)
 | 
					- **Protocol Buffer:** [michaeledgar/protobuf-tmbundle](https://github.com/michaeledgar/protobuf-tmbundle)
 | 
				
			||||||
 | 
					- **Pug:** [davidrios/jade-tmbundle](https://github.com/davidrios/jade-tmbundle)
 | 
				
			||||||
- **Puppet:** [russCloak/SublimePuppet](https://github.com/russCloak/SublimePuppet)
 | 
					- **Puppet:** [russCloak/SublimePuppet](https://github.com/russCloak/SublimePuppet)
 | 
				
			||||||
- **PureScript:** [purescript-contrib/atom-language-purescript](https://github.com/purescript-contrib/atom-language-purescript)
 | 
					- **PureScript:** [purescript-contrib/atom-language-purescript](https://github.com/purescript-contrib/atom-language-purescript)
 | 
				
			||||||
- **Python:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
 | 
					- **Python:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
 | 
				
			||||||
@@ -275,21 +272,25 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **R:** [textmate/r.tmbundle](https://github.com/textmate/r.tmbundle)
 | 
					- **R:** [textmate/r.tmbundle](https://github.com/textmate/r.tmbundle)
 | 
				
			||||||
- **Racket:** [soegaard/racket-highlight-for-github](https://github.com/soegaard/racket-highlight-for-github)
 | 
					- **Racket:** [soegaard/racket-highlight-for-github](https://github.com/soegaard/racket-highlight-for-github)
 | 
				
			||||||
- **RAML:** [atom/language-yaml](https://github.com/atom/language-yaml)
 | 
					- **RAML:** [atom/language-yaml](https://github.com/atom/language-yaml)
 | 
				
			||||||
 | 
					- **Rascal:** [usethesource/rascal-syntax-highlighting](https://github.com/usethesource/rascal-syntax-highlighting)
 | 
				
			||||||
- **RDoc:** [joshaven/RDoc.tmbundle](https://github.com/joshaven/RDoc.tmbundle)
 | 
					- **RDoc:** [joshaven/RDoc.tmbundle](https://github.com/joshaven/RDoc.tmbundle)
 | 
				
			||||||
- **REALbasic:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
 | 
					- **REALbasic:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
 | 
				
			||||||
 | 
					- **Reason:** [facebook/reason](https://github.com/facebook/reason)
 | 
				
			||||||
- **Rebol:** [Oldes/Sublime-REBOL](https://github.com/Oldes/Sublime-REBOL)
 | 
					- **Rebol:** [Oldes/Sublime-REBOL](https://github.com/Oldes/Sublime-REBOL)
 | 
				
			||||||
- **Red:** [Oldes/Sublime-Red](https://github.com/Oldes/Sublime-Red)
 | 
					- **Red:** [Oldes/Sublime-Red](https://github.com/Oldes/Sublime-Red)
 | 
				
			||||||
 | 
					- **Regular Expression:** [Alhadis/language-regexp](https://github.com/Alhadis/language-regexp)
 | 
				
			||||||
- **Ren'Py:** [williamd1k0/language-renpy](https://github.com/williamd1k0/language-renpy)
 | 
					- **Ren'Py:** [williamd1k0/language-renpy](https://github.com/williamd1k0/language-renpy)
 | 
				
			||||||
- **reStructuredText:** [Lukasa/language-restructuredtext](https://github.com/Lukasa/language-restructuredtext)
 | 
					- **reStructuredText:** [Lukasa/language-restructuredtext](https://github.com/Lukasa/language-restructuredtext)
 | 
				
			||||||
- **REXX:** [mblocker/rexx-sublime](https://github.com/mblocker/rexx-sublime)
 | 
					- **REXX:** [mblocker/rexx-sublime](https://github.com/mblocker/rexx-sublime)
 | 
				
			||||||
- **RHTML:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
 | 
					- **RHTML:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
 | 
				
			||||||
- **RMarkdown:** [atom/language-gfm](https://github.com/atom/language-gfm)
 | 
					- **RMarkdown:** [atom/language-gfm](https://github.com/atom/language-gfm)
 | 
				
			||||||
- **RobotFramework:** [shellderp/sublime-robot-plugin](https://github.com/shellderp/sublime-robot-plugin)
 | 
					- **RobotFramework:** [shellderp/sublime-robot-plugin](https://github.com/shellderp/sublime-robot-plugin)
 | 
				
			||||||
 | 
					- **Roff:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
 | 
				
			||||||
- **Rouge:** [atom/language-clojure](https://github.com/atom/language-clojure)
 | 
					- **Rouge:** [atom/language-clojure](https://github.com/atom/language-clojure)
 | 
				
			||||||
- **RPM Spec:** [waveclaw/language-rpm-spec](https://github.com/waveclaw/language-rpm-spec)
 | 
					- **RPM Spec:** [waveclaw/language-rpm-spec](https://github.com/waveclaw/language-rpm-spec)
 | 
				
			||||||
- **Ruby:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
 | 
					- **Ruby:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
 | 
				
			||||||
- **RUNOFF:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
 | 
					- **RUNOFF:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
 | 
				
			||||||
- **Rust:** [jhasse/sublime-rust](https://github.com/jhasse/sublime-rust)
 | 
					- **Rust:** [zargony/atom-language-rust](https://github.com/zargony/atom-language-rust)
 | 
				
			||||||
- **Sage:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
 | 
					- **Sage:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython)
 | 
				
			||||||
- **SaltStack:** [saltstack/atom-salt](https://github.com/saltstack/atom-salt)
 | 
					- **SaltStack:** [saltstack/atom-salt](https://github.com/saltstack/atom-salt)
 | 
				
			||||||
- **SAS:** [rpardee/sas.tmbundle](https://github.com/rpardee/sas.tmbundle)
 | 
					- **SAS:** [rpardee/sas.tmbundle](https://github.com/rpardee/sas.tmbundle)
 | 
				
			||||||
@@ -341,6 +342,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **TypeScript:** [Microsoft/TypeScript-Sublime-Plugin](https://github.com/Microsoft/TypeScript-Sublime-Plugin)
 | 
					- **TypeScript:** [Microsoft/TypeScript-Sublime-Plugin](https://github.com/Microsoft/TypeScript-Sublime-Plugin)
 | 
				
			||||||
- **Unified Parallel C:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
 | 
					- **Unified Parallel C:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
 | 
				
			||||||
- **Unity3D Asset:** [atom/language-yaml](https://github.com/atom/language-yaml)
 | 
					- **Unity3D Asset:** [atom/language-yaml](https://github.com/atom/language-yaml)
 | 
				
			||||||
 | 
					- **Unix Assembly:** [Nessphoro/sublimeassembly](https://github.com/Nessphoro/sublimeassembly)
 | 
				
			||||||
- **Uno:** [atom/language-csharp](https://github.com/atom/language-csharp)
 | 
					- **Uno:** [atom/language-csharp](https://github.com/atom/language-csharp)
 | 
				
			||||||
- **UnrealScript:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
 | 
					- **UnrealScript:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
 | 
				
			||||||
- **UrWeb:** [gwalborn/UrWeb-Language-Definition](https://github.com/gwalborn/UrWeb-Language-Definition)
 | 
					- **UrWeb:** [gwalborn/UrWeb-Language-Definition](https://github.com/gwalborn/UrWeb-Language-Definition)
 | 
				
			||||||
@@ -348,7 +350,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **VCL:** [brandonwamboldt/sublime-varnish](https://github.com/brandonwamboldt/sublime-varnish)
 | 
					- **VCL:** [brandonwamboldt/sublime-varnish](https://github.com/brandonwamboldt/sublime-varnish)
 | 
				
			||||||
- **Verilog:** [textmate/verilog.tmbundle](https://github.com/textmate/verilog.tmbundle)
 | 
					- **Verilog:** [textmate/verilog.tmbundle](https://github.com/textmate/verilog.tmbundle)
 | 
				
			||||||
- **VHDL:** [textmate/vhdl.tmbundle](https://github.com/textmate/vhdl.tmbundle)
 | 
					- **VHDL:** [textmate/vhdl.tmbundle](https://github.com/textmate/vhdl.tmbundle)
 | 
				
			||||||
- **VimL:** [Alhadis/language-viml](https://github.com/Alhadis/language-viml)
 | 
					- **Vim script:** [Alhadis/language-viml](https://github.com/Alhadis/language-viml)
 | 
				
			||||||
- **Visual Basic:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
 | 
					- **Visual Basic:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
 | 
				
			||||||
- **Volt:** [textmate/d.tmbundle](https://github.com/textmate/d.tmbundle)
 | 
					- **Volt:** [textmate/d.tmbundle](https://github.com/textmate/d.tmbundle)
 | 
				
			||||||
- **Vue:** [vuejs/vue-syntax-highlight](https://github.com/vuejs/vue-syntax-highlight)
 | 
					- **Vue:** [vuejs/vue-syntax-highlight](https://github.com/vuejs/vue-syntax-highlight)
 | 
				
			||||||
@@ -361,6 +363,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting
 | 
				
			|||||||
- **X10:** [x10-lang/x10-highlighting](https://github.com/x10-lang/x10-highlighting)
 | 
					- **X10:** [x10-lang/x10-highlighting](https://github.com/x10-lang/x10-highlighting)
 | 
				
			||||||
- **xBase:** [hernad/atom-language-harbour](https://github.com/hernad/atom-language-harbour)
 | 
					- **xBase:** [hernad/atom-language-harbour](https://github.com/hernad/atom-language-harbour)
 | 
				
			||||||
- **XC:** [graymalkin/xc.tmbundle](https://github.com/graymalkin/xc.tmbundle)
 | 
					- **XC:** [graymalkin/xc.tmbundle](https://github.com/graymalkin/xc.tmbundle)
 | 
				
			||||||
 | 
					- **XCompose:** [samcv/language-xcompose](https://github.com/samcv/language-xcompose)
 | 
				
			||||||
- **XML:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
 | 
					- **XML:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
 | 
				
			||||||
- **Xojo:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
 | 
					- **Xojo:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
 | 
				
			||||||
- **XProc:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
 | 
					- **XProc:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/grammars/ColdFusion
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/ColdFusion
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/ColdFusion updated: c54a4c5f5e...dbe2f76038
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/Elm
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/Elm
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/Elm updated: 8e8af4a712...64315b1f86
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/MagicPython
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/MagicPython
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/MagicPython updated: a605599caf...b7d7f9d007
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/SublimeEthereum
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/SublimeEthereum
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/SublimeEthereum added at 51dec7b1e4
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimePapyrus
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimePapyrus
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimePapyrus updated: aaef57c245...b87e7c5238
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/TXL
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/TXL
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/TXL updated: c1c98dfa86...614cf83649
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/applescript.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/applescript.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/applescript.tmbundle updated: 5067ef67a5...df46dd96d8
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-language-1c-bsl
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-language-1c-bsl
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-language-1c-bsl updated: 12edd3a54c...0203c765f9
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/atom-language-perl6
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/atom-language-perl6
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/atom-language-perl6 added at 519adffd86
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/atom-language-rust
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/atom-language-rust
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/atom-language-rust added at 092cc6a8a0
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/css.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/css.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/css.tmbundle deleted from d79e9c0137
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/d.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/d.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/d.tmbundle updated: 039c92d9f2...d44b42bdb7
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/diff.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/diff.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/diff.tmbundle updated: 372abaaeb1...0593bb775e
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/elixir-tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/elixir-tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/elixir-tmbundle updated: 319bbe2022...50846fe555
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-blade
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-blade
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-blade updated: 14104c18a9...0282a2c5aa
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-clojure
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-clojure
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-clojure updated: 105fd2a3a4...5747bb28c2
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-coffee-script
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-coffee-script
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-coffee-script updated: f480a6b985...dade09261c
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-csharp
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-csharp
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-csharp updated: 8ae27bcae8...f1462897f9
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-csound
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-csound
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-csound updated: 2f112c9f60...c1c5b4db72
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/language-css
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/language-css
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/language-css added at 5d4af2db39
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-gfm
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-gfm
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-gfm updated: 17b24ee54e...727bcc84ac
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-gn
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-gn
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-gn updated: e1a3008505...e77a06e0ab
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-graphql
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-graphql
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-graphql updated: d3d9dc67b7...42f7f6422e
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-haskell
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-haskell
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-haskell updated: 78189f5b71...f9a937ad28
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/language-hy
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/language-hy
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-hy deleted from 93d267de4c
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-javascript
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-javascript
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-javascript updated: ea15b19139...245162fea4
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-less
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-less
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-less updated: c671f35467...c9abeea663
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-python
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-python
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-python updated: 14acf8da68...ceb204c654
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/language-regexp
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/language-regexp
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/language-regexp added at 9dc99a60ae
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-rpm-spec
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-rpm-spec
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-rpm-spec updated: 549b424107...b639f16683
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-shellscript
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-shellscript
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-shellscript updated: 77fd446cc1...29eecbc416
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-viml
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-viml
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-viml updated: c4bd6d26af...d4a408cdb1
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/language-xcompose
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/language-xcompose
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/language-xcompose added at 220ec42caa
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-yaml
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-yaml
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-yaml updated: d63dffb62b...252a0c19c6
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/latex.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/latex.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/latex.tmbundle updated: acbc3453c4...4f20bf6e8c
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/perl.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/perl.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/perl.tmbundle updated: 7a786e331d...c0b7a4bd65
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/perl6fe
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/perl6fe
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/perl6fe deleted from 84aa57300b
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/php.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/php.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/php.tmbundle updated: 010cc1c22c...3ed4837b43
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/reason
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/reason
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/reason added at f18549ccd3
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/sublime-mask
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/sublime-mask
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/sublime-mask updated: 647cf75a8f...45153117b1
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/sublime-rust
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/sublime-rust
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/sublime-rust deleted from 3bc8200ec7
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/sublime-typescript
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/sublime-typescript
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/sublime-typescript updated: ac15373c6c...918289c9a3
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/vue-syntax-highlight
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/vue-syntax-highlight
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/vue-syntax-highlight updated: ef872e4f1c...f88ff50332
									
								
							@@ -1,8 +1,10 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
type: grammar
 | 
					type: grammar
 | 
				
			||||||
name: sublime-rust
 | 
					name: SublimeEthereum
 | 
				
			||||||
license: mit
 | 
					license: mit
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					Copyright (c) 2015+ uniqpath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
of this software and associated documentation files (the "Software"), to deal
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
in the Software without restriction, including without limitation the rights
 | 
					in the Software without restriction, including without limitation the rights
 | 
				
			||||||
@@ -19,4 +21,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			|||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
					AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
					LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
					OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
				
			||||||
THE SOFTWARE.
 | 
					THE SOFTWARE..
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user