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"]
|
||||
path = vendor/grammars/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"]
|
||||
path = vendor/grammars/sublime-befunge
|
||||
url = https://github.com/johanasplund/sublime-befunge
|
||||
@@ -255,7 +252,7 @@
|
||||
url = https://github.com/textmate/d.tmbundle
|
||||
[submodule "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"]
|
||||
path = vendor/grammars/dylan.tmbundle
|
||||
url = https://github.com/textmate/dylan.tmbundle
|
||||
@@ -443,9 +440,6 @@
|
||||
[submodule "vendor/grammars/Sublime-Nit"]
|
||||
path = vendor/grammars/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"]
|
||||
path = vendor/grammars/Racket
|
||||
url = https://github.com/soegaard/racket-highlight-for-github
|
||||
@@ -623,9 +617,6 @@
|
||||
[submodule "vendor/grammars/language-yang"]
|
||||
path = vendor/grammars/language-yang
|
||||
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"]
|
||||
path = vendor/grammars/language-less
|
||||
url = https://github.com/atom/language-less.git
|
||||
@@ -809,4 +800,18 @@
|
||||
[submodule "vendor/grammars/rascal-syntax-highlighting"]
|
||||
path = vendor/grammars/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
|
||||
|
||||
$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
||||
|
||||
require 'linguist'
|
||||
require 'rugged'
|
||||
require 'optparse'
|
||||
@@ -102,10 +104,16 @@ def git_linguist(args)
|
||||
commit = nil
|
||||
|
||||
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("--commit=COMMIT", "Commit to index") { |v| commit = v}
|
||||
opts.on("-c", "--commit=COMMIT", "Commit to index") { |v| commit = v}
|
||||
end
|
||||
|
||||
parser.parse!(args)
|
||||
|
||||
35
bin/linguist
35
bin/linguist
@@ -1,29 +1,37 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
# linguist — detect language type for a file, or, given a directory, determine language breakdown
|
||||
# usage: linguist <path> [<--breakdown>]
|
||||
#
|
||||
$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
||||
|
||||
require 'linguist'
|
||||
require 'rugged'
|
||||
require 'json'
|
||||
require 'optparse'
|
||||
|
||||
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"
|
||||
path = Dir.pwd
|
||||
breakdown = true
|
||||
elsif path == "--json"
|
||||
path = Dir.pwd
|
||||
json_breakdown = true
|
||||
end
|
||||
|
||||
ARGV.shift
|
||||
breakdown = true if ARGV[0] == "--breakdown"
|
||||
json_breakdown = true if ARGV[0] == "--json"
|
||||
|
||||
if File.directory?(path)
|
||||
rugged = Rugged::Repository.new(path)
|
||||
repo = Linguist::Repository.new(rugged, rugged.head.target_id)
|
||||
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
|
||||
percentage = ((size / repo.size.to_f) * 100)
|
||||
percentage = sprintf '%.2f' % percentage
|
||||
puts "%-7s %s" % ["#{percentage}%", language]
|
||||
if !json_breakdown
|
||||
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
|
||||
percentage = ((size / repo.size.to_f) * 100)
|
||||
percentage = sprintf '%.2f' % percentage
|
||||
puts "%-7s %s" % ["#{percentage}%", language]
|
||||
end
|
||||
end
|
||||
if breakdown
|
||||
puts
|
||||
@@ -35,6 +43,8 @@ if File.directory?(path)
|
||||
end
|
||||
puts
|
||||
end
|
||||
elsif json_breakdown
|
||||
puts JSON.dump(repo.breakdown_by_file)
|
||||
end
|
||||
elsif File.file?(path)
|
||||
blob = Linguist::FileBlob.new(path, Dir.pwd)
|
||||
@@ -63,5 +73,12 @@ elsif File.file?(path)
|
||||
puts " appears to be a vendored file"
|
||||
end
|
||||
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
|
||||
|
||||
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
||||
s.add_dependency 'charlock_holmes', '~> 0.7.3'
|
||||
s.add_dependency 'escape_utils', '~> 1.1.0'
|
||||
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 '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:
|
||||
- source.systemverilog
|
||||
- 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:
|
||||
- source.abnf
|
||||
vendor/grammars/Agda.tmbundle:
|
||||
@@ -113,7 +113,9 @@ vendor/grammars/SublimeBrainfuck:
|
||||
- source.bf
|
||||
vendor/grammars/SublimeClarion:
|
||||
- source.clarion
|
||||
vendor/grammars/SublimeGDB:
|
||||
vendor/grammars/SublimeEthereum:
|
||||
- source.solidity
|
||||
vendor/grammars/SublimeGDB/:
|
||||
- source.disasm
|
||||
- source.gdb
|
||||
- source.gdb.session
|
||||
@@ -178,8 +180,15 @@ vendor/grammars/atom-language-1c-bsl:
|
||||
- source.sdbl
|
||||
vendor/grammars/atom-language-clean:
|
||||
- source.clean
|
||||
vendor/grammars/atom-language-perl6:
|
||||
- source.meta-info
|
||||
- source.perl6fe
|
||||
- source.quoting.perl6fe
|
||||
- source.regexp.perl6fe
|
||||
vendor/grammars/atom-language-purescript:
|
||||
- source.purescript
|
||||
vendor/grammars/atom-language-rust:
|
||||
- source.rust
|
||||
vendor/grammars/atom-language-srt:
|
||||
- text.srt
|
||||
vendor/grammars/atom-language-stan:
|
||||
@@ -384,8 +393,6 @@ vendor/grammars/language-haskell:
|
||||
- source.haskell
|
||||
- source.hsc2hs
|
||||
- text.tex.latex.haskell
|
||||
vendor/grammars/language-hy:
|
||||
- source.hy
|
||||
vendor/grammars/language-inform7:
|
||||
- source.inform7
|
||||
vendor/grammars/language-javascript:
|
||||
@@ -436,6 +443,8 @@ vendor/grammars/language-wavefront:
|
||||
- source.wavefront.obj
|
||||
vendor/grammars/language-xbase:
|
||||
- source.harbour
|
||||
vendor/grammars/language-xcompose:
|
||||
- config.xcompose
|
||||
vendor/grammars/language-yaml:
|
||||
- source.yaml
|
||||
vendor/grammars/language-yang:
|
||||
@@ -513,10 +522,6 @@ vendor/grammars/pawn-sublime-language:
|
||||
vendor/grammars/perl.tmbundle:
|
||||
- source.perl
|
||||
- source.perl.6
|
||||
vendor/grammars/perl6fe:
|
||||
- source.meta-info
|
||||
- source.perl6fe
|
||||
- source.regexp.perl6fe
|
||||
vendor/grammars/php-smarty.tmbundle:
|
||||
- text.html.smarty
|
||||
vendor/grammars/php.tmbundle:
|
||||
@@ -541,6 +546,8 @@ vendor/grammars/r.tmbundle:
|
||||
- text.tex.latex.rd
|
||||
vendor/grammars/rascal-syntax-highlighting:
|
||||
- source.rascal
|
||||
vendor/grammars/reason:
|
||||
- source.reason
|
||||
vendor/grammars/ruby-slim.tmbundle:
|
||||
- text.slim
|
||||
vendor/grammars/ruby.tmbundle:
|
||||
@@ -608,8 +615,6 @@ vendor/grammars/sublime-rexx:
|
||||
- source.rexx
|
||||
vendor/grammars/sublime-robot-plugin:
|
||||
- text.robot
|
||||
vendor/grammars/sublime-rust:
|
||||
- source.rust
|
||||
vendor/grammars/sublime-spintools:
|
||||
- source.regexp.spin
|
||||
- source.spin
|
||||
|
||||
@@ -3,7 +3,7 @@ module Linguist
|
||||
# Public: Is the blob a generated file?
|
||||
#
|
||||
# name - String filename
|
||||
# data - String blob data. A block also maybe passed in for lazy
|
||||
# data - String blob data. A block also may be passed in for lazy
|
||||
# loading. This behavior is deprecated and you should always
|
||||
# pass in a String.
|
||||
#
|
||||
@@ -70,6 +70,7 @@ module Linguist
|
||||
compiled_cython_file? ||
|
||||
generated_go? ||
|
||||
generated_protocol_buffer? ||
|
||||
generated_javascript_protocol_buffer? ||
|
||||
generated_apache_thrift? ||
|
||||
generated_jni_header? ||
|
||||
vcr_cassette? ||
|
||||
@@ -77,7 +78,9 @@ module Linguist
|
||||
generated_unity3d_meta? ||
|
||||
generated_racc? ||
|
||||
generated_jflex? ||
|
||||
generated_grammarkit?
|
||||
generated_grammarkit? ||
|
||||
generated_roxygen2? ||
|
||||
generated_jison?
|
||||
end
|
||||
|
||||
# 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!")
|
||||
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']
|
||||
|
||||
# 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)/)
|
||||
end
|
||||
|
||||
# Internal: Is the blob a generated npm shrinkwrap file.
|
||||
# Internal: Is the blob a generated npm shrinkwrap file?
|
||||
#
|
||||
# Returns true or false.
|
||||
def npm_shrinkwrap?
|
||||
@@ -333,7 +347,7 @@ module Linguist
|
||||
!!name.match(/composer\.lock/)
|
||||
end
|
||||
|
||||
# Internal: Is the blob a generated by Zephir
|
||||
# Internal: Is the blob generated by Zephir?
|
||||
#
|
||||
# Returns true or false.
|
||||
def generated_by_zephir?
|
||||
@@ -433,5 +447,37 @@ module Linguist
|
||||
return false unless lines.count > 1
|
||||
return lines[0].start_with?("// This is a generated file. Not intended for manual editing.")
|
||||
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
|
||||
|
||||
@@ -326,7 +326,7 @@ module Linguist
|
||||
end
|
||||
|
||||
disambiguate ".pl" do |data|
|
||||
if /^[^#]+:-/.match(data)
|
||||
if /^[^#]*:-/.match(data)
|
||||
Language["Prolog"]
|
||||
elsif /use strict|use\s+v?5\./.match(data)
|
||||
Language["Perl"]
|
||||
|
||||
@@ -265,7 +265,7 @@ module Linguist
|
||||
@color = attributes[:color]
|
||||
|
||||
# Set aliases
|
||||
@aliases = [default_alias_name] + (attributes[:aliases] || [])
|
||||
@aliases = [default_alias] + (attributes[:aliases] || [])
|
||||
|
||||
# Load the TextMate scope name or try to guess one
|
||||
@tm_scope = attributes[:tm_scope] || begin
|
||||
@@ -283,9 +283,6 @@ module Linguist
|
||||
@codemirror_mime_type = attributes[:codemirror_mime_type]
|
||||
@wrap = attributes[:wrap] || false
|
||||
|
||||
# Set legacy search term
|
||||
@search_term = attributes[:search_term] || default_alias_name
|
||||
|
||||
# Set the language_id
|
||||
@language_id = attributes[:language_id]
|
||||
|
||||
@@ -437,12 +434,13 @@ module Linguist
|
||||
EscapeUtils.escape_url(name).gsub('+', '%20')
|
||||
end
|
||||
|
||||
# Internal: Get default alias name
|
||||
# Public: Get default alias name
|
||||
#
|
||||
# Returns the alias name String
|
||||
def default_alias_name
|
||||
def default_alias
|
||||
name.downcase.gsub(/\s/, '-')
|
||||
end
|
||||
alias_method :default_alias_name, :default_alias
|
||||
|
||||
# Public: Get Language group
|
||||
#
|
||||
@@ -557,7 +555,6 @@ module Linguist
|
||||
:wrap => options['wrap'],
|
||||
:group_name => options['group'],
|
||||
:searchable => options.fetch('searchable', true),
|
||||
:search_term => options['search_term'],
|
||||
:language_id => options['language_id'],
|
||||
:extensions => Array(options['extensions']),
|
||||
:interpreters => options['interpreters'].sort,
|
||||
|
||||
@@ -499,6 +499,7 @@ C++:
|
||||
- ".inc"
|
||||
- ".inl"
|
||||
- ".ipp"
|
||||
- ".re"
|
||||
- ".tcc"
|
||||
- ".tpp"
|
||||
language_id: 43
|
||||
@@ -1120,6 +1121,7 @@ Emacs Lisp:
|
||||
- ".gnus"
|
||||
- ".spacemacs"
|
||||
- ".viper"
|
||||
- Cask
|
||||
- Project.ede
|
||||
- _emacs
|
||||
- abbrev_defs
|
||||
@@ -1384,6 +1386,14 @@ Game Maker Language:
|
||||
codemirror_mode: clike
|
||||
codemirror_mime_type: text/x-c++src
|
||||
language_id: 125
|
||||
Genie:
|
||||
type: programming
|
||||
ace_mode: text
|
||||
extensions:
|
||||
- ".gs"
|
||||
color: "#fb855d"
|
||||
tm_scope: none
|
||||
language_id: 792408528
|
||||
Genshi:
|
||||
type: programming
|
||||
extensions:
|
||||
@@ -1754,7 +1764,7 @@ Hy:
|
||||
- ".hy"
|
||||
aliases:
|
||||
- hylang
|
||||
tm_scope: source.hy
|
||||
tm_scope: none
|
||||
language_id: 159
|
||||
HyPhy:
|
||||
type: programming
|
||||
@@ -3548,6 +3558,19 @@ Raw token data:
|
||||
tm_scope: none
|
||||
ace_mode: text
|
||||
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:
|
||||
type: programming
|
||||
color: "#358a5b"
|
||||
@@ -3790,6 +3813,7 @@ SQL:
|
||||
- ".cql"
|
||||
- ".ddl"
|
||||
- ".inc"
|
||||
- ".mysql"
|
||||
- ".prc"
|
||||
- ".tab"
|
||||
- ".udf"
|
||||
@@ -4276,10 +4300,13 @@ Text:
|
||||
- COPYING
|
||||
- FONTLOG
|
||||
- INSTALL
|
||||
- INSTALL.mysql
|
||||
- LICENSE
|
||||
- LICENSE.mysql
|
||||
- NEWS
|
||||
- README.1ST
|
||||
- README.me
|
||||
- README.mysql
|
||||
- click.me
|
||||
- delete.me
|
||||
- keep.me
|
||||
@@ -4566,6 +4593,15 @@ XC:
|
||||
codemirror_mode: clike
|
||||
codemirror_mime_type: text/x-csrc
|
||||
language_id: 398
|
||||
XCompose:
|
||||
type: data
|
||||
filenames:
|
||||
- ".XCompose"
|
||||
- "XCompose"
|
||||
- "xcompose"
|
||||
tm_scope: 'config.xcompose'
|
||||
ace_mode: text
|
||||
language_id: 225167241
|
||||
XML:
|
||||
type: data
|
||||
ace_mode: xml
|
||||
@@ -4759,6 +4795,7 @@ YAML:
|
||||
- ".syntax"
|
||||
- ".yaml"
|
||||
- ".yaml-tmlanguage"
|
||||
- ".yml.mysql"
|
||||
filenames:
|
||||
- ".clang-format"
|
||||
ace_mode: yaml
|
||||
|
||||
@@ -238,6 +238,12 @@
|
||||
# BuddyBuild
|
||||
- BuddyBuildSDK.framework/
|
||||
|
||||
# Realm
|
||||
- Realm.framework
|
||||
|
||||
# RealmSwift
|
||||
- RealmSwift.framework
|
||||
|
||||
# git config files
|
||||
- gitattributes$
|
||||
- gitignore$
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Linguist
|
||||
VERSION = "5.0.0"
|
||||
VERSION = "5.0.1"
|
||||
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}"
|
||||
`git submodule deinit #{repo_old}`
|
||||
`git rm -rf #{repo_old}`
|
||||
`script/convert-grammars`
|
||||
end
|
||||
|
||||
log "Registering new submodule: #{repo_new}"
|
||||
@@ -92,7 +93,11 @@ exit 1 if $?.exitstatus > 0
|
||||
`script/convert-grammars --add #{repo_new}`
|
||||
|
||||
log "Confirming license"
|
||||
`script/licensed --module "#{repo_new}"`
|
||||
if repo_old
|
||||
`script/licensed`
|
||||
else
|
||||
`script/licensed --module "#{repo_new}"`
|
||||
end
|
||||
|
||||
log "Updating grammar documentation in vendor/REAEDME.md"
|
||||
`bundle exec rake samples`
|
||||
|
||||
@@ -174,6 +174,7 @@ end
|
||||
def load_grammars(tmp_dir, source, all_scopes)
|
||||
is_url = source.start_with?("http:", "https:")
|
||||
return [] if is_url && !$options[:remote]
|
||||
return [] if !is_url && !File.exist?(source)
|
||||
|
||||
p = if !is_url
|
||||
if File.directory?(source)
|
||||
|
||||
@@ -71,7 +71,7 @@ class GrammarList
|
||||
when "https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz"
|
||||
short_url = "bitbucket: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"
|
||||
long_url = "https://genshi.edgewall.org/query"
|
||||
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/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
|
||||
assert sample_blob_memory("C++/protocol-buffer.pb.h").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("Go/api.pb.go").generated?
|
||||
assert sample_blob_memory("Go/embedded.go").generated?
|
||||
assert sample_blob_memory("JavaScript/proto.js").generated?
|
||||
|
||||
# Apache Thrift generated code
|
||||
assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated?
|
||||
|
||||
@@ -87,5 +87,8 @@ class TestGenerated < Minitest::Test
|
||||
|
||||
# GrammarKit
|
||||
generated_sample_loading_data("Java/GrammarKit.java")
|
||||
|
||||
# roxygen2
|
||||
generated_sample_loading_data("R/import.Rd")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -21,7 +21,7 @@ class TestGrammars < Minitest::Test
|
||||
"b5432a1e1055de7eeede2dddf91e009480651fd6", # jasmin-sublime
|
||||
"74143c4d2a5649eb179105afcb37f466558c22ce", # language-clojure
|
||||
"760471435f5ab0b9dc99a628203cd8f9156d28ce", # language-coffee-script
|
||||
"330e6d465e26bdd232aafcd3f5dba6a1d098a20e", # language-csharp
|
||||
"94fbd554ec1837fb7c508fd7425326639c3f4103", # language-csharp
|
||||
"70fb557a431891c2d634c33fa7367feab5066fd6", # language-javascript
|
||||
"e0528c23cd967f999e058f1408ccb5b7237daaba", # language-python
|
||||
"8653305b358375d0fced85dc24793b99919b11ef", # language-shellscript
|
||||
@@ -36,11 +36,12 @@ class TestGrammars < Minitest::Test
|
||||
"c78ec142ac3126cf639cfd67bd646ed8226d8b74", # atom-language-purescript
|
||||
"341d7f66806fc41d081133d6e51ade856352e056", # FreeMarker.tmbundle
|
||||
"15a394f6bc43400946570b299aee8ae264a1e3ff", # language-renpy
|
||||
"c9118c370411f2f049c746c0fd096554e877aea2", # perl6fe
|
||||
"8ccf886749c32fb7e65d4d1316a7ed0479c93dc9", # language-less
|
||||
"2f03492b52d7dd83b4e7472f01b87c6121e5b1a4", # monkey
|
||||
"241e5ddbb4423d792216783e9f668bd670b026e4", # ant.tmbundle
|
||||
"bdab9fdc21e6790b479ccb5945b78bc0f6ce2493" # language-blade
|
||||
"bdab9fdc21e6790b479ccb5945b78bc0f6ce2493", # language-blade
|
||||
"81711c69aa40135de7266c88b2f6ab28dbc1d81e", # atom-language-perl6
|
||||
"808e27f5e44167113198d277f47926c5d482eac8" # atom-language-rust
|
||||
].freeze
|
||||
|
||||
# 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 Score:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound)
|
||||
- **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)
|
||||
- **Cycript:** [atom/language-javascript](https://github.com/atom/language-javascript)
|
||||
- **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)
|
||||
- **fish:** [l15n/fish-tmbundle](https://github.com/l15n/fish-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)
|
||||
- **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)
|
||||
- **Game Maker Language:** [textmate/c.tmbundle](https://github.com/textmate/c.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)
|
||||
- **GDB:** [quarnster/SublimeGDB](https://github.com/quarnster/SublimeGDB)
|
||||
- **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 Eclass:** [atom/language-shellscript](https://github.com/atom/language-shellscript)
|
||||
- **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)
|
||||
- **Glyph:** [textmate/tcl.tmbundle](https://github.com/textmate/tcl.tmbundle)
|
||||
- **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)
|
||||
- **GraphQL:** [rmosolgo/language-graphql](https://github.com/rmosolgo/language-graphql)
|
||||
- **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 Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.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+PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle)
|
||||
- **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)
|
||||
- **Idris:** [idris-hackers/idris-sublime](https://github.com/idris-hackers/idris-sublime)
|
||||
- **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 ROOT:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle)
|
||||
- **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)
|
||||
- **Java:** [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)
|
||||
- **NewLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle)
|
||||
- **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)
|
||||
- **Nit:** [R4PaSs/Sublime-Nit](https://github.com/R4PaSs/Sublime-Nit)
|
||||
- **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)
|
||||
- **PAWN:** [Southclaw/pawn-sublime-language](https://github.com/Southclaw/pawn-sublime-language)
|
||||
- **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)
|
||||
- **Pic:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff)
|
||||
- **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)
|
||||
- **Propeller Spin:** [bitbased/sublime-spintools](https://github.com/bitbased/sublime-spintools)
|
||||
- **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)
|
||||
- **PureScript:** [purescript-contrib/atom-language-purescript](https://github.com/purescript-contrib/atom-language-purescript)
|
||||
- **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)
|
||||
- **Racket:** [soegaard/racket-highlight-for-github](https://github.com/soegaard/racket-highlight-for-github)
|
||||
- **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)
|
||||
- **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)
|
||||
- **Red:** [Oldes/Sublime-Red](https://github.com/Oldes/Sublime-Red)
|
||||
- **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)
|
||||
- **RMarkdown:** [atom/language-gfm](https://github.com/atom/language-gfm)
|
||||
- **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)
|
||||
- **RPM Spec:** [waveclaw/language-rpm-spec](https://github.com/waveclaw/language-rpm-spec)
|
||||
- **Ruby:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle)
|
||||
- **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)
|
||||
- **SaltStack:** [saltstack/atom-salt](https://github.com/saltstack/atom-salt)
|
||||
- **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)
|
||||
- **Unified Parallel C:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle)
|
||||
- **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)
|
||||
- **UnrealScript:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle)
|
||||
- **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)
|
||||
- **Verilog:** [textmate/verilog.tmbundle](https://github.com/textmate/verilog.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)
|
||||
- **Volt:** [textmate/d.tmbundle](https://github.com/textmate/d.tmbundle)
|
||||
- **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)
|
||||
- **xBase:** [hernad/atom-language-harbour](https://github.com/hernad/atom-language-harbour)
|
||||
- **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)
|
||||
- **Xojo:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax)
|
||||
- **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
|
||||
name: sublime-rust
|
||||
name: SublimeEthereum
|
||||
license: mit
|
||||
---
|
||||
Copyright (c) 2015+ uniqpath
|
||||
|
||||
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
|
||||
@@ -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
|
||||
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.
|
||||
THE SOFTWARE..
|
||||
@@ -1,10 +1,15 @@
|
||||
---
|
||||
type: grammar
|
||||
name: perl6fe
|
||||
name: atom-language-perl6
|
||||
license: mit
|
||||
---
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2015 Jacob Russo
|
||||
|
||||
Copyright (c) 2016 Samantha McVey <samantham@posteo.net>
|
||||
|
||||
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
|
||||
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