mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			28 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 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 | 
							
								
								
									
										27
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								.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 | ||||||
| @@ -255,7 +252,7 @@ | |||||||
| 	url = https://github.com/textmate/d.tmbundle | 	url = https://github.com/textmate/d.tmbundle | ||||||
| [submodule "vendor/grammars/diff.tmbundle"] | [submodule "vendor/grammars/diff.tmbundle"] | ||||||
| 	path = vendor/grammars/diff.tmbundle | 	path = vendor/grammars/diff.tmbundle | ||||||
| 	url = https://github.com/textmate/diff.tmbundle | 	url = https://github.com/kivikakk/diff.tmbundle | ||||||
| [submodule "vendor/grammars/dylan.tmbundle"] | [submodule "vendor/grammars/dylan.tmbundle"] | ||||||
| 	path = vendor/grammars/dylan.tmbundle | 	path = vendor/grammars/dylan.tmbundle | ||||||
| 	url = https://github.com/textmate/dylan.tmbundle | 	url = https://github.com/textmate/dylan.tmbundle | ||||||
| @@ -443,9 +440,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 +617,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 +800,18 @@ | |||||||
| [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 | ||||||
|   | |||||||
| @@ -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.0b10' | ||||||
|  |  | ||||||
|   s.add_development_dependency 'minitest', '>= 5.0' |   s.add_development_dependency 'minitest', '>= 5.0' | ||||||
|   s.add_development_dependency 'mocha' |   s.add_development_dependency 'mocha' | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								grammars.yml
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								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: | ||||||
| @@ -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: | ||||||
| @@ -436,6 +443,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 +522,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 +546,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 +615,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 | ||||||
|   | |||||||
| @@ -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,9 @@ module Linguist | |||||||
|       generated_unity3d_meta? || |       generated_unity3d_meta? || | ||||||
|       generated_racc? || |       generated_racc? || | ||||||
|       generated_jflex? || |       generated_jflex? || | ||||||
|       generated_grammarkit? |       generated_grammarkit? || | ||||||
|  |       generated_roxygen2? || | ||||||
|  |       generated_jison? | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Is the blob an Xcode file? |     # Internal: Is the blob an Xcode file? | ||||||
| @@ -275,6 +278,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 +325,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 +347,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 +447,37 @@ 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 | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -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"] | ||||||
|   | |||||||
| @@ -265,7 +265,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 +283,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 +434,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 +555,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 | ||||||
| @@ -1384,6 +1386,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: | ||||||
| @@ -1754,7 +1764,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 | ||||||
| @@ -3548,6 +3558,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" | ||||||
| @@ -3790,6 +3813,7 @@ SQL: | |||||||
|   - ".cql" |   - ".cql" | ||||||
|   - ".ddl" |   - ".ddl" | ||||||
|   - ".inc" |   - ".inc" | ||||||
|  |   - ".mysql" | ||||||
|   - ".prc" |   - ".prc" | ||||||
|   - ".tab" |   - ".tab" | ||||||
|   - ".udf" |   - ".udf" | ||||||
| @@ -4276,10 +4300,13 @@ Text: | |||||||
|   - COPYING |   - COPYING | ||||||
|   - 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 +4593,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 +4795,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.1" | ||||||
| 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") | ||||||
							
								
								
									
										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 | ||||||
							
								
								
									
										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; | ||||||
							
								
								
									
										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
											
										
									
								
							
							
								
								
									
										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" | ||||||
|  | if repo_old | ||||||
|  |   `script/licensed` | ||||||
|  | else | ||||||
|   `script/licensed --module "#{repo_new}"` |   `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) | ||||||
|   | |||||||
| @@ -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" | ||||||
|   | |||||||
| @@ -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? | ||||||
|   | |||||||
| @@ -87,5 +87,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,12 @@ 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 | ||||||
|   ].freeze |   ].freeze | ||||||
|  |  | ||||||
|   # List of allowed SPDX license names |   # List of allowed SPDX license names | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/CodeMirror
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/CodeMirror
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/CodeMirror updated: 900659feeb...0fb17df669
									
								
							
							
								
								
									
										22
									
								
								vendor/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/README.md
									
									
									
									
										vendored
									
									
								
							| @@ -77,7 +77,6 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | |||||||
| - **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:** [textmate/css.tmbundle](https://github.com/textmate/css.tmbundle) | ||||||
| - **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,8 +272,10 @@ 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) | ||||||
| - **Ren'Py:** [williamd1k0/language-renpy](https://github.com/williamd1k0/language-renpy) | - **Ren'Py:** [williamd1k0/language-renpy](https://github.com/williamd1k0/language-renpy) | ||||||
| @@ -285,11 +284,12 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | |||||||
| - **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 +341,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 +349,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 +362,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/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...374ebd6444
									
								
							
							
								
								
									
										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 6896ff2a72
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/atom-language-rust
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/atom-language-rust
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/atom-language-rust added at 2f514baad7
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/d.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/d.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/d.tmbundle updated: 039c92d9f2...d44b42bdb7
									
								
							
							
								
								
									
										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...71b8930b31
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-csound
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-csound
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-csound updated: 2f112c9f60...8f8668a38e
									
								
							
							
								
								
									
										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...31ec605571
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-less
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-less
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-less updated: c671f35467...ce6a54dd17
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-python
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-python
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-python updated: 14acf8da68...ceb204c654
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/language-shellscript
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/language-shellscript
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/language-shellscript updated: 77fd446cc1...3cd0b6bb5e
									
								
							
							
								
								
									
										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...6be651ae57
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/perl6fe
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/perl6fe
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/perl6fe deleted from 84aa57300b
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/reason
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/reason
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/reason added at 77ede65142
									
								
							
							
								
								
									
										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.. | ||||||
| @@ -1,10 +1,15 @@ | |||||||
| --- | --- | ||||||
| type: grammar | type: grammar | ||||||
| name: perl6fe | name: atom-language-perl6 | ||||||
| license: mit | license: mit | ||||||
| --- | --- | ||||||
|  | 
 | ||||||
|  | MIT License | ||||||
|  | 
 | ||||||
| Copyright (c) 2015 Jacob Russo | Copyright (c) 2015 Jacob Russo | ||||||
| 
 | 
 | ||||||
|  | Copyright (c) 2016 Samantha McVey <samantham@posteo.net> | ||||||
|  | 
 | ||||||
| Permission is hereby granted, free of charge, to any person obtaining | Permission is hereby granted, free of charge, to any person obtaining | ||||||
| a copy of this software and associated documentation files (the | a copy of this software and associated documentation files (the | ||||||
| "Software"), to deal in the Software without restriction, including | "Software"), to deal in the Software without restriction, including | ||||||
							
								
								
									
										26
									
								
								vendor/licenses/grammar/atom-language-rust.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/licenses/grammar/atom-language-rust.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | --- | ||||||
|  | type: grammar | ||||||
|  | name: atom-language-rust | ||||||
|  | license: mit | ||||||
|  | --- | ||||||
|  | The MIT License (MIT) | ||||||
|  | ===================== | ||||||
|  |  | ||||||
|  | Copyright © `2013` `Andreas Neuhaus` `http://zargony.com/` | ||||||
|  |  | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||||
|  | this software and associated documentation files (the “Software”), to deal in | ||||||
|  | the Software without restriction, including without limitation the rights to | ||||||
|  | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||||
|  | the Software, and to permit persons to whom the Software is furnished to do so, | ||||||
|  | subject to the following conditions: | ||||||
|  |  | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||||
|  | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||||
|  | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 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 THE SOFTWARE. | ||||||
							
								
								
									
										25
									
								
								vendor/licenses/grammar/language-hy.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/licenses/grammar/language-hy.txt
									
									
									
									
										vendored
									
									
								
							| @@ -1,25 +0,0 @@ | |||||||
| --- |  | ||||||
| type: grammar |  | ||||||
| name: language-hy |  | ||||||
| license: mit |  | ||||||
| --- |  | ||||||
| Copyright (c) 2014 Bob Tolbert (bob@tolbert.org) |  | ||||||
|  |  | ||||||
| Permission is hereby granted, free of charge, to any person obtaining |  | ||||||
| a copy of this software and associated documentation files (the |  | ||||||
| "Software"), to deal in the Software without restriction, including |  | ||||||
| without limitation the rights to use, copy, modify, merge, publish, |  | ||||||
| distribute, sublicense, and/or sell copies of the Software, and to |  | ||||||
| permit persons to whom the Software is furnished to do so, subject to |  | ||||||
| the following conditions: |  | ||||||
|  |  | ||||||
| The above copyright notice and this permission notice shall be |  | ||||||
| included in all copies or substantial portions of the Software. |  | ||||||
|  |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |  | ||||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |  | ||||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |  | ||||||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |  | ||||||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 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 THE SOFTWARE. |  | ||||||
							
								
								
									
										27
									
								
								vendor/licenses/grammar/language-xcompose.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/licenses/grammar/language-xcompose.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | --- | ||||||
|  | type: grammar | ||||||
|  | name: language-xcompose | ||||||
|  | license: mit | ||||||
|  | --- | ||||||
|  | The MIT License (MIT) | ||||||
|  |  | ||||||
|  | Copyright (c) 2016 Samantha McVey | ||||||
|  |  | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | 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 THE | ||||||
|  | SOFTWARE. | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								vendor/licenses/grammar/ninja.tmbundle.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/licenses/grammar/ninja.tmbundle.txt
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +0,0 @@ | |||||||
| --- |  | ||||||
| type: grammar |  | ||||||
| name: ninja.tmbundle |  | ||||||
| license: other |  | ||||||
| --- |  | ||||||
							
								
								
									
										35
									
								
								vendor/licenses/grammar/reason.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/licenses/grammar/reason.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | --- | ||||||
|  | type: grammar | ||||||
|  | name: reason | ||||||
|  | license: bsd-3-clause | ||||||
|  | --- | ||||||
|  | BSD License | ||||||
|  |  | ||||||
|  | For Reason software | ||||||
|  |  | ||||||
|  | Copyright (c) 2015-present, Facebook, Inc. All rights reserved. | ||||||
|  |  | ||||||
|  | Redistribution and use in source and binary forms, with or without modification, | ||||||
|  | are permitted provided that the following conditions are met: | ||||||
|  |  | ||||||
|  |  * Redistributions of source code must retain the above copyright notice, this | ||||||
|  |    list of conditions and the following disclaimer. | ||||||
|  |  | ||||||
|  |  * 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. | ||||||
|  |  | ||||||
|  |  * Neither the name Facebook 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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. | ||||||
		Reference in New Issue
	
	Block a user