mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			216 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | a4d12cc8e4 | ||
|  | a1165b74b1 | ||
|  | 0fa1fa5581 | ||
|  | d8b91bd5c4 | ||
|  | 9b941a34f0 | ||
|  | 9d8392dab8 | ||
|  | 2c78dd2c66 | ||
|  | 3988f3e7a7 | ||
|  | d9a4e831b4 | ||
|  | 45c27f26a2 | ||
|  | 0fbc29bf68 | ||
|  | 5569d2056d | ||
|  | be262d0b4f | ||
|  | 33ce2d7264 | ||
|  | c486f56204 | ||
|  | 9f3b7d0ba5 | ||
|  | 79f20e8057 | ||
|  | cd30c7613c | ||
|  | 5aa53c0711 | ||
|  | c17cdca896 | ||
|  | ecdae83364 | ||
|  | 31aafa2c78 | ||
|  | 8a911b8ff3 | ||
|  | 9233f1d17f | ||
|  | 77eb36a982 | ||
|  | 4e6e58a099 | ||
|  | c87976330f | ||
|  | 0e9109c3fc | ||
|  | 12f9295dd7 | ||
|  | 581723748b | ||
|  | 0980e304b1 | ||
|  | d46a529b6a | ||
|  | 1d2ec4dbc3 | ||
|  | 829eea0139 | ||
|  | 78b2853d70 | ||
|  | 202f3c08cd | ||
|  | b958779e3d | ||
|  | 00dc775daf | ||
|  | 009a4e67b6 | ||
|  | faaa4470af | ||
|  | 2a320cb988 | ||
|  | 74931d1bd5 | ||
|  | 3ca93a84b9 | ||
|  | aa27f18ea6 | ||
|  | d3e2ea3f71 | ||
|  | 53aa1209ab | ||
|  | b2a486fed2 | ||
|  | 4f1e5c34b1 | ||
|  | 85c9833081 | ||
|  | 33899b9d6b | ||
|  | 417239004a | ||
|  | 6a1423d28f | ||
|  | 96a23ce388 | ||
|  | e8d7eed3aa | ||
|  | 9d419c4ab9 | ||
|  | 4eefc1f58e | ||
|  | 0b94b9cda7 | ||
|  | c736038d94 | ||
|  | ec562138f8 | ||
|  | 50013e8dd7 | ||
|  | 416c5d1185 | ||
|  | 8869912d31 | ||
|  | 43fa563b77 | ||
|  | 41c6aee8c3 | ||
|  | 8cf575c37d | ||
|  | 4e20928e04 | ||
|  | 3e37bd2680 | ||
|  | a29f5b2d46 | ||
|  | 4efc6f8c95 | ||
|  | 359699c454 | ||
|  | 346aa99fcf | ||
|  | d147778677 | ||
|  | e520209e49 | ||
|  | 338cc16239 | ||
|  | 67ea35094b | ||
|  | 6f0393fcbd | ||
|  | 2923d50d7e | ||
|  | 4e26f609ef | ||
|  | e86d6e8dd2 | ||
|  | 5fa02ad1fb | ||
|  | 5a06240f69 | ||
|  | d6e0f74c80 | ||
|  | a5c08bb203 | ||
|  | c6dc29abb1 | ||
|  | ffd984bb7e | ||
|  | dc5473559b | ||
|  | 8e9c224952 | ||
|  | d43f111723 | ||
|  | de9ff713a4 | ||
|  | 98783560ec | ||
|  | 8f31fbbd55 | ||
|  | e4cdbd2b2b | ||
|  | ba52e48ceb | ||
|  | a44ebe493b | ||
|  | eb0e75e11e | ||
|  | 22c2cf4967 | ||
|  | 39e3688fb8 | ||
|  | 6b83e5fb7b | ||
|  | dd2e5ffe07 | ||
|  | f6b6c4e165 | ||
|  | 608ed60b5c | ||
|  | 2ce2945058 | ||
|  | c8d376754e | ||
|  | ecaef91fa1 | ||
|  | d265b78e7e | ||
|  | 5a5bf7d5e5 | ||
|  | e46781b903 | ||
|  | 9543a8c8e9 | ||
|  | 6ac1ac9232 | ||
|  | 1bbb919fef | ||
|  | 71dfed0e45 | ||
|  | a2db058ce4 | ||
|  | 12695fee2f | ||
|  | 4a775dca37 | ||
|  | d7c689fd6b | ||
|  | 20b8188384 | ||
|  | 26310d9515 | ||
|  | e38cc75da5 | ||
|  | 8d55fc1bd5 | ||
|  | 7e63399196 | ||
|  | 520e5a5cfe | ||
|  | 5d85692c24 | ||
|  | 676861fff3 | ||
|  | 6589bd9dc7 | ||
|  | e32a4f13ef | ||
|  | 4e4d851f71 | ||
|  | a3628f86da | ||
|  | fe70965906 | ||
|  | c863435c84 | ||
|  | eeec48198a | ||
|  | 82167063da | ||
|  | 3ae89b48ba | ||
|  | cd9401c424 | ||
|  | e7e8a7d835 | ||
|  | 7654032d2e | ||
|  | 05b536fc61 | ||
|  | ebe85788ab | ||
|  | 524337d07b | ||
|  | f8ce42e169 | ||
|  | 71032cd252 | ||
|  | 41593b3ea7 | ||
|  | bed8add2f5 | ||
|  | e424e8e88c | ||
|  | 07d4f218a3 | ||
|  | 67ed060d37 | ||
|  | 3abe081560 | ||
|  | d3f3c0345c | ||
|  | 855f1a1f86 | ||
|  | 0406a5b326 | ||
|  | 0108ef4386 | ||
|  | daefff86ff | ||
|  | fdb962518f | ||
|  | 6564078061 | ||
|  | 39ea9be5f8 | ||
|  | 152b5ade5e | ||
|  | c525e3fbef | ||
|  | 88c74fa9c2 | ||
|  | 6a54ee767f | ||
|  | 2ea1ff2736 | ||
|  | a1901fceff | ||
|  | b4035a3804 | ||
|  | fc67fc525c | ||
|  | f0659d3aa5 | ||
|  | a7a123a8db | ||
|  | 0e5327a77a | ||
|  | ecd4ae3bda | ||
|  | 7a8bd628e1 | ||
|  | 8e19aea39e | ||
|  | 6fcba83f3e | ||
|  | d6d7d38eb8 | ||
|  | c8094d3775 | ||
|  | de478d2f2d | ||
|  | 991dcef18b | ||
|  | f30e9270f1 | ||
|  | 1d7ba18b15 | ||
|  | 35a06d6cb8 | ||
|  | 4cf7feb275 | ||
|  | 30298a9ef8 | ||
|  | cc5f1c57ca | ||
|  | 82af10e3fd | ||
|  | 63c8d2284c | ||
|  | 697380336c | ||
|  | 5fd8d71858 | ||
|  | 5bc88814e2 | ||
|  | 00efd6a463 | ||
|  | 81ca6e7766 | ||
|  | cd288a8ee4 | ||
|  | a8d84f3d55 | ||
|  | 600115afed | ||
|  | e57273c839 | ||
|  | 65491d460e | ||
|  | abf7bee464 | ||
|  | e73a4ecd0e | ||
|  | 70779c9986 | ||
|  | b61fe90d12 | ||
|  | e6c849d92c | ||
|  | 22d4865c52 | ||
|  | 3247d46e81 | ||
|  | be316c2943 | ||
|  | 68c45be47d | ||
|  | 4584963dd2 | ||
|  | f382abc2f3 | ||
|  | 9d57e1e1b5 | ||
|  | 2a4150b104 | ||
|  | 09612ae42e | ||
|  | 49e9ee48d0 | ||
|  | a8719f3e82 | ||
|  | 00647be113 | ||
|  | 48b64c2d31 | ||
|  | f95365946c | ||
|  | b056df06f4 | ||
|  | 6bf223e641 | ||
|  | fa817b6a1d | ||
|  | 789607d9bc | ||
|  | d46530989c | ||
|  | 3c5bcb434c | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,6 @@ | ||||
| /Gemfile.lock | ||||
| .bundle/ | ||||
| .idea | ||||
| benchmark/ | ||||
| lib/linguist/samples.json | ||||
| /grammars | ||||
|   | ||||
							
								
								
									
										49
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										49
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -22,9 +22,9 @@ | ||||
| [submodule "vendor/grammars/Sublime-REBOL"] | ||||
| 	path = vendor/grammars/Sublime-REBOL | ||||
| 	url = https://github.com/Oldes/Sublime-REBOL | ||||
| [submodule "vendor/grammars/Sublime-VimL"] | ||||
| 	path = vendor/grammars/Sublime-VimL | ||||
| 	url = https://github.com/SalGnt/Sublime-VimL | ||||
| [submodule "vendor/grammars/language-viml"] | ||||
| 	path = vendor/grammars/language-viml | ||||
| 	url = https://github.com/Alhadis/language-viml | ||||
| [submodule "vendor/grammars/ColdFusion"] | ||||
| 	path = vendor/grammars/ColdFusion | ||||
| 	url = https://github.com/SublimeText/ColdFusion | ||||
| @@ -202,9 +202,6 @@ | ||||
| [submodule "vendor/grammars/sublime-robot-plugin"] | ||||
| 	path = vendor/grammars/sublime-robot-plugin | ||||
| 	url = https://github.com/shellderp/sublime-robot-plugin | ||||
| [submodule "vendor/grammars/actionscript3-tmbundle"] | ||||
| 	path = vendor/grammars/actionscript3-tmbundle | ||||
| 	url = https://github.com/honzabrecka/actionscript3-tmbundle | ||||
| [submodule "vendor/grammars/Sublime-QML"] | ||||
| 	path = vendor/grammars/Sublime-QML | ||||
| 	url = https://github.com/skozlovf/Sublime-QML | ||||
| @@ -328,9 +325,6 @@ | ||||
| [submodule "vendor/grammars/nemerle.tmbundle"] | ||||
| 	path = vendor/grammars/nemerle.tmbundle | ||||
| 	url = https://github.com/textmate/nemerle.tmbundle | ||||
| [submodule "vendor/grammars/ninja.tmbundle"] | ||||
| 	path = vendor/grammars/ninja.tmbundle | ||||
| 	url = https://github.com/textmate/ninja.tmbundle | ||||
| [submodule "vendor/grammars/objective-c.tmbundle"] | ||||
| 	path = vendor/grammars/objective-c.tmbundle | ||||
| 	url = https://github.com/textmate/objective-c.tmbundle | ||||
| @@ -358,9 +352,6 @@ | ||||
| [submodule "vendor/grammars/r.tmbundle"] | ||||
| 	path = vendor/grammars/r.tmbundle | ||||
| 	url = https://github.com/textmate/r.tmbundle | ||||
| [submodule "vendor/grammars/ruby-haml.tmbundle"] | ||||
| 	path = vendor/grammars/ruby-haml.tmbundle | ||||
| 	url = https://github.com/textmate/ruby-haml.tmbundle | ||||
| [submodule "vendor/grammars/scheme.tmbundle"] | ||||
| 	path = vendor/grammars/scheme.tmbundle | ||||
| 	url = https://github.com/textmate/scheme.tmbundle | ||||
| @@ -779,9 +770,6 @@ | ||||
| [submodule "vendor/grammars/vhdl"] | ||||
| 	path = vendor/grammars/vhdl | ||||
| 	url = https://github.com/textmate/vhdl.tmbundle | ||||
| [submodule "vendor/grammars/xquery"] | ||||
| 	path = vendor/grammars/xquery | ||||
| 	url = https://github.com/textmate/xquery.tmbundle | ||||
| [submodule "vendor/grammars/language-rpm-spec"] | ||||
| 	path = vendor/grammars/language-rpm-spec | ||||
| 	url = https://github.com/waveclaw/language-rpm-spec | ||||
| @@ -791,3 +779,34 @@ | ||||
| [submodule "vendor/grammars/language-babel"] | ||||
| 	path = vendor/grammars/language-babel | ||||
| 	url = https://github.com/github-linguist/language-babel | ||||
| [submodule "vendor/CodeMirror"] | ||||
| 	path = vendor/CodeMirror | ||||
| 	url = https://github.com/codemirror/CodeMirror | ||||
| [submodule "vendor/grammars/MQL5-sublime"] | ||||
| 	path = vendor/grammars/MQL5-sublime | ||||
| 	url = https://github.com/mqsoft/MQL5-sublime | ||||
| [submodule "vendor/grammars/actionscript3-tmbundle"] | ||||
| 	path = vendor/grammars/actionscript3-tmbundle | ||||
| 	url = https://github.com/simongregory/actionscript3-tmbundle | ||||
| [submodule "vendor/grammars/ABNF.tmbundle"] | ||||
| 	path = vendor/grammars/ABNF.tmbundle | ||||
| 	url = https://github.com/sanssecours/ABNF.tmbundle | ||||
| [submodule "vendor/grammars/EBNF.tmbundle"] | ||||
| 	path = vendor/grammars/EBNF.tmbundle | ||||
| 	url = https://github.com/sanssecours/EBNF.tmbundle | ||||
| [submodule "vendor/grammars/language-haml"] | ||||
| 	path = vendor/grammars/language-haml | ||||
| 	url = https://github.com/ezekg/language-haml | ||||
| [submodule "vendor/grammars/language-ninja"] | ||||
| 	path = vendor/grammars/language-ninja | ||||
| 	url = https://github.com/khyo/language-ninja | ||||
| [submodule "vendor/grammars/language-fontforge"] | ||||
| 	path = vendor/grammars/language-fontforge | ||||
| 	url = https://github.com/Alhadis/language-fontforge | ||||
| [submodule "vendor/grammars/language-gn"] | ||||
| 	path = vendor/grammars/language-gn | ||||
| 	url = https://github.com/devoncarew/language-gn | ||||
| [submodule "vendor/grammars/rascal-syntax-highlighting"] | ||||
| 	path = vendor/grammars/rascal-syntax-highlighting | ||||
| 	url = https://github.com/usethesource/rascal-syntax-highlighting | ||||
|  | ||||
|   | ||||
| @@ -17,7 +17,7 @@ To add support for a new extension: | ||||
| In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken: | ||||
|  | ||||
| 0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files. | ||||
| 0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help. | ||||
|  | ||||
|  | ||||
| @@ -27,19 +27,16 @@ We try only to add languages once they have some usage on GitHub. In most cases | ||||
|  | ||||
| To add support for a new language: | ||||
|  | ||||
| 0. Add an entry for your language to [`languages.yml`][languages]. | ||||
| 0. Add a grammar for your language. Please only add grammars that have [one of these licenses](https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11). | ||||
|   0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`. | ||||
|   0. Add your grammar to [`grammars.yml`][grammars] by running `script/convert-grammars --add vendor/grammars/MyGrammar`. | ||||
|   0. Download the license for the grammar: `script/licensed`. Be careful to only commit the file for the new grammar, as this script may update licenses for other grammars as well. | ||||
| 0. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now. | ||||
| 0. Add a grammar for your language: `script/add-grammar https://github.com/JaneSmith/MyGrammar`. Please only add grammars that have [one of these licenses][licenses]. | ||||
| 0. Add samples for your language to the [samples directory][samples] in the correct subdirectory. | ||||
| 0. Add a `language_id` for your language. See `script/set-language-ids` for more information. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:** | ||||
| 0. Add a `language_id` for your language using `script/set-language-ids`. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:** | ||||
| 0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage. | ||||
|  | ||||
| In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken: | ||||
|  | ||||
| 0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files. | ||||
| 0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help. | ||||
|  | ||||
| Remember, the goal here is to try and avoid false positives! | ||||
| @@ -82,9 +79,14 @@ Here's our current build status: [ | ||||
| - @larsbrinkhoff | ||||
| - @pchaigno | ||||
| - **@Alhadis** | ||||
| - **@arfon** | ||||
| - **@brandonblack** (GitHub staff) | ||||
| - **@larsbrinkhoff** | ||||
| - **@lildude** (GitHub staff) | ||||
| - **@lizzhale** (GitHub staff) | ||||
| - **@mikemcquaid** (GitHub staff) | ||||
| - **@pchaigno** | ||||
|  | ||||
| As Linguist is a production dependency for GitHub we have a couple of workflow restrictions: | ||||
|  | ||||
| @@ -113,5 +115,6 @@ If you are the current maintainer of this gem: | ||||
|  | ||||
| [grammars]: /grammars.yml | ||||
| [languages]: /lib/linguist/languages.yml | ||||
| [licenses]: https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11 | ||||
| [samples]: /samples | ||||
| [new-issue]: https://github.com/github/linguist/issues/new | ||||
|   | ||||
| @@ -20,6 +20,12 @@ The Language stats bar displays languages percentages for the files in the repos | ||||
| 0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful. | ||||
| 0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified. | ||||
|  | ||||
| ### There's a problem with the syntax highlighting of a file | ||||
|  | ||||
| Linguist detects the language of a file but the actual syntax-highlighting is powered by a set of language grammars which are included in this project as a set of submodules [and may be found here](https://github.com/github/linguist/blob/master/vendor/README.md). | ||||
|  | ||||
| If you experience an issue with the syntax-highlighting on GitHub, **please report the issue to the upstream grammar repository, not here.** Grammars are updated every time we build the Linguist gem and so upstream bug fixes are automatically incorporated as they are fixed. | ||||
|  | ||||
| ## Overrides | ||||
|  | ||||
| Linguist supports a number of different custom overrides strategies for language definitions and vendored paths. | ||||
|   | ||||
| @@ -26,6 +26,5 @@ Gem::Specification.new do |s| | ||||
|   s.add_development_dependency 'yajl-ruby' | ||||
|   s.add_development_dependency 'color-proximity', '~> 0.2.1' | ||||
|   s.add_development_dependency 'licensed' | ||||
|   s.add_development_dependency 'licensee', '>= 8.3.0' | ||||
|  | ||||
|   s.add_development_dependency 'licensee', '>= 8.6.0' | ||||
| end | ||||
|   | ||||
							
								
								
									
										31
									
								
								grammars.yml
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								grammars.yml
									
									
									
									
									
								
							| @@ -4,6 +4,8 @@ http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/M | ||||
| https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz: | ||||
| - source.systemverilog | ||||
| - source.ucfconstraints | ||||
| vendor/grammars/ABNF.tmbundle: | ||||
| - source.abnf | ||||
| vendor/grammars/Agda.tmbundle: | ||||
| - source.agda | ||||
| vendor/grammars/Alloy.tmbundle: | ||||
| @@ -20,6 +22,8 @@ vendor/grammars/ColdFusion: | ||||
| - text.html.cfm | ||||
| vendor/grammars/Docker.tmbundle: | ||||
| - source.dockerfile | ||||
| vendor/grammars/EBNF.tmbundle: | ||||
| - source.ebnf | ||||
| vendor/grammars/Elm/Syntaxes: | ||||
| - source.elm | ||||
| - text.html.mediawiki.elm-build-output | ||||
| @@ -47,6 +51,8 @@ vendor/grammars/Lean.tmbundle: | ||||
| - source.lean | ||||
| vendor/grammars/LiveScript.tmbundle: | ||||
| - source.livescript | ||||
| vendor/grammars/MQL5-sublime: | ||||
| - source.mql5 | ||||
| vendor/grammars/MagicPython: | ||||
| - source.python | ||||
| - source.regexp.python | ||||
| @@ -103,8 +109,6 @@ vendor/grammars/Sublime-SQF-Language: | ||||
| vendor/grammars/Sublime-Text-2-OpenEdge-ABL: | ||||
| - source.abl | ||||
| - text.html.abl | ||||
| vendor/grammars/Sublime-VimL: | ||||
| - source.viml | ||||
| vendor/grammars/SublimeBrainfuck: | ||||
| - source.bf | ||||
| vendor/grammars/SublimeClarion: | ||||
| @@ -136,7 +140,7 @@ vendor/grammars/X10: | ||||
| - source.x10 | ||||
| vendor/grammars/abap.tmbundle: | ||||
| - source.abap | ||||
| vendor/grammars/actionscript3-tmbundle: | ||||
| vendor/grammars/actionscript3-tmbundle/: | ||||
| - source.actionscript.3 | ||||
| - text.html.asdoc | ||||
| - text.xml.flex-config | ||||
| @@ -358,10 +362,19 @@ vendor/grammars/language-csound: | ||||
| - source.csound-score | ||||
| vendor/grammars/language-emacs-lisp: | ||||
| - source.emacs.lisp | ||||
| vendor/grammars/language-fontforge: | ||||
| - source.fontforge | ||||
| - source.opentype | ||||
| - text.sfd | ||||
| vendor/grammars/language-gfm: | ||||
| - source.gfm | ||||
| vendor/grammars/language-gn: | ||||
| - source.gn | ||||
| vendor/grammars/language-graphql: | ||||
| - source.graphql | ||||
| vendor/grammars/language-haml: | ||||
| - text.haml | ||||
| - text.hamlc | ||||
| vendor/grammars/language-haskell: | ||||
| - hint.haskell | ||||
| - hint.message.haskell | ||||
| @@ -388,6 +401,8 @@ vendor/grammars/language-maxscript: | ||||
| - source.maxscript | ||||
| vendor/grammars/language-ncl: | ||||
| - source.ncl | ||||
| vendor/grammars/language-ninja: | ||||
| - source.ninja | ||||
| vendor/grammars/language-povray: | ||||
| - source.pov-ray sdl | ||||
| vendor/grammars/language-python: | ||||
| @@ -414,6 +429,8 @@ vendor/grammars/language-toc-wow: | ||||
| - source.toc | ||||
| vendor/grammars/language-turing: | ||||
| - source.turing | ||||
| vendor/grammars/language-viml: | ||||
| - source.viml | ||||
| vendor/grammars/language-wavefront: | ||||
| - source.wavefront.mtl | ||||
| - source.wavefront.obj | ||||
| @@ -467,8 +484,6 @@ vendor/grammars/nemerle.tmbundle: | ||||
| - source.nemerle | ||||
| vendor/grammars/nesC: | ||||
| - source.nesc | ||||
| vendor/grammars/ninja.tmbundle: | ||||
| - source.ninja | ||||
| vendor/grammars/nix: | ||||
| - source.nix | ||||
| vendor/grammars/nu.tmbundle: | ||||
| @@ -524,8 +539,8 @@ vendor/grammars/python-django.tmbundle: | ||||
| vendor/grammars/r.tmbundle: | ||||
| - source.r | ||||
| - text.tex.latex.rd | ||||
| vendor/grammars/ruby-haml.tmbundle: | ||||
| - text.haml | ||||
| vendor/grammars/rascal-syntax-highlighting: | ||||
| - source.rascal | ||||
| vendor/grammars/ruby-slim.tmbundle: | ||||
| - text.slim | ||||
| vendor/grammars/ruby.tmbundle: | ||||
| @@ -646,7 +661,5 @@ vendor/grammars/xc.tmbundle: | ||||
| vendor/grammars/xml.tmbundle: | ||||
| - text.xml | ||||
| - text.xml.xsl | ||||
| vendor/grammars/xquery: | ||||
| - source.xquery | ||||
| vendor/grammars/zephir-sublime: | ||||
| - source.php.zephir | ||||
|   | ||||
| @@ -59,8 +59,9 @@ class << Linguist | ||||
|   # Strategies are called in turn until a single Language is returned. | ||||
|   STRATEGIES = [ | ||||
|     Linguist::Strategy::Modeline, | ||||
|     Linguist::Shebang, | ||||
|     Linguist::Strategy::Filename, | ||||
|     Linguist::Shebang, | ||||
|     Linguist::Strategy::Extension, | ||||
|     Linguist::Heuristics, | ||||
|     Linguist::Classifier | ||||
|   ] | ||||
|   | ||||
| @@ -63,7 +63,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns an Array | ||||
|     def extensions | ||||
|       _, *segments = name.downcase.split(".") | ||||
|       _, *segments = name.downcase.split(".", -1) | ||||
|  | ||||
|       segments.map.with_index do |segment, index| | ||||
|         "." + segments[index..-1].join(".") | ||||
|   | ||||
| @@ -56,6 +56,7 @@ module Linguist | ||||
|       generated_net_specflow_feature_file? || | ||||
|       composer_lock? || | ||||
|       node_modules? || | ||||
|       go_vendor? || | ||||
|       npm_shrinkwrap? || | ||||
|       godeps? || | ||||
|       generated_by_zephir? || | ||||
| @@ -274,16 +275,14 @@ module Linguist | ||||
|       return lines[0].include?("Generated by the protocol buffer compiler.  DO NOT EDIT!") | ||||
|     end | ||||
|  | ||||
|     APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp'] | ||||
|     APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php'] | ||||
|  | ||||
|     # Internal: Is the blob generated by Apache Thrift compiler? | ||||
|     # | ||||
|     # Returns true or false | ||||
|     def generated_apache_thrift? | ||||
|       return false unless APACHE_THRIFT_EXTENSIONS.include?(extname) | ||||
|       return false unless lines.count > 1 | ||||
|  | ||||
|       return lines[0].include?("Autogenerated by Thrift Compiler") || lines[1].include?("Autogenerated by Thrift Compiler") | ||||
|       return lines.first(6).any? { |l| l.include?("Autogenerated by Thrift Compiler") } | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a C/C++ header generated by the Java JNI tool javah? | ||||
| @@ -304,6 +303,14 @@ module Linguist | ||||
|       !!name.match(/node_modules\//) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob part of the Go vendor/ tree, | ||||
|     # not meant for humans in pull requests. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def go_vendor? | ||||
|       !!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. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|   | ||||
| @@ -110,6 +110,12 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".cls" do |data| | ||||
|       if /\\\w+{/.match(data) | ||||
|         Language["TeX"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".cs" do |data| | ||||
|       if /![\w\s]+methodsFor: /.match(data) | ||||
|         Language["Smalltalk"] | ||||
| @@ -144,7 +150,7 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     fortran_rx = /^([c*][^abd-z]|      (subroutine|program|end)\s|\s*!)/i | ||||
|     fortran_rx = /^([c*][^abd-z]|      (subroutine|program|end|data)\s|\s*!)/i | ||||
|  | ||||
|     disambiguate ".f" do |data| | ||||
|       if /^: /.match(data) | ||||
| @@ -202,6 +208,8 @@ module Linguist | ||||
|     disambiguate ".inc" do |data| | ||||
|       if /^<\?(?:php)?/.match(data) | ||||
|         Language["PHP"] | ||||
|       elsif /^\s*#(declare|local|macro|while)\s/.match(data) | ||||
|         Language["POV-Ray SDL"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
| @@ -242,7 +250,7 @@ module Linguist | ||||
|         Language["MUF"] | ||||
|       elsif /^\s*;/.match(data) | ||||
|         Language["M"] | ||||
|       elsif /^\s*\(\*/.match(data) | ||||
|       elsif /\*\)$/.match(data) | ||||
|         Language["Mathematica"] | ||||
|       elsif /^\s*%/.match(data) | ||||
|         Language["Matlab"] | ||||
| @@ -252,7 +260,7 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     disambiguate ".md" do |data| | ||||
|       if /^[-a-z0-9=#!\*\[|]/i.match(data) | ||||
|       if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty? | ||||
|         Language["Markdown"] | ||||
|       elsif /^(;;|\(define_)/.match(data) | ||||
|         Language["GCC machine description"] | ||||
|   | ||||
| @@ -11,6 +11,7 @@ require 'linguist/samples' | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/blob_helper' | ||||
| require 'linguist/strategy/filename' | ||||
| require 'linguist/strategy/extension' | ||||
| require 'linguist/strategy/modeline' | ||||
| require 'linguist/shebang' | ||||
|  | ||||
| @@ -90,17 +91,6 @@ module Linguist | ||||
|       language | ||||
|     end | ||||
|  | ||||
|     # Public: Detects the Language of the blob. | ||||
|     # | ||||
|     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||
|     #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||
|     # | ||||
|     # Returns Language or nil. | ||||
|     def self.detect(blob) | ||||
|       warn "[DEPRECATED] `Linguist::Language.detect` is deprecated. Use `Linguist.detect`. #{caller[0]}" | ||||
|       Linguist.detect(blob) | ||||
|     end | ||||
|  | ||||
|     # Public: Get all Languages | ||||
|     # | ||||
|     # Returns an Array of Languages | ||||
| @@ -140,46 +130,46 @@ module Linguist | ||||
|  | ||||
|     # Public: Look up Languages by filename. | ||||
|     # | ||||
|     # The behaviour of this method recently changed. | ||||
|     # See the second example below. | ||||
|     # | ||||
|     # filename - The path String. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_filename('Cakefile') | ||||
|     #   # => [#<Language name="CoffeeScript">] | ||||
|     #   Language.find_by_filename('foo.rb') | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     #   # => [] | ||||
|     # | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_filename(filename) | ||||
|       basename = File.basename(filename) | ||||
|  | ||||
|       # find the first extension with language definitions | ||||
|       extname = FileBlob.new(filename).extensions.detect do |e| | ||||
|         !@extension_index[e].empty? | ||||
|       end | ||||
|  | ||||
|       (@filename_index[basename] + @extension_index[extname]).compact.uniq | ||||
|       @filename_index[basename] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by file extension. | ||||
|     # | ||||
|     # extname - The extension String. | ||||
|     # The behaviour of this method recently changed. | ||||
|     # See the second example below. | ||||
|     # | ||||
|     # filename - The path String. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_extension('.rb') | ||||
|     #   Language.find_by_extension('dummy.rb') | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     # | ||||
|     #   Language.find_by_extension('rb') | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     #   # => [] | ||||
|     # | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_extension(extname) | ||||
|       extname = ".#{extname}" unless extname.start_with?(".") | ||||
|       @extension_index[extname.downcase] | ||||
|     end | ||||
|     def self.find_by_extension(filename) | ||||
|       # find the first extension with language definitions | ||||
|       extname = FileBlob.new(filename.downcase).extensions.detect do |e| | ||||
|         !@extension_index[e].empty? | ||||
|       end | ||||
|  | ||||
|     # DEPRECATED | ||||
|     def self.find_by_shebang(data) | ||||
|       @interpreter_index[Shebang.interpreter(data)] | ||||
|       @extension_index[extname] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by interpreter. | ||||
| @@ -259,17 +249,6 @@ module Linguist | ||||
|       @colors ||= all.select(&:color).sort_by { |lang| lang.name.downcase } | ||||
|     end | ||||
|  | ||||
|     # Public: A List of languages compatible with Ace. | ||||
|     # | ||||
|     # TODO: Remove this method in a 5.x release. Every language now needs an ace_mode | ||||
|     # key, so this function isn't doing anything unique anymore. | ||||
|     # | ||||
|     # Returns an Array of Languages. | ||||
|     def self.ace_modes | ||||
|       warn "This method will be deprecated in a future 5.x release. Every language now has an `ace_mode` set." | ||||
|       @ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase } | ||||
|     end | ||||
|  | ||||
|     # Internal: Initialize a new Language | ||||
|     # | ||||
|     # attributes - A hash of attributes | ||||
| @@ -300,6 +279,8 @@ module Linguist | ||||
|       end | ||||
|  | ||||
|       @ace_mode = attributes[:ace_mode] | ||||
|       @codemirror_mode = attributes[:codemirror_mode] | ||||
|       @codemirror_mime_type = attributes[:codemirror_mime_type] | ||||
|       @wrap = attributes[:wrap] || false | ||||
|  | ||||
|       # Set legacy search term | ||||
| @@ -359,17 +340,6 @@ module Linguist | ||||
|     # Returns an Array of String names | ||||
|     attr_reader :aliases | ||||
|  | ||||
|     # Deprecated: Get code search term | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   # => "ruby" | ||||
|     #   # => "python" | ||||
|     #   # => "perl" | ||||
|     # | ||||
|     # Returns the name String | ||||
|     attr_reader :search_term | ||||
|  | ||||
|     # Public: Get language_id (used in GitHub search) | ||||
|     # | ||||
|     # Examples | ||||
| @@ -397,6 +367,31 @@ module Linguist | ||||
|     # Returns a String name or nil | ||||
|     attr_reader :ace_mode | ||||
|  | ||||
|     # Public: Get CodeMirror mode | ||||
|     # | ||||
|     # Maps to a directory in the `mode/` source code. | ||||
|     #   https://github.com/codemirror/CodeMirror/tree/master/mode | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #  # => "nil" | ||||
|     #  # => "javascript" | ||||
|     #  # => "clike" | ||||
|     # | ||||
|     # Returns a String name or nil | ||||
|     attr_reader :codemirror_mode | ||||
|  | ||||
|     # Public: Get CodeMirror MIME type mode | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #  # => "nil" | ||||
|     #  # => "text/x-javascript" | ||||
|     #  # => "text/x-csrc" | ||||
|     # | ||||
|     # Returns a String name or nil | ||||
|     attr_reader :codemirror_mime_type | ||||
|  | ||||
|     # Public: Should language lines be wrapped | ||||
|     # | ||||
|     # Returns true or false | ||||
| @@ -429,22 +424,6 @@ module Linguist | ||||
|     # Returns the extensions Array | ||||
|     attr_reader :filenames | ||||
|  | ||||
|     # Deprecated: Get primary extension | ||||
|     # | ||||
|     # Defaults to the first extension but can be overridden | ||||
|     # in the languages.yml. | ||||
|     # | ||||
|     # The primary extension can not be nil. Tests should verify this. | ||||
|     # | ||||
|     # This method is only used by app/helpers/gists_helper.rb for creating | ||||
|     # the language dropdown. It really should be using `name` instead. | ||||
|     # Would like to drop primary extension. | ||||
|     # | ||||
|     # Returns the extension String. | ||||
|     def primary_extension | ||||
|       extensions.first | ||||
|     end | ||||
|  | ||||
|     # Public: Get URL escaped name. | ||||
|     # | ||||
|     # Examples | ||||
| @@ -573,6 +552,8 @@ module Linguist | ||||
|       :aliases           => options['aliases'], | ||||
|       :tm_scope          => options['tm_scope'], | ||||
|       :ace_mode          => options['ace_mode'], | ||||
|       :codemirror_mode   => options['codemirror_mode'], | ||||
|       :codemirror_mime_type => options['codemirror_mime_type'], | ||||
|       :wrap              => options['wrap'], | ||||
|       :group_name        => options['group'], | ||||
|       :searchable        => options.fetch('searchable', true), | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -26,4 +26,4 @@ | ||||
| - Shell | ||||
| - Swift | ||||
| - TeX | ||||
| - VimL | ||||
| - Vim script | ||||
|   | ||||
							
								
								
									
										10
									
								
								lib/linguist/strategy/extension.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								lib/linguist/strategy/extension.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| module Linguist | ||||
|   module Strategy | ||||
|     # Detects language based on extension | ||||
|     class Extension | ||||
|       def self.call(blob, _) | ||||
|         Language.find_by_extension(blob.name.to_s) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @@ -1,9 +1,10 @@ | ||||
| module Linguist | ||||
|   module Strategy | ||||
|     # Detects language based on filename and/or extension | ||||
|     # Detects language based on filename | ||||
|     class Filename | ||||
|       def self.call(blob, _) | ||||
|         Language.find_by_filename(blob.name.to_s) | ||||
|         name = blob.name.to_s | ||||
|         Language.find_by_filename(name) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|   | ||||
| @@ -1,19 +1,98 @@ | ||||
| module Linguist | ||||
|   module Strategy | ||||
|     class Modeline | ||||
|       EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i | ||||
|       EMACS_MODELINE = / | ||||
|         -\*- | ||||
|         (?: | ||||
|           # Short form: `-*- ruby -*-` | ||||
|           \s* (?= [^:;\s]+ \s* -\*-) | ||||
|           | | ||||
|           # Longer form: `-*- foo:bar; mode: ruby; -*-` | ||||
|           (?: | ||||
|             .*?       # Preceding variables: `-*- foo:bar bar:baz;` | ||||
|             [;\s]     # Which are delimited by spaces or semicolons | ||||
|             | | ||||
|             (?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-` | ||||
|           ) | ||||
|           mode        # Major mode indicator | ||||
|           \s*:\s*     # Allow whitespace around colon: `mode : ruby` | ||||
|         ) | ||||
|         ([^:;\s]+)    # Name of mode | ||||
|  | ||||
|       # First form vim modeline | ||||
|       # [text]{white}{vi:|vim:|ex:}[white]{options} | ||||
|       # ex: 'vim: syntax=ruby' | ||||
|       VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i | ||||
|         # Ensure the mode is terminated correctly | ||||
|         (?= | ||||
|           # Followed by semicolon or whitespace | ||||
|           [\s;] | ||||
|           | | ||||
|           # Touching the ending sequence: `ruby-*-` | ||||
|           (?<![-*])   # Don't allow stuff like `ruby--*-` to match; it'll invalidate the mode | ||||
|           -\*-        # Emacs has no problems reading `ruby --*-`, however. | ||||
|         ) | ||||
|         .*?           # Anything between a cleanly-terminated mode and the ending -*- | ||||
|         -\*- | ||||
|       /xi | ||||
|  | ||||
|       # Second form vim modeline (compatible with some versions of Vi) | ||||
|       # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text] | ||||
|       # ex: 'vim set syntax=ruby:' | ||||
|       VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i | ||||
|       VIM_MODELINE   = / | ||||
|  | ||||
|       MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2] | ||||
|         # Start modeline. Could be `vim:`, `vi:` or `ex:` | ||||
|         (?: | ||||
|           (?:\s|^) | ||||
|           vi | ||||
|           (?:m[<=>]?\d+|m)? # Version-specific modeline | ||||
|           | | ||||
|           [\t\x20] # `ex:` requires whitespace, because "ex:" might be short for "example:" | ||||
|           ex | ||||
|         ) | ||||
|  | ||||
|         # If the option-list begins with `set ` or `se `, it indicates an alternative | ||||
|         # modeline syntax partly-compatible with older versions of Vi. Here, the colon | ||||
|         # serves as a terminator for an option sequence, delimited by whitespace. | ||||
|         (?= | ||||
|           # So we have to ensure the modeline ends with a colon | ||||
|           : (?=\s* set? \s [^\n:]+ :) | | ||||
|  | ||||
|           # Otherwise, it isn't valid syntax and should be ignored | ||||
|           : (?!\s* set? \s) | ||||
|         ) | ||||
|  | ||||
|         # Possible (unrelated) `option=value` pairs to skip past | ||||
|         (?: | ||||
|           # Option separator. Vim uses whitespace or colons to separate options (except if | ||||
|           # the alternate "vim: set " form is used, where only whitespace is used) | ||||
|           (?: | ||||
|             \s | ||||
|             | | ||||
|             \s* : \s* # Note that whitespace around colons is accepted too: | ||||
|           )           # vim: noai :  ft=ruby:noexpandtab | ||||
|  | ||||
|           # Option's name. All recognised Vim options have an alphanumeric form. | ||||
|           \w* | ||||
|  | ||||
|           # Possible value. Not every option takes an argument. | ||||
|           (?: | ||||
|             # Whitespace between name and value is allowed: `vim: ft   =ruby` | ||||
|             \s*= | ||||
|  | ||||
|             # Option's value. Might be blank; `vim: ft= ` says "use no filetype". | ||||
|             (?: | ||||
|               [^\\\s] # Beware of escaped characters: titlestring=\ ft=ruby | ||||
|               |       # will be read by Vim as { titlestring: " ft=ruby" }. | ||||
|               \\. | ||||
|             )* | ||||
|           )? | ||||
|         )* | ||||
|  | ||||
|         # The actual filetype declaration | ||||
|         [\s:] (?:filetype|ft|syntax) \s*= | ||||
|  | ||||
|         # Language's name | ||||
|         (\w+) | ||||
|  | ||||
|         # Ensure it's followed by a legal separator | ||||
|         (?=\s|:|$) | ||||
|       /xi | ||||
|  | ||||
|       MODELINES = [EMACS_MODELINE, VIM_MODELINE] | ||||
|  | ||||
|       # Scope of the search for modelines | ||||
|       # Number of lines to check at the beginning and at the end of the file | ||||
|   | ||||
| @@ -15,6 +15,9 @@ | ||||
| # Dependencies | ||||
| - ^[Dd]ependencies/ | ||||
|  | ||||
| # Distributions | ||||
| - (^|/)dist/ | ||||
|  | ||||
| # C deps | ||||
| #  https://github.com/joyent/node | ||||
| - ^deps/ | ||||
| @@ -47,6 +50,9 @@ | ||||
| # Go dependencies | ||||
| - Godeps/_workspace/ | ||||
|  | ||||
| # GNU indent profiles | ||||
| - .indent.pro | ||||
|  | ||||
| # Minified JavaScript and CSS | ||||
| - (\.|-)min\.(js|css)$ | ||||
|  | ||||
| @@ -165,7 +171,7 @@ | ||||
| # Chart.js | ||||
| - (^|/)Chart\.js$ | ||||
|  | ||||
| # Codemirror | ||||
| # CodeMirror | ||||
| - (^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo) | ||||
|  | ||||
| # SyntaxHighlighter - http://alexgorbatchev.com/ | ||||
| @@ -229,6 +235,9 @@ | ||||
| # Fabric | ||||
| - Fabric.framework/ | ||||
|  | ||||
| # BuddyBuild | ||||
| - BuddyBuildSDK.framework/ | ||||
|  | ||||
| # git config files | ||||
| - gitattributes$ | ||||
| - gitignore$ | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "4.8.11" | ||||
|   VERSION = "5.0.0" | ||||
| end | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| { | ||||
|   "repository": "https://github.com/github/linguist", | ||||
|   "dependencies": { | ||||
|     "season": "~>5.0" | ||||
|     "season": "~>5.4" | ||||
|   }, | ||||
|   "license": "MIT" | ||||
| } | ||||
|   | ||||
							
								
								
									
										190
									
								
								samples/ABNF/toml.abnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								samples/ABNF/toml.abnf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | ||||
| ; Source:  https://github.com/toml-lang/toml | ||||
| ; License: MIT | ||||
|  | ||||
| ;; This is an attempt to define TOML in ABNF according to the grammar defined | ||||
| ;; in RFC 4234 (http://www.ietf.org/rfc/rfc4234.txt). | ||||
|  | ||||
| ;; TOML | ||||
|  | ||||
| toml = expression *( newline expression ) | ||||
| expression = ( | ||||
|   ws / | ||||
|   ws comment / | ||||
|   ws keyval ws [ comment ] / | ||||
|   ws table ws [ comment ] | ||||
| ) | ||||
|  | ||||
| ;; Newline | ||||
|  | ||||
| newline = ( | ||||
|   %x0A /              ; LF | ||||
|   %x0D.0A             ; CRLF | ||||
| ) | ||||
|  | ||||
| newlines = 1*newline | ||||
|  | ||||
| ;; Whitespace | ||||
|  | ||||
| ws = *( | ||||
|   %x20 /              ; Space | ||||
|   %x09                ; Horizontal tab | ||||
| ) | ||||
|  | ||||
| ;; Comment | ||||
|  | ||||
| comment-start-symbol = %x23 ; # | ||||
| non-eol = %x09 / %x20-10FFFF | ||||
| comment = comment-start-symbol *non-eol | ||||
|  | ||||
| ;; Key-Value pairs | ||||
|  | ||||
| keyval-sep = ws %x3D ws ; = | ||||
| keyval = key keyval-sep val | ||||
|  | ||||
| key = unquoted-key / quoted-key | ||||
| unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _ | ||||
| quoted-key = quotation-mark 1*basic-char quotation-mark ; See Basic Strings | ||||
|  | ||||
| val = integer / float / string / boolean / date-time / array / inline-table | ||||
|  | ||||
| ;; Table | ||||
|  | ||||
| table = std-table / array-table | ||||
|  | ||||
| ;; Standard Table | ||||
|  | ||||
| std-table-open  = %x5B ws     ; [ Left square bracket | ||||
| std-table-close = ws %x5D     ; ] Right square bracket | ||||
| table-key-sep   = ws %x2E ws  ; . Period | ||||
|  | ||||
| std-table = std-table-open key *( table-key-sep key) std-table-close | ||||
|  | ||||
| ;; Array Table | ||||
|  | ||||
| array-table-open  = %x5B.5B ws  ; [[ Double left square bracket | ||||
| array-table-close = ws %x5D.5D  ; ]] Double right square bracket | ||||
|  | ||||
| array-table = array-table-open key *( table-key-sep key) array-table-close | ||||
|  | ||||
| ;; Integer | ||||
|  | ||||
| integer = [ minus / plus ] int | ||||
| minus = %x2D                       ; - | ||||
| plus = %x2B                        ; + | ||||
| digit1-9 = %x31-39                 ; 1-9 | ||||
| underscore = %x5F                  ; _ | ||||
| int = DIGIT / digit1-9 1*( DIGIT / underscore DIGIT ) | ||||
|  | ||||
| ;; Float | ||||
|  | ||||
| float = integer ( frac / frac exp / exp ) | ||||
| zero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT ) | ||||
| frac = decimal-point zero-prefixable-int | ||||
| decimal-point = %x2E               ; . | ||||
| exp = e integer | ||||
| e = %x65 / %x45                    ; e E | ||||
|  | ||||
| ;; String | ||||
|  | ||||
| string = basic-string / ml-basic-string / literal-string / ml-literal-string | ||||
|  | ||||
| ;; Basic String | ||||
|  | ||||
| basic-string = quotation-mark *basic-char quotation-mark | ||||
|  | ||||
| quotation-mark = %x22            ; " | ||||
|  | ||||
| basic-char = basic-unescaped / escaped | ||||
| escaped = escape ( %x22 /          ; "    quotation mark  U+0022 | ||||
|                    %x5C /          ; \    reverse solidus U+005C | ||||
|                    %x2F /          ; /    solidus         U+002F | ||||
|                    %x62 /          ; b    backspace       U+0008 | ||||
|                    %x66 /          ; f    form feed       U+000C | ||||
|                    %x6E /          ; n    line feed       U+000A | ||||
|                    %x72 /          ; r    carriage return U+000D | ||||
|                    %x74 /          ; t    tab             U+0009 | ||||
|                    %x75 4HEXDIG /  ; uXXXX                U+XXXX | ||||
|                    %x55 8HEXDIG )  ; UXXXXXXXX            U+XXXXXXXX | ||||
|  | ||||
| basic-unescaped = %x20-21 / %x23-5B / %x5D-10FFFF | ||||
|  | ||||
| escape = %x5C                    ; \ | ||||
|  | ||||
| ;; Multiline Basic String | ||||
|  | ||||
| ml-basic-string-delim = quotation-mark quotation-mark quotation-mark | ||||
| ml-basic-string = ml-basic-string-delim ml-basic-body ml-basic-string-delim | ||||
| ml-basic-body = *( ml-basic-char / newline / ( escape newline )) | ||||
|  | ||||
| ml-basic-char = ml-basic-unescaped / escaped | ||||
| ml-basic-unescaped = %x20-5B / %x5D-10FFFF | ||||
|  | ||||
| ;; Literal String | ||||
|  | ||||
| literal-string = apostraphe *literal-char apostraphe | ||||
|  | ||||
| apostraphe = %x27 ; ' Apostrophe | ||||
|  | ||||
| literal-char = %x09 / %x20-26 / %x28-10FFFF | ||||
|  | ||||
| ;; Multiline Literal String | ||||
|  | ||||
| ml-literal-string-delim = apostraphe apostraphe apostraphe | ||||
| ml-literal-string = ml-literal-string-delim ml-literal-body ml-literal-string-delim | ||||
|  | ||||
| ml-literal-body = *( ml-literal-char / newline ) | ||||
| ml-literal-char = %x09 / %x20-10FFFF | ||||
|  | ||||
| ;; Boolean | ||||
|  | ||||
| boolean = true / false | ||||
| true    = %x74.72.75.65     ; true | ||||
| false   = %x66.61.6C.73.65  ; false | ||||
|  | ||||
| ;; Datetime (as defined in RFC 3339) | ||||
|  | ||||
| date-fullyear  = 4DIGIT | ||||
| date-month     = 2DIGIT  ; 01-12 | ||||
| date-mday      = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on month/year | ||||
| time-hour      = 2DIGIT  ; 00-23 | ||||
| time-minute    = 2DIGIT  ; 00-59 | ||||
| time-second    = 2DIGIT  ; 00-58, 00-59, 00-60 based on leap second rules | ||||
| time-secfrac   = "." 1*DIGIT | ||||
| time-numoffset = ( "+" / "-" ) time-hour ":" time-minute | ||||
| time-offset    = "Z" / time-numoffset | ||||
|  | ||||
| partial-time   = time-hour ":" time-minute ":" time-second [time-secfrac] | ||||
| full-date      = date-fullyear "-" date-month "-" date-mday | ||||
| full-time      = partial-time time-offset | ||||
|  | ||||
| date-time      = full-date "T" full-time | ||||
|  | ||||
| ;; Array | ||||
|  | ||||
| array-open  = %x5B ws  ; [ | ||||
| array-close = ws %x5D  ; ] | ||||
|  | ||||
| array = array-open array-values array-close | ||||
|  | ||||
| array-values = [ val [ array-sep ] [ ( comment newlines) / newlines ] / | ||||
|                  val array-sep [ ( comment newlines) / newlines ] array-values ] | ||||
|  | ||||
| array-sep = ws %x2C ws  ; , Comma | ||||
|  | ||||
| ;; Inline Table | ||||
|  | ||||
| inline-table-open  = %x7B ws     ; { | ||||
| inline-table-close = ws %x7D     ; } | ||||
| inline-table-sep   = ws %x2C ws  ; , Comma | ||||
|  | ||||
| inline-table = inline-table-open inline-table-keyvals inline-table-close | ||||
|  | ||||
| inline-table-keyvals = [ inline-table-keyvals-non-empty ] | ||||
| inline-table-keyvals-non-empty = key keyval-sep val / | ||||
|                                  key keyval-sep val inline-table-sep inline-table-keyvals-non-empty | ||||
|  | ||||
| ;; Built-in ABNF terms, reproduced here for clarity | ||||
|  | ||||
| ; ALPHA = %x41-5A / %x61-7A ; A-Z / a-z | ||||
| ; DIGIT = %x30-39 ; 0-9 | ||||
| ; HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" | ||||
							
								
								
									
										72
									
								
								samples/CSON/base.cson
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								samples/CSON/base.cson
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| 'atom-text-editor': | ||||
|   # Platform Bindings | ||||
|   'home': 'editor:move-to-first-character-of-line' | ||||
|   'end': 'editor:move-to-end-of-screen-line' | ||||
|   'shift-home': 'editor:select-to-first-character-of-line' | ||||
|   'shift-end': 'editor:select-to-end-of-line' | ||||
|  | ||||
| 'atom-text-editor:not([mini])': | ||||
|   # Atom Specific | ||||
|   'ctrl-C': 'editor:copy-path' | ||||
|  | ||||
|   # Sublime Parity | ||||
|   'tab': 'editor:indent' | ||||
|   'enter': 'editor:newline' | ||||
|   'shift-tab': 'editor:outdent-selected-rows' | ||||
|   'ctrl-K': 'editor:delete-line' | ||||
|  | ||||
| '.select-list atom-text-editor[mini]': | ||||
|   'enter': 'core:confirm' | ||||
|  | ||||
| '.tool-panel.panel-left, .tool-panel.panel-right': | ||||
|   'escape': 'tool-panel:unfocus' | ||||
|  | ||||
| 'atom-text-editor !important, atom-text-editor[mini] !important': | ||||
|   'escape': 'editor:consolidate-selections' | ||||
|  | ||||
| # allow standard input fields to work correctly | ||||
| 'body .native-key-bindings': | ||||
|   'tab': 'core:focus-next' | ||||
|   'shift-tab': 'core:focus-previous' | ||||
|   'enter': 'native!' | ||||
|   'backspace': 'native!' | ||||
|   'shift-backspace': 'native!' | ||||
|   'delete': 'native!' | ||||
|   'up': 'native!' | ||||
|   'down': 'native!' | ||||
|   'shift-up': 'native!' | ||||
|   'shift-down': 'native!' | ||||
|   'alt-up': 'native!' | ||||
|   'alt-down': 'native!' | ||||
|   'alt-shift-up': 'native!' | ||||
|   'alt-shift-down': 'native!' | ||||
|   'cmd-up': 'native!' | ||||
|   'cmd-down': 'native!' | ||||
|   'cmd-shift-up': 'native!' | ||||
|   'cmd-shift-down': 'native!' | ||||
|   'ctrl-up': 'native!' | ||||
|   'ctrl-down': 'native!' | ||||
|   'ctrl-shift-up': 'native!' | ||||
|   'ctrl-shift-down': 'native!' | ||||
|   'left': 'native!' | ||||
|   'right': 'native!' | ||||
|   'shift-left': 'native!' | ||||
|   'shift-right': 'native!' | ||||
|   'alt-left': 'native!' | ||||
|   'alt-right': 'native!' | ||||
|   'alt-shift-left': 'native!' | ||||
|   'alt-shift-right': 'native!' | ||||
|   'cmd-left': 'native!' | ||||
|   'cmd-right': 'native!' | ||||
|   'cmd-shift-left': 'native!' | ||||
|   'cmd-shift-right': 'native!' | ||||
|   'ctrl-left': 'native!' | ||||
|   'ctrl-right': 'native!' | ||||
|   'ctrl-shift-left': 'native!' | ||||
|   'ctrl-shift-right': 'native!' | ||||
|   'ctrl-b': 'native!' | ||||
|   'ctrl-f': 'native!' | ||||
|   'ctrl-F': 'native!' | ||||
|   'ctrl-B': 'native!' | ||||
|   'ctrl-h': 'native!' | ||||
|   'ctrl-d': 'native!' | ||||
							
								
								
									
										59
									
								
								samples/CSON/config.cson
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								samples/CSON/config.cson
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| directoryIcons: | ||||
|  | ||||
| 	Atom: | ||||
| 		icon: "atom" | ||||
| 		match: /^\.atom$/ | ||||
| 		colour: "dark-green" | ||||
|  | ||||
| 	Bower: | ||||
| 		icon: "bower" | ||||
| 		match: /^bower[-_]components$/ | ||||
| 		colour: "bower" | ||||
|  | ||||
| 	Dropbox: | ||||
| 		icon: "dropbox" | ||||
| 		match: /^(?:Dropbox|\.dropbox\.cache)$/ | ||||
| 		colour: "medium-blue" | ||||
|  | ||||
| 	Git: | ||||
| 		icon: "git" | ||||
| 		match: /^\.git$/ | ||||
|  | ||||
| 	GitHub: | ||||
| 		icon: "github" | ||||
| 		match: /^\.github$/ | ||||
|  | ||||
| 	Meteor: | ||||
| 		icon: "meteor" | ||||
| 		match: /^\.meteor$/ | ||||
|  | ||||
| 	NodeJS: | ||||
| 		icon: "node" | ||||
| 		match: /^node_modules$/ | ||||
| 		colour: "medium-green" | ||||
|  | ||||
| 	Package: | ||||
| 		icon: "package" | ||||
| 		match: /^\.bundle$/i | ||||
|  | ||||
| 	TextMate: | ||||
| 		icon: "textmate" | ||||
| 		match: ".tmBundle" | ||||
|  | ||||
|  | ||||
| fileIcons: | ||||
|  | ||||
| 	ABAP: | ||||
| 		icon: "abap" | ||||
| 		scope: "abp" | ||||
| 		match: ".abap" | ||||
| 		colour: "medium-orange" | ||||
|  | ||||
| 	ActionScript: # Or Flash-related | ||||
| 		icon: "as" | ||||
| 		match: [ | ||||
| 			[".swf", "medium-blue"] | ||||
| 			[".as", "medium-red", scope: /\.(?:flex-config|actionscript(?:\.\d+)?)$/i, alias: /ActionScript\s?3|as3/i] | ||||
| 			[".jsfl", "auto-yellow"] | ||||
| 			[".swc", "dark-red"] | ||||
| 		] | ||||
							
								
								
									
										108
									
								
								samples/CSON/ff-sfd.cson
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								samples/CSON/ff-sfd.cson
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| name: "Spline Font Database" | ||||
| scopeName: "text.sfd" | ||||
| fileTypes: ["sfd"] | ||||
| firstLineMatch: "^SplineFontDB: [\\d.]+" | ||||
| patterns: [include: "#main"] | ||||
|  | ||||
| repository: | ||||
| 	main: | ||||
| 		patterns: [ | ||||
| 			{include: "#punctuation"} | ||||
| 			{include: "#private"} | ||||
| 			{include: "#image"} | ||||
| 			{include: "#pickleData"} | ||||
| 			{include: "#sections"} | ||||
| 			{include: "#copyright"} | ||||
| 			{include: "#property"} | ||||
| 			{include: "#control"} | ||||
| 			{include: "#address"} | ||||
| 			{include: "#encoding"} | ||||
| 			{include: "source.fontforge#shared"} | ||||
| 			{include: "#colour"} | ||||
| 		] | ||||
| 	 | ||||
| 	punctuation: | ||||
| 		patterns: [ | ||||
| 			{match: "<|>",  name: "punctuation.definition.brackets.angle.sfd"} | ||||
| 			{match: "[{}]", name: "punctuation.definition.brackets.curly.sfd"} | ||||
| 		] | ||||
|  | ||||
| 	private: | ||||
| 		name: "meta.section.private.sfd" | ||||
| 		begin: "^BeginPrivate(?=:)" | ||||
| 		end:   "^EndPrivate\\b" | ||||
| 		beginCaptures: 0: name: "keyword.control.begin.private.sfd" | ||||
| 		endCaptures:   0: name: "keyword.control.end.private.sfd" | ||||
| 		patterns: [ | ||||
| 			{match: "^\\S+", name: "entity.name.private.property.sfd"} | ||||
| 			{include: "$self"} | ||||
| 		] | ||||
| 	 | ||||
| 	image: | ||||
| 		name: "meta.image.sfd" | ||||
| 		begin: "^(Image)(?=:)(.+)$" | ||||
| 		end:   "^(EndImage)\\b" | ||||
| 		contentName: "string.unquoted.raw.data.sfd" | ||||
| 		beginCaptures: | ||||
| 			1: name: "keyword.control.begin.image.sfd" | ||||
| 			2: patterns: [include: "$self"] | ||||
| 		endCaptures: | ||||
| 			1: name: "keyword.control.end.image.sfd" | ||||
|  | ||||
| 	pickleData: | ||||
| 		name: "meta.pickle-data.sfd" | ||||
| 		begin: "^(PickledData)(:)\\s*(\")" | ||||
| 		end:   '"' | ||||
| 		beginCaptures: | ||||
| 			1: name: "entity.name.property.sfd" | ||||
| 			2: name: "punctuation.separator.dictionary.key-value.sfd" | ||||
| 			3: name: "punctuation.definition.string.begin.sfd" | ||||
| 		endCaptures: | ||||
| 			0: name: "punctuation.definition.string.end.sfd" | ||||
| 		patterns: [match: "\\\\.", name: "constant.character.escape.sfd"] | ||||
|  | ||||
| 	sections: | ||||
| 		name: "meta.section.${2:/downcase}.sfd" | ||||
| 		begin: "^(Start|Begin)([A-Z]\\w+)(?=:)" | ||||
| 		end:   "^(End\\2)\\b" | ||||
| 		beginCaptures: 0: name: "keyword.control.begin.${2:/downcase}.sfd" | ||||
| 		endCaptures:   0: name: "keyword.control.end.${2:/downcase}.sfd" | ||||
| 		patterns: [include: "$self"] | ||||
|  | ||||
| 	control: | ||||
| 		name: "keyword.control.${1:/downcase}.sfd" | ||||
| 		match: "\\b(Fore|Back|SplineSet|^End\\w+)\\b" | ||||
|  | ||||
| 	colour: | ||||
| 		name: "constant.other.hex.colour.sfd" | ||||
| 		match: "(#)[A-Fa-f0-9]{3,}|(?<=\\s)[A-Fa-f0-9]{6,8}" | ||||
| 		captures: | ||||
| 			1: name: "punctuation.definition.colour.sfd" | ||||
|  | ||||
| 	encoding: | ||||
| 		name: "constant.language.encoding.sfd" | ||||
| 		match: "(?i)\\b(ISO[-\\w]+)(?<=\\d)(?=\\s|$)" | ||||
|  | ||||
| 	# Don't highlight numbers in freeform strings (years/version strings) | ||||
| 	copyright: | ||||
| 		name: "meta.${1:/downcase}-string.sfd" | ||||
| 		begin: "^(Copyright|U?Comments?|\\w+Name)(:)" | ||||
| 		end:   "$" | ||||
| 		beginCaptures: | ||||
| 			1: name: "entity.name.property.sfd" | ||||
| 			2: name: "punctuation.separator.dictionary.key-value.sfd" | ||||
| 		patterns: [include: "source.fontforge#stringEscapes"] | ||||
| 	 | ||||
| 	# No idea what this is, but it looks distracting without a fix | ||||
| 	# Assuming it's referring to a memory register or something. | ||||
| 	address: | ||||
| 		match: "\\d+[xX][A-Fa-f0-9]+" | ||||
| 		name: "constant.numeric.hexadecimal.sfd" | ||||
| 	 | ||||
| 	property: | ||||
| 		match: "^([^:]+)(:)" | ||||
| 		name: "meta.dictionary.key-value.sfd" | ||||
| 		captures: | ||||
| 			1: name: "entity.name.property.sfd" | ||||
| 			2: name: "punctuation.separator.dictionary.key-value.sfd" | ||||
| 	 | ||||
							
								
								
									
										11
									
								
								samples/CSON/wercker-status.cson
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								samples/CSON/wercker-status.cson
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| 'menu': [ | ||||
|   { | ||||
|     'label': 'Packages' | ||||
|     'submenu': [ | ||||
|       'label': 'Wercker Status' | ||||
|       'submenu': [ | ||||
|         { 'label': 'Check now!', 'command': 'wercker-status:checknow' } | ||||
|       ] | ||||
|     ] | ||||
|   } | ||||
| ] | ||||
| @@ -1,707 +0,0 @@ | ||||
| Inductive day : Type := | ||||
| | monday : day | ||||
| | tuesday : day | ||||
| | wednesday : day | ||||
| | thursday : day | ||||
| | friday : day | ||||
| | saturday : day | ||||
| | sunday : day. | ||||
|  | ||||
| Definition next_weekday (d:day) : day := | ||||
|   match d with | ||||
|   | monday => tuesday | ||||
|   | tuesday => wednesday | ||||
|   | wednesday => thursday | ||||
|   | thursday => friday | ||||
|   | friday => monday | ||||
|   | saturday => monday | ||||
|   | sunday => monday | ||||
|   end. | ||||
|  | ||||
| Example test_next_weekday: | ||||
| (next_weekday (next_weekday saturday)) = tuesday. | ||||
|  | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Inductive bool : Type := | ||||
| 	| true : bool | ||||
| 	| false : bool. | ||||
|  | ||||
| Definition negb (b:bool) : bool := | ||||
| 													 match b with | ||||
| 																			 | true => false | ||||
| 																			 | false => true | ||||
| 													 end. | ||||
|  | ||||
| Definition andb (b1:bool) (b2:bool) : bool := | ||||
| 		match b1 with | ||||
| 		 | true => b2 | ||||
| 		 | false => false | ||||
| 	  end. | ||||
|  | ||||
| Definition orb (b1:bool) (b2:bool) : bool := | ||||
| 		match b1 with | ||||
| 		  | true => true | ||||
| 		  | false => b2 | ||||
| 		end. | ||||
|  | ||||
| Example test_orb1: (orb true false) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Example test_orb2: (orb false false) = false. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Example test_orb3: (orb false true) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Example test_orb4: (orb true true) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Definition nandb (b1: bool) (b2:bool) : bool := | ||||
| 	match b1 with | ||||
| 		| true => match b2 with | ||||
| 										| false => true | ||||
| 										| true => false | ||||
| 							end | ||||
| 		| false => true | ||||
| 	end. | ||||
|  | ||||
| Example test_nandb1: (nandb true false) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_nandb2: (nandb false false) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_nandb3: (nandb false true) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_nandb4: (nandb true true) = false. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Definition andb3 (b1: bool) (b2:bool) (b3:bool) : bool := | ||||
| 	match b1 with | ||||
|     | false => false | ||||
| 		| true => match b2 with | ||||
| 								| false => false | ||||
| 								| true => b3 | ||||
| 							end | ||||
| 	end. | ||||
|  | ||||
| Example test_andb31: (andb3 true true true) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_andb32: (andb3 false true true) = false. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_andb33: (andb3 true false true) = false. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_andb34: (andb3 true true false) = false. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Module Playground1. | ||||
|  | ||||
| Inductive nat : Type := | ||||
| 	| O : nat | ||||
| 	| S : nat -> nat. | ||||
|  | ||||
| Definition pred (n : nat) : nat := | ||||
| 	match n with | ||||
| 		| O => O | ||||
| 		| S n' => n' | ||||
| 	end. | ||||
|  | ||||
| Definition minustwo (n : nat) : nat := | ||||
| 	match n with | ||||
| 		| O => O | ||||
| 		| S O => O | ||||
| 		| S (S n') => n' | ||||
| 	end. | ||||
|  | ||||
| Fixpoint evenb (n : nat) : bool := | ||||
| 	match n with | ||||
| 		| O => true | ||||
| 		| S O => false | ||||
| 		| S (S n') => evenb n' | ||||
| 	end. | ||||
|  | ||||
| Definition oddb (n : nat) : bool := negb (evenb n). | ||||
|  | ||||
| Example test_oddb1: (oddb (S O)) = true. | ||||
| Proof. reflexivity. Qed. | ||||
| Example test_oddb2: (oddb (S (S (S (S O))))) = false. | ||||
| Proof. reflexivity. Qed. | ||||
|  | ||||
| Fixpoint plus (n : nat) (m : nat) : nat := | ||||
| 	match n with | ||||
| 		| O => m | ||||
| 		| S n' => S (plus n' m) | ||||
| 	end. | ||||
|  | ||||
| Fixpoint mult (n m : nat) : nat := | ||||
| 	match n with | ||||
| 		| O => O | ||||
| 		| S n' => plus m (mult n' m) | ||||
| 	end. | ||||
|  | ||||
| Fixpoint minus (n m : nat) : nat := | ||||
| 	match n, m with | ||||
| 		| O, _ => n | ||||
| 		| S n', O => S n' | ||||
| 		| S n', S m' => minus n' m' | ||||
| 	end. | ||||
|  | ||||
| Fixpoint exp (base power : nat) : nat := | ||||
| 	match power with | ||||
| 		| O => S O | ||||
| 		| S p => mult base (exp base p) | ||||
| 	end. | ||||
|  | ||||
| Fixpoint factorial (n : nat) : nat := | ||||
| 	match n with | ||||
| 		| O => S O | ||||
| 		| S n' => mult n (factorial n') | ||||
| 	end. | ||||
|  | ||||
| Example test_factorial1: (factorial (S (S (S O)))) = (S (S (S (S (S (S O)))))). | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Notation "x + y" := (plus x y) (at level 50, left associativity) : nat_scope. | ||||
| Notation "x - y" := (minus x y) (at level 50, left associativity) : nat_scope. | ||||
| Notation "x * y" := (mult x y) (at level 40, left associativity) : nat_scope. | ||||
|  | ||||
| Fixpoint beq_nat (n m : nat) : bool := | ||||
| 	match n with | ||||
| 		| O => match m with | ||||
| 						| O => true | ||||
| 						| S m' => false | ||||
| 					 end | ||||
| 		| S n' => match m with | ||||
| 							| O => false | ||||
| 							| S m' => beq_nat n' m' | ||||
| 							end | ||||
| 	end. | ||||
|  | ||||
| Fixpoint ble_nat (n m : nat) : bool := | ||||
| 	match n with | ||||
| 		| O => true | ||||
| 		| S n' =>  | ||||
| 				match m with | ||||
| 					| O => false | ||||
| 					| S m' => ble_nat n' m' | ||||
| 				end | ||||
| 	end. | ||||
|  | ||||
| Example test_ble_nat1: (ble_nat (S (S O)) (S (S O))) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_ble_nat2: (ble_nat (S (S O)) (S (S (S (S O))))) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_ble_nat3: (ble_nat (S (S (S (S O)))) (S (S O))) = false. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Definition blt_nat (n m : nat) : bool := | ||||
| 		(andb (negb (beq_nat n m)) (ble_nat n m)). | ||||
|  | ||||
| Example test_blt_nat1: (blt_nat (S (S O)) (S (S O))) = false. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_blt_nat3: (blt_nat (S (S (S (S O)))) (S (S O))) = false. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
| Example test_blt_nat2 : (blt_nat (S (S O)) (S (S (S (S O))))) = true. | ||||
| Proof. simpl. reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_O_n : forall n : nat, O + n = n. | ||||
| Proof. | ||||
| 	simpl. reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_O_n' : forall n : nat, O + n = n. | ||||
| Proof. | ||||
| 	reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_O_n'' : forall n : nat, O + n = n. | ||||
| Proof. | ||||
| 	intros n. reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_1_1 : forall n : nat, (S O) + n = S n. | ||||
| Proof. | ||||
| 	intros n. reflexivity. Qed. | ||||
|  | ||||
| Theorem mult_0_1: forall n : nat, O * n = O. | ||||
| Proof. | ||||
| 	intros n. reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_id_example : forall n m:nat, | ||||
| 	n = m -> n + n = m + m. | ||||
| Proof. | ||||
| 	intros n m. | ||||
| 	intros H. | ||||
| 	rewrite -> H. | ||||
| 	reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_id_exercise : forall n m o: nat, | ||||
| 	n = m -> m = o -> n + m = m + o. | ||||
| Proof. | ||||
| 	intros n m o. | ||||
| 	intros H. | ||||
| 	intros H'. | ||||
| 	rewrite -> H. | ||||
| 	rewrite <- H'. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem mult_0_plus : forall n m : nat, | ||||
| 				(O + n) * m = n * m. | ||||
| Proof. | ||||
| 	intros n m. | ||||
| 	rewrite -> plus_O_n. | ||||
| 	reflexivity. Qed. | ||||
|  | ||||
| Theorem mult_1_plus : forall n m: nat, | ||||
| 	((S O) + n) * m = m + (n * m). | ||||
| Proof. | ||||
| 	intros n m. | ||||
| 	rewrite -> plus_1_1. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem mult_1 : forall n : nat, | ||||
| 				n * (S O) = n. | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	induction n as [| n']. | ||||
| 	reflexivity. | ||||
| 	simpl. | ||||
| 	rewrite -> IHn'. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem plus_1_neq_0 : forall n : nat, | ||||
| 				beq_nat (n + (S O)) O = false. | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	destruct n as [| n']. | ||||
| 	reflexivity. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem zero_nbeq_plus_1 : forall n : nat, | ||||
| 				beq_nat O (n + (S O)) = false. | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	destruct n. | ||||
| 	reflexivity. | ||||
| 	reflexivity. | ||||
| Qed. | ||||
|  | ||||
| Require String. Open Scope string_scope. | ||||
|  | ||||
| Ltac move_to_top x := | ||||
| match reverse goal with | ||||
| | H : _ |- _ => try move x after H | ||||
| end. | ||||
|  | ||||
| Tactic Notation "assert_eq" ident(x) constr(v) := | ||||
| 	let H := fresh in | ||||
| 	assert (x = v) as H by reflexivity; | ||||
| 	clear H. | ||||
|  | ||||
| 	Tactic Notation "Case_aux" ident(x) constr(name) := | ||||
| 		first [ | ||||
| 		set (x := name); move_to_top x | ||||
| 		| assert_eq x name; move_to_top x | ||||
| 		| fail 1 "because we are working on a different case" ]. | ||||
|  | ||||
| 		Ltac Case name := Case_aux Case name. | ||||
| 		Ltac SCase name := Case_aux SCase name. | ||||
| 		Ltac SSCase name := Case_aux SSCase name. | ||||
| 		Ltac SSSCase name := Case_aux SSSCase name. | ||||
| 		Ltac SSSSCase name := Case_aux SSSSCase name. | ||||
| 		Ltac SSSSSCase name := Case_aux SSSSSCase name. | ||||
| 		Ltac SSSSSSCase name := Case_aux SSSSSSCase name. | ||||
| 		Ltac SSSSSSSCase name := Case_aux SSSSSSSCase name. | ||||
|  | ||||
| Theorem andb_true_elim1 : forall b c : bool, | ||||
| 				andb b c = true -> b = true. | ||||
| Proof. | ||||
| 	intros b c H. | ||||
| 	destruct b. | ||||
| 	Case "b = true". | ||||
| 		reflexivity. | ||||
| 	Case "b = false". | ||||
| 		rewrite <- H. reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_0_r : forall n : nat, n + O = n. | ||||
| Proof. | ||||
| 	intros n. induction n as [| n']. | ||||
| 	Case "n = 0". reflexivity. | ||||
| 	Case "n = S n'". simpl. rewrite -> IHn'. reflexivity. Qed. | ||||
|  | ||||
| Theorem minus_diag : forall n, | ||||
| 				minus n n = O. | ||||
| Proof. | ||||
| 	intros n. induction n as [| n']. | ||||
| 	Case "n = 0". | ||||
| 		simpl. reflexivity. | ||||
| 	Case "n = S n'". | ||||
| 		simpl. rewrite -> IHn'. reflexivity. Qed. | ||||
|  | ||||
|  | ||||
| Theorem mult_0_r : forall n:nat, | ||||
| 				n * O = O. | ||||
| Proof. | ||||
| 	intros n. induction n as [| n']. | ||||
| 	Case "n = 0". | ||||
| 		reflexivity. | ||||
| 	Case "n = S n'". | ||||
| 		simpl. rewrite -> IHn'. reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_n_Sm : forall n m : nat, | ||||
| 				S (n + m) = n + (S m). | ||||
| Proof. | ||||
| 	intros n m. induction n as [| n']. | ||||
| 	Case "n = 0". | ||||
| 		reflexivity. | ||||
| 	Case "n = S n'". | ||||
| 		simpl. rewrite -> IHn'. reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_assoc : forall n m p : nat, | ||||
| 					n + (m + p) = (n + m) + p. | ||||
| Proof. | ||||
| 	intros n m p. | ||||
| 	induction n as [| n']. | ||||
| 	reflexivity. | ||||
| 	simpl. | ||||
| 	rewrite -> IHn'. | ||||
| 	reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_distr : forall n m: nat, S (n + m) = n + (S m). | ||||
| Proof. | ||||
| 	intros n m.  induction n as [| n']. | ||||
| 	Case "n = 0". | ||||
| 		reflexivity. | ||||
| 	Case "n = S n'". | ||||
| 		simpl. rewrite -> IHn'. reflexivity. Qed. | ||||
|  | ||||
| Theorem mult_distr : forall n m: nat, n * ((S O) + m) = n * (S m). | ||||
| Proof. | ||||
| 	intros n m. | ||||
| 	induction n as [| n']. | ||||
| 	reflexivity. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem plus_comm : forall n m : nat, | ||||
| 	n + m = m + n. | ||||
| Proof. | ||||
| 	intros n m. | ||||
| 	induction n as [| n']. | ||||
| 	Case "n = 0". | ||||
| 		simpl. | ||||
| 		rewrite -> plus_0_r. | ||||
| 		reflexivity. | ||||
| 	Case "n = S n'". | ||||
| 		simpl. | ||||
| 		rewrite -> IHn'. | ||||
| 		rewrite -> plus_distr. | ||||
| 		reflexivity. Qed. | ||||
|  | ||||
| Fixpoint double (n:nat) := | ||||
| 	match n with | ||||
| 		| O => O | ||||
| 		| S n' => S (S (double n')) | ||||
| 	end. | ||||
|  | ||||
| Lemma double_plus : forall n, double n = n + n. | ||||
| Proof. | ||||
| 	intros n. induction n as [| n']. | ||||
| 	Case "n = 0". | ||||
| 		reflexivity. | ||||
| 	Case "n = S n'". | ||||
| 		simpl. rewrite -> IHn'. | ||||
| 		rewrite -> plus_distr. reflexivity. | ||||
| 		Qed. | ||||
|  | ||||
| Theorem beq_nat_refl : forall n : nat, | ||||
| 	true = beq_nat n n. | ||||
| Proof. | ||||
| 	intros n. induction n as [| n']. | ||||
| 	Case "n = 0". | ||||
| 		reflexivity. | ||||
| 	Case "n = S n". | ||||
| 		simpl. rewrite <- IHn'. | ||||
| 		reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_rearrange: forall n m p q : nat, | ||||
| 				(n + m) + (p + q) = (m + n) + (p + q). | ||||
| Proof. | ||||
| 	intros n m p q. | ||||
| 	assert(H: n + m = m + n). | ||||
| 		Case "Proof by assertion". | ||||
| 		rewrite -> plus_comm. reflexivity. | ||||
| 	rewrite -> H. reflexivity. Qed. | ||||
|  | ||||
| Theorem plus_swap : forall n m p: nat, | ||||
| 				n + (m + p) = m + (n + p). | ||||
| Proof. | ||||
| 	intros n m p. | ||||
| 	rewrite -> plus_assoc. | ||||
| 	assert(H: m + (n + p) = (m + n) + p). | ||||
| 	rewrite -> plus_assoc. | ||||
| 	reflexivity. | ||||
| 	rewrite -> H. | ||||
| 	assert(H2: m + n = n + m). | ||||
| 	rewrite -> plus_comm. | ||||
| 	reflexivity. | ||||
| 	rewrite -> H2. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem plus_swap' : forall n m p: nat, | ||||
| 				n + (m + p) = m + (n + p). | ||||
| Proof. | ||||
| 	intros n m p. | ||||
| 	rewrite -> plus_assoc. | ||||
| 	assert(H: m + (n + p) = (m + n) + p). | ||||
| 	rewrite -> plus_assoc. | ||||
| 	reflexivity. | ||||
| 	rewrite -> H. | ||||
| 	replace (m + n) with (n + m). | ||||
| 	rewrite -> plus_comm. | ||||
| 	reflexivity. | ||||
| 	rewrite -> plus_comm. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem mult_1_distr: forall m n: nat, | ||||
| 				n * ((S O) + m) = n * (S O) + n * m. | ||||
| Proof. | ||||
| 	intros n m. | ||||
| 	rewrite -> mult_1. | ||||
| 	rewrite -> plus_1_1. | ||||
| 	simpl. | ||||
| 	induction m as [|m']. | ||||
| 	simpl. | ||||
| 	reflexivity. | ||||
| 	simpl. | ||||
| 	rewrite -> plus_swap. | ||||
| 	rewrite <- IHm'. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem mult_comm: forall m n : nat, | ||||
| 				m * n = n * m. | ||||
| Proof. | ||||
| 	intros m n. | ||||
| 	induction n as [| n']. | ||||
| 	Case "n = 0". | ||||
| 		simpl. | ||||
| 		rewrite -> mult_0_r. | ||||
| 		reflexivity. | ||||
| 	Case "n = S n'". | ||||
| 		simpl. | ||||
| 		rewrite <- mult_distr. | ||||
| 		rewrite -> mult_1_distr. | ||||
| 		rewrite -> mult_1. | ||||
| 		rewrite -> IHn'. | ||||
| 		reflexivity. | ||||
| 		Qed. | ||||
|  | ||||
| Theorem evenb_next : forall n : nat, | ||||
| 				evenb n = evenb (S (S n)). | ||||
| Proof. | ||||
| 	intros n. | ||||
| Admitted. | ||||
|  | ||||
| Theorem negb_negb : forall n : bool, | ||||
| 				n = negb (negb n). | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	destruct n. | ||||
| 	reflexivity. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem evenb_n_oddb_Sn : forall n : nat, | ||||
| 				evenb n = negb (evenb (S n)). | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	induction n as [|n']. | ||||
| 	reflexivity. | ||||
| 	assert(H: evenb n' = evenb (S (S n'))). | ||||
| 	reflexivity. | ||||
| 	rewrite <- H. | ||||
| 	rewrite -> IHn'. | ||||
| 	rewrite <- negb_negb. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| (*Fixpoint bad (n : nat) : bool := | ||||
| 	match n with | ||||
| 		| O => true | ||||
| 		| S O => bad (S n) | ||||
| 		| S (S n') => bad n' | ||||
| 	end.*) | ||||
|  | ||||
| Theorem ble_nat_refl : forall n:nat, | ||||
| 				true = ble_nat n n. | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	induction n as [|n']. | ||||
| 	Case "n = 0". | ||||
| 		reflexivity. | ||||
| 	Case "n = S n". | ||||
| 		simpl. | ||||
| 		rewrite <- IHn'. | ||||
| 		reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem zero_nbeq_S : forall n: nat, | ||||
| 				beq_nat O (S n) = false. | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem andb_false_r : forall b : bool, | ||||
| 				andb b false = false. | ||||
| Proof. | ||||
| 	intros b. | ||||
| 	destruct b. | ||||
| 	reflexivity. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem plus_ble_compat_1 : forall n m p : nat, | ||||
| 				ble_nat n m = true -> ble_nat (p + n) (p + m) = true. | ||||
| Proof. | ||||
| 	intros n m p. | ||||
| 	intros H. | ||||
| 	induction p. | ||||
| 	Case "p = 0". | ||||
| 		simpl. | ||||
| 		rewrite -> H. | ||||
| 		reflexivity. | ||||
| 	Case "p = S p'". | ||||
| 		simpl. | ||||
| 		rewrite -> IHp. | ||||
| 		reflexivity. | ||||
| 		Qed. | ||||
|  | ||||
| Theorem S_nbeq_0 : forall n:nat, | ||||
| 				beq_nat (S n) O = false. | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem mult_1_1 : forall n:nat, (S O) * n = n. | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	simpl. | ||||
| 	rewrite -> plus_0_r. | ||||
| 	reflexivity. Qed. | ||||
|  | ||||
| Theorem all3_spec : forall b c : bool, | ||||
| 	orb (andb b c) | ||||
| 			(orb (negb b) | ||||
| 			 		 (negb c)) | ||||
| 	= true. | ||||
| Proof. | ||||
| 	intros b c. | ||||
| 	destruct b. | ||||
| 	destruct c. | ||||
| 	reflexivity. | ||||
| 	reflexivity. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Lemma mult_plus_1 : forall n m : nat, | ||||
| 			S(m + n) = m + (S n). | ||||
| Proof. | ||||
| 	intros n m. | ||||
| 	induction m. | ||||
| 	reflexivity. | ||||
| 	simpl. | ||||
| 	rewrite -> IHm. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem mult_mult : forall n m : nat, | ||||
| 	n * (S m) = n * m + n. | ||||
| Proof. | ||||
| 	intros n m. | ||||
| 	induction n. | ||||
| 	reflexivity. | ||||
| 	simpl. | ||||
| 	rewrite -> IHn. | ||||
| 	rewrite -> plus_assoc. | ||||
| 	rewrite -> mult_plus_1. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem mult_plus_distr_r : forall n m p:nat, | ||||
| 				(n + m) * p = (n * p) + (m * p). | ||||
| Proof. | ||||
| 	intros n m p. | ||||
| 	induction p. | ||||
| 	rewrite -> mult_0_r. | ||||
| 	rewrite -> mult_0_r. | ||||
| 	rewrite -> mult_0_r. | ||||
| 	reflexivity. | ||||
| 	rewrite -> mult_mult. | ||||
| 	rewrite -> mult_mult. | ||||
| 	rewrite -> mult_mult. | ||||
| 	rewrite -> IHp. | ||||
| 	assert(H1: ((n * p) + n) + (m * p + m) = (n * p) + (n + (m * p + m))). | ||||
| 	rewrite <- plus_assoc. | ||||
| 	reflexivity. | ||||
| 	rewrite -> H1. | ||||
| 	assert(H2: (n + (m * p + m)) = (m * p + (n + m))). | ||||
| 	rewrite -> plus_swap. | ||||
| 	reflexivity. | ||||
| 	rewrite -> H2. | ||||
| 	assert(H3: (n * p) + (m * p + (n + m)) = ((n * p ) + (m * p)) + (n + m)). | ||||
| 	rewrite -> plus_assoc. | ||||
| 	reflexivity. | ||||
| 	rewrite -> H3. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Theorem mult_assoc : forall n m p : nat, | ||||
| 				n * (m * p) = (n * m) * p. | ||||
| Proof. | ||||
| 	intros n m p. | ||||
| 	induction n. | ||||
| 	simpl. | ||||
| 	reflexivity. | ||||
| 	simpl. | ||||
| 	rewrite -> mult_plus_distr_r. | ||||
| 	rewrite -> IHn. | ||||
| 	reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| Inductive bin : Type := | ||||
| 	| BO : bin | ||||
| 	| D : bin -> bin | ||||
| 	| M : bin -> bin. | ||||
|  | ||||
| Fixpoint incbin (n : bin) : bin := | ||||
| 	match n with | ||||
| 		| BO => M (BO) | ||||
| 		| D n' => M n' | ||||
| 		| M n' => D (incbin n') | ||||
| 	end. | ||||
|  | ||||
| Fixpoint bin2un (n : bin) : nat := | ||||
| 	match n with | ||||
| 		| BO => O | ||||
| 		| D n' => double (bin2un n') | ||||
| 		| M n' => S (double (bin2un n')) | ||||
| 	end. | ||||
|  | ||||
| Theorem bin_comm : forall n : bin, | ||||
| 				bin2un(incbin n) = S (bin2un n). | ||||
| Proof. | ||||
| 	intros n. | ||||
| 	induction n. | ||||
| 		reflexivity. | ||||
| 		reflexivity. | ||||
| 		simpl. | ||||
| 		rewrite -> IHn. | ||||
| 		reflexivity. | ||||
| 	Qed. | ||||
|  | ||||
| End Playground1. | ||||
							
								
								
									
										85
									
								
								samples/Coq/Computation.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								samples/Coq/Computation.v
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| (** The definition of computations, used to represent interactive programs. *) | ||||
| Require Import Coq.NArith.NArith. | ||||
| Require Import ListString.All. | ||||
|  | ||||
| Local Open Scope type. | ||||
|  | ||||
| (** System calls. *) | ||||
| Module Command. | ||||
|   Inductive t := | ||||
|   | AskCard | ||||
|   | AskPIN | ||||
|   | CheckPIN (pin : N) | ||||
|   | AskAmount | ||||
|   | CheckAmount (amount : N) | ||||
|   | GiveCard | ||||
|   | GiveAmount (amount : N) | ||||
|   | ShowError (message : LString.t). | ||||
|  | ||||
|   (** The type of an answer for a command depends on the value of the command. *) | ||||
|   Definition answer (command : t) : Type := | ||||
|     match command with | ||||
|     | AskCard => bool (* If the given card seems valid. *) | ||||
|     | AskPIN => option N (* A number or cancellation. *) | ||||
|     | CheckPIN _ => bool (* If the PIN number is valid. *) | ||||
|     | AskAmount => option N (* A number or cancellation. *) | ||||
|     | CheckAmount _ => bool (* If the amount can be withdrawn. *) | ||||
|     | GiveCard => bool (* If the card was given. *) | ||||
|     | GiveAmount _ => bool (* If the money was given. *) | ||||
|     | ShowError _ => unit (* Show an error message. *) | ||||
|     end. | ||||
| End Command. | ||||
|  | ||||
| (** Computations with I/Os. *) | ||||
| Module C. | ||||
|   (** A computation can either does nothing, or do a system call and wait | ||||
|       for the answer to run another computation. *) | ||||
|   Inductive t : Type := | ||||
|   | Ret : t | ||||
|   | Call : forall (command : Command.t), (Command.answer command -> t) -> t. | ||||
|   Arguments Ret. | ||||
|   Arguments Call _ _. | ||||
|  | ||||
|   (** Some optional notations. *) | ||||
|   Module Notations. | ||||
|     (** A nicer notation for `Ret`. *) | ||||
|     Definition ret : t := | ||||
|       Ret. | ||||
|  | ||||
|     (** We define an explicit apply function so that Coq does not try to expand | ||||
|         the notations everywhere. *) | ||||
|     Definition apply {A B} (f : A -> B) (x : A) := f x. | ||||
|  | ||||
|     (** System call. *) | ||||
|     Notation "'call!' answer ':=' command 'in' X" := | ||||
|       (Call command (fun answer => X)) | ||||
|       (at level 200, answer ident, command at level 100, X at level 200). | ||||
|  | ||||
|     (** System call with typed answer. *) | ||||
|     Notation "'call!' answer : A ':=' command 'in' X" := | ||||
|       (Call command (fun (answer : A) => X)) | ||||
|       (at level 200, answer ident, command at level 100, A at level 200, X at level 200). | ||||
|  | ||||
|     (** System call ignoring the answer. *) | ||||
|     Notation "'do_call!' command 'in' X" := | ||||
|       (Call command (fun _ => X)) | ||||
|       (at level 200, command at level 100, X at level 200). | ||||
|  | ||||
|     (** This notation is useful to compose computations which wait for a | ||||
|         continuation. We do not have an explicit bind operator to simplify the | ||||
|         language and the proofs. *) | ||||
|     Notation "'let!' x ':=' X 'in' Y" := | ||||
|       (apply X (fun x => Y)) | ||||
|       (at level 200, x ident, X at level 100, Y at level 200). | ||||
|  | ||||
|     (** Let with a typed answer. *) | ||||
|     Notation "'let!' x : A ':=' X 'in' Y" := | ||||
|       (apply X (fun (x : A) => Y)) | ||||
|       (at level 200, x ident, X at level 100, A at level 200, Y at level 200). | ||||
|  | ||||
|     (** Let ignoring the answer. *) | ||||
|     Notation "'do!' X 'in' Y" := | ||||
|       (apply X (fun _ => Y)) | ||||
|       (at level 200, X at level 100, Y at level 200). | ||||
|   End Notations. | ||||
| End C. | ||||
| @@ -1,290 +0,0 @@ | ||||
| (** A development of Treesort on Heap trees. It has an average | ||||
|     complexity of O(n.log n) but of O(n²) in the worst case (e.g. if | ||||
|     the list is already sorted) *) | ||||
|  | ||||
| (* G. Huet 1-9-95 uses Multiset *) | ||||
|  | ||||
| Require Import List Multiset PermutSetoid Relations Sorting. | ||||
|  | ||||
| Section defs. | ||||
|  | ||||
|   (** * Trees and heap trees *) | ||||
|  | ||||
|   (** ** Definition of trees over an ordered set *) | ||||
|  | ||||
|   Variable A : Type. | ||||
|   Variable leA : relation A. | ||||
|   Variable eqA : relation A. | ||||
|  | ||||
|   Let gtA (x y:A) := ~ leA x y. | ||||
|  | ||||
|   Hypothesis leA_dec : forall x y:A, {leA x y} + {leA y x}. | ||||
|   Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}. | ||||
|   Hypothesis leA_refl : forall x y:A, eqA x y -> leA x y. | ||||
|   Hypothesis leA_trans : forall x y z:A, leA x y -> leA y z -> leA x z. | ||||
|   Hypothesis leA_antisym : forall x y:A, leA x y -> leA y x -> eqA x y. | ||||
|  | ||||
|   Hint Resolve leA_refl. | ||||
|   Hint Immediate eqA_dec leA_dec leA_antisym. | ||||
|  | ||||
|   Let emptyBag := EmptyBag A. | ||||
|   Let singletonBag := SingletonBag _ eqA_dec. | ||||
|  | ||||
|   Inductive Tree := | ||||
|     | Tree_Leaf : Tree | ||||
|     | Tree_Node : A -> Tree -> Tree -> Tree. | ||||
|  | ||||
|   (** [a] is lower than a Tree [T] if [T] is a Leaf | ||||
|       or [T] is a Node holding [b>a] *) | ||||
|  | ||||
|   Definition leA_Tree (a:A) (t:Tree) := | ||||
|     match t with | ||||
|       | Tree_Leaf => True | ||||
|       | Tree_Node b T1 T2 => leA a b | ||||
|     end. | ||||
|  | ||||
|   Lemma leA_Tree_Leaf : forall a:A, leA_Tree a Tree_Leaf. | ||||
|   Proof. | ||||
|     simpl; auto with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|   Lemma leA_Tree_Node : | ||||
|     forall (a b:A) (G D:Tree), leA a b -> leA_Tree a (Tree_Node b G D). | ||||
|   Proof. | ||||
|     simpl; auto with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|  | ||||
|   (** ** The heap property *) | ||||
|  | ||||
|   Inductive is_heap : Tree -> Prop := | ||||
|     | nil_is_heap : is_heap Tree_Leaf | ||||
|     | node_is_heap : | ||||
|       forall (a:A) (T1 T2:Tree), | ||||
|         leA_Tree a T1 -> | ||||
|         leA_Tree a T2 -> | ||||
|         is_heap T1 -> is_heap T2 -> is_heap (Tree_Node a T1 T2). | ||||
|  | ||||
|   Lemma invert_heap : | ||||
|     forall (a:A) (T1 T2:Tree), | ||||
|       is_heap (Tree_Node a T1 T2) -> | ||||
|       leA_Tree a T1 /\ leA_Tree a T2 /\ is_heap T1 /\ is_heap T2. | ||||
|   Proof. | ||||
|     intros; inversion H; auto with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|   (* This lemma ought to be generated automatically by the Inversion tools *) | ||||
|   Lemma is_heap_rect : | ||||
|     forall P:Tree -> Type, | ||||
|       P Tree_Leaf -> | ||||
|       (forall (a:A) (T1 T2:Tree), | ||||
|         leA_Tree a T1 -> | ||||
|         leA_Tree a T2 -> | ||||
|         is_heap T1 -> P T1 -> is_heap T2 -> P T2 -> P (Tree_Node a T1 T2)) -> | ||||
|       forall T:Tree, is_heap T -> P T. | ||||
|   Proof. | ||||
|     simple induction T; auto with datatypes. | ||||
|     intros a G PG D PD PN. | ||||
|     elim (invert_heap a G D); auto with datatypes. | ||||
|     intros H1 H2; elim H2; intros H3 H4; elim H4; intros. | ||||
|     apply X0; auto with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|   (* This lemma ought to be generated automatically by the Inversion tools *) | ||||
|   Lemma is_heap_rec : | ||||
|     forall P:Tree -> Set, | ||||
|       P Tree_Leaf -> | ||||
|       (forall (a:A) (T1 T2:Tree), | ||||
|         leA_Tree a T1 -> | ||||
|         leA_Tree a T2 -> | ||||
|         is_heap T1 -> P T1 -> is_heap T2 -> P T2 -> P (Tree_Node a T1 T2)) -> | ||||
|       forall T:Tree, is_heap T -> P T. | ||||
|   Proof. | ||||
|     simple induction T; auto with datatypes. | ||||
|     intros a G PG D PD PN. | ||||
|     elim (invert_heap a G D); auto with datatypes. | ||||
|     intros H1 H2; elim H2; intros H3 H4; elim H4; intros. | ||||
|     apply X; auto with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|   Lemma low_trans : | ||||
|     forall (T:Tree) (a b:A), leA a b -> leA_Tree b T -> leA_Tree a T. | ||||
|   Proof. | ||||
|     simple induction T; auto with datatypes. | ||||
|     intros; simpl; apply leA_trans with b; auto with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|   (** ** Merging two sorted lists *) | ||||
|  | ||||
|   Inductive merge_lem (l1 l2:list A) : Type := | ||||
|     merge_exist : | ||||
|     forall l:list A, | ||||
|       Sorted leA l -> | ||||
|       meq (list_contents _ eqA_dec l) | ||||
|       (munion (list_contents _ eqA_dec l1) (list_contents _ eqA_dec l2)) -> | ||||
|       (forall a, HdRel leA a l1 -> HdRel leA a l2 -> HdRel leA a l) -> | ||||
|       merge_lem l1 l2. | ||||
|   Require Import Morphisms. | ||||
|  | ||||
|   Instance: Equivalence (@meq A). | ||||
|   Proof. constructor; auto with datatypes. red. apply meq_trans. Defined. | ||||
|  | ||||
|   Instance: Proper (@meq A ++> @meq _ ++> @meq _) (@munion A). | ||||
|   Proof. intros x y H x' y' H'. now apply meq_congr. Qed. | ||||
|  | ||||
|   Lemma merge : | ||||
|     forall l1:list A, Sorted leA l1 -> | ||||
|     forall l2:list A, Sorted leA l2 -> merge_lem l1 l2. | ||||
|   Proof. | ||||
|     fix 1; intros; destruct l1. | ||||
|     apply merge_exist with l2; auto with datatypes. | ||||
|     rename l1 into l. | ||||
|     revert l2 H0. fix 1. intros. | ||||
|     destruct l2 as [|a0 l0]. | ||||
|     apply merge_exist with (a :: l); simpl; auto with datatypes. | ||||
|     elim (leA_dec a a0); intros. | ||||
|  | ||||
|     (* 1 (leA a a0) *) | ||||
|     apply Sorted_inv in H. destruct H. | ||||
|     destruct (merge l H (a0 :: l0) H0). | ||||
|     apply merge_exist with (a :: l1). clear merge merge0. | ||||
|       auto using cons_sort, cons_leA with datatypes. | ||||
|     simpl. rewrite m. now rewrite munion_ass. | ||||
|     intros. apply cons_leA. | ||||
|     apply (@HdRel_inv _ leA) with l; trivial with datatypes. | ||||
|  | ||||
|     (* 2 (leA a0 a) *) | ||||
|     apply Sorted_inv in H0. destruct H0. | ||||
|     destruct (merge0 l0 H0). clear merge merge0. | ||||
|     apply merge_exist with (a0 :: l1); | ||||
|       auto using cons_sort, cons_leA with datatypes. | ||||
|     simpl; rewrite m. simpl. setoid_rewrite munion_ass at 1. rewrite munion_comm. | ||||
|     repeat rewrite munion_ass. setoid_rewrite munion_comm at 3. reflexivity. | ||||
|     intros. apply cons_leA. | ||||
|     apply (@HdRel_inv _ leA) with l0; trivial with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|   (** ** From trees to multisets *) | ||||
|  | ||||
|   (** contents of a tree as a multiset *) | ||||
|  | ||||
|   (** Nota Bene : In what follows the definition of SingletonBag | ||||
|       in not used. Actually, we could just take as postulate: | ||||
|       [Parameter SingletonBag : A->multiset].  *) | ||||
|  | ||||
|   Fixpoint contents (t:Tree) : multiset A := | ||||
|     match t with | ||||
|       | Tree_Leaf => emptyBag | ||||
|       | Tree_Node a t1 t2 => | ||||
|         munion (contents t1) (munion (contents t2) (singletonBag a)) | ||||
|     end. | ||||
|  | ||||
|  | ||||
|   (** equivalence of two trees is equality of corresponding multisets *) | ||||
|   Definition equiv_Tree (t1 t2:Tree) := meq (contents t1) (contents t2). | ||||
|  | ||||
|  | ||||
|  | ||||
|   (** * From lists to sorted lists *) | ||||
|  | ||||
|   (** ** Specification of heap insertion *) | ||||
|  | ||||
|   Inductive insert_spec (a:A) (T:Tree) : Type := | ||||
|     insert_exist : | ||||
|     forall T1:Tree, | ||||
|       is_heap T1 -> | ||||
|       meq (contents T1) (munion (contents T) (singletonBag a)) -> | ||||
|       (forall b:A, leA b a -> leA_Tree b T -> leA_Tree b T1) -> | ||||
|       insert_spec a T. | ||||
|  | ||||
|  | ||||
|   Lemma insert : forall T:Tree, is_heap T -> forall a:A, insert_spec a T. | ||||
|   Proof. | ||||
|     simple induction 1; intros. | ||||
|     apply insert_exist with (Tree_Node a Tree_Leaf Tree_Leaf); | ||||
|       auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes. | ||||
|     simpl; unfold meq, munion; auto using node_is_heap with datatypes. | ||||
|     elim (leA_dec a a0); intros. | ||||
|     elim (X a0); intros. | ||||
|     apply insert_exist with (Tree_Node a T2 T0); | ||||
|       auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes. | ||||
|     simpl; apply treesort_twist1; trivial with datatypes. | ||||
|     elim (X a); intros T3 HeapT3 ConT3 LeA. | ||||
|     apply insert_exist with (Tree_Node a0 T2 T3); | ||||
|       auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes. | ||||
|     apply node_is_heap; auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes. | ||||
|     apply low_trans with a; auto with datatypes. | ||||
|     apply LeA; auto with datatypes. | ||||
|     apply low_trans with a; auto with datatypes. | ||||
|     simpl; apply treesort_twist2; trivial with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|  | ||||
|   (** ** Building a heap from a list *) | ||||
|  | ||||
|   Inductive build_heap (l:list A) : Type := | ||||
|     heap_exist : | ||||
|     forall T:Tree, | ||||
|       is_heap T -> | ||||
|       meq (list_contents _ eqA_dec l) (contents T) -> build_heap l. | ||||
|  | ||||
|   Lemma list_to_heap : forall l:list A, build_heap l. | ||||
|   Proof. | ||||
|     simple induction l. | ||||
|     apply (heap_exist nil Tree_Leaf); auto with datatypes. | ||||
|     simpl; unfold meq; exact nil_is_heap. | ||||
|     simple induction 1. | ||||
|     intros T i m; elim (insert T i a). | ||||
|     intros; apply heap_exist with T1; simpl; auto with datatypes. | ||||
|     apply meq_trans with (munion (contents T) (singletonBag a)). | ||||
|     apply meq_trans with (munion (singletonBag a) (contents T)). | ||||
|     apply meq_right; trivial with datatypes. | ||||
|     apply munion_comm. | ||||
|     apply meq_sym; trivial with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|  | ||||
|   (** ** Building the sorted list *) | ||||
|  | ||||
|   Inductive flat_spec (T:Tree) : Type := | ||||
|     flat_exist : | ||||
|     forall l:list A, | ||||
|       Sorted leA l -> | ||||
|       (forall a:A, leA_Tree a T -> HdRel leA a l) -> | ||||
|       meq (contents T) (list_contents _ eqA_dec l) -> flat_spec T. | ||||
|  | ||||
|   Lemma heap_to_list : forall T:Tree, is_heap T -> flat_spec T. | ||||
|   Proof. | ||||
|     intros T h; elim h; intros. | ||||
|     apply flat_exist with (nil (A:=A)); auto with datatypes. | ||||
|     elim X; intros l1 s1 i1 m1; elim X0; intros l2 s2 i2 m2. | ||||
|     elim (merge _ s1 _ s2); intros. | ||||
|     apply flat_exist with (a :: l); simpl; auto with datatypes. | ||||
|     apply meq_trans with | ||||
|       (munion (list_contents _ eqA_dec l1) | ||||
|         (munion (list_contents _ eqA_dec l2) (singletonBag a))). | ||||
|     apply meq_congr; auto with datatypes. | ||||
|     apply meq_trans with | ||||
|       (munion (singletonBag a) | ||||
|         (munion (list_contents _ eqA_dec l1) (list_contents _ eqA_dec l2))). | ||||
|     apply munion_rotate. | ||||
|     apply meq_right; apply meq_sym; trivial with datatypes. | ||||
|   Qed. | ||||
|  | ||||
|  | ||||
|   (** * Specification of treesort *) | ||||
|  | ||||
|   Theorem treesort : | ||||
|     forall l:list A, | ||||
|     {m : list A | Sorted leA m & permutation _ eqA_dec l m}. | ||||
|   Proof. | ||||
|     intro l; unfold permutation. | ||||
|     elim (list_to_heap l). | ||||
|     intros. | ||||
|     elim (heap_to_list T); auto with datatypes. | ||||
|     intros. | ||||
|     exists l0; auto with datatypes. | ||||
|     apply meq_trans with (contents T); trivial with datatypes. | ||||
|   Qed. | ||||
|  | ||||
| End defs. | ||||
							
								
								
									
										5944
									
								
								samples/Coq/JsCorrectness.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5944
									
								
								samples/Coq/JsCorrectness.v
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										249
									
								
								samples/Coq/JsInterpreterExtraction.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								samples/Coq/JsInterpreterExtraction.v
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,249 @@ | ||||
| Set Implicit Arguments. | ||||
| Require Import JsSyntax JsInterpreterMonads JsInterpreter JsInit. | ||||
| Require Import LibFix LibList. | ||||
|  | ||||
| Require Export Shared. | ||||
| Require Export LibTactics LibLogic LibReflect LibList | ||||
|   LibOperation LibStruct LibNat LibEpsilon LibFunc LibHeap. | ||||
| Require Flocq.Appli.Fappli_IEEE Flocq.Appli.Fappli_IEEE_bits. | ||||
|  | ||||
|  | ||||
|  | ||||
| (* Here stands some commands to extract relatively correctly the interpreter to Ocaml. *) | ||||
| Extraction Language Ocaml. | ||||
|  | ||||
| Require Import ExtrOcamlBasic. | ||||
| Require Import ExtrOcamlNatInt. | ||||
| Require Import ExtrOcamlString. | ||||
|  | ||||
| (* Optimal fixpoint. *) | ||||
| Extraction Inline FixFun3 FixFun3Mod FixFun4 FixFun4Mod FixFunMod curry3 uncurry3 curry4 uncurry4. | ||||
| (* As classical logic statements are now unused, they should not be extracted | ||||
|    (otherwise, useless errors will be launched). *) | ||||
| Extraction Inline epsilon epsilon_def classicT arbitrary indefinite_description Inhab_witness Fix isTrue. | ||||
|  | ||||
| (**************************************************************) | ||||
| (** ** Numerical values *) | ||||
|  | ||||
| (* number *) | ||||
|  | ||||
| Extract Inductive positive => float | ||||
| [ "(fun p -> 1. +. (2. *. p))" | ||||
|   "(fun p -> 2. *. p)" | ||||
|   "1." ] | ||||
| "(fun f2p1 f2p f1 p -> | ||||
| if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.)))". | ||||
|  | ||||
| Extract Inductive Z => float [ "0." "" "(~-.)" ] | ||||
| "(fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z))". | ||||
|  | ||||
| Extract Inductive N => float [ "0." "" ] | ||||
| "(fun f0 fp n -> if n=0. then f0 () else fp n)". | ||||
|  | ||||
| Extract Constant Z.add => "(+.)". | ||||
| Extract Constant Z.succ => "(+.) 1.". | ||||
| Extract Constant Z.pred => "(fun x -> x -. 1.)". | ||||
| Extract Constant Z.sub => "(-.)". | ||||
| Extract Constant Z.mul => "( *. )". | ||||
| Extract Constant Z.opp => "(~-.)". | ||||
| Extract Constant Z.abs => "abs_float". | ||||
| Extract Constant Z.min => "min". | ||||
| Extract Constant Z.max => "max". | ||||
| Extract Constant Z.compare => | ||||
|  "fun x y -> if x=y then Eq else if x<y then Lt else Gt". | ||||
|  | ||||
| Extract Constant Pos.add => "(+.)". | ||||
| Extract Constant Pos.succ => "(+.) 1.". | ||||
| Extract Constant Pos.pred => "(fun x -> x -. 1.)". | ||||
| Extract Constant Pos.sub => "(-.)". | ||||
| Extract Constant Pos.mul => "( *. )". | ||||
| Extract Constant Pos.min => "min". | ||||
| Extract Constant Pos.max => "max". | ||||
| Extract Constant Pos.compare => | ||||
|  "fun x y -> if x=y then Eq else if x<y then Lt else Gt". | ||||
| Extract Constant Pos.compare_cont => | ||||
|  "fun x y c -> if x=y then c else if x<y then Lt else Gt". | ||||
|  | ||||
| Extract Constant N.add => "(+.)". | ||||
| Extract Constant N.succ => "(+.) 1.". | ||||
| Extract Constant N.pred => "(fun x -> x -. 1.)". | ||||
| Extract Constant N.sub => "(-.)". | ||||
| Extract Constant N.mul => "( *. )". | ||||
| Extract Constant N.min => "min". | ||||
| Extract Constant N.max => "max". | ||||
| Extract Constant N.div => "(fun x y -> if x = 0. then 0. else floor (x /. y))". | ||||
| Extract Constant N.modulo => "mod_float". | ||||
| Extract Constant N.compare => | ||||
|  "fun x y -> if x=y then Eq else if x<y then Lt else Gt". | ||||
|  | ||||
| Extract Inductive Fappli_IEEE.binary_float => float [ | ||||
|   "(fun s -> if s then (0.) else (-0.))" | ||||
|   "(fun s -> if s then infinity else neg_infinity)" | ||||
|   "nan" | ||||
|   "(fun (s, m, e) -> failwith ""FIXME: No extraction from binary float allowed yet."")" | ||||
| ].  | ||||
|  | ||||
| Extract Constant JsNumber.of_int => "fun x -> x". | ||||
|  | ||||
| Extract Constant JsNumber.nan => "nan". | ||||
| Extract Constant JsNumber.zero => "0.". | ||||
| Extract Constant JsNumber.neg_zero => "(-0.)". | ||||
| Extract Constant JsNumber.one => "1.". | ||||
| Extract Constant JsNumber.infinity => "infinity". | ||||
| Extract Constant JsNumber.neg_infinity => "neg_infinity". | ||||
| Extract Constant JsNumber.max_value => "max_float". | ||||
| Extract Constant JsNumber.min_value => "(Int64.float_of_bits Int64.one)". | ||||
| Extract Constant JsNumber.pi => "(4. *. atan 1.)". | ||||
| Extract Constant JsNumber.e => "(exp 1.)". | ||||
| Extract Constant JsNumber.ln2 => "(log 2.)". | ||||
| Extract Constant JsNumber.floor => "floor". | ||||
| Extract Constant JsNumber.absolute => "abs_float". | ||||
|  | ||||
| Extract Constant JsNumber.from_string => | ||||
|   "(fun s -> | ||||
|     try | ||||
|       let s = (String.concat """" (List.map (String.make 1) s)) in | ||||
|       if s = """" then 0. else float_of_string s | ||||
|     with Failure ""float_of_string"" -> nan) | ||||
|    (* Note that we're using `float_of_string' there, which does not have the same | ||||
|       behavior than JavaScript.  For instance it will read ""022"" as 22 instead of | ||||
|       18, which should be the JavaScript result for it. *)". | ||||
|  | ||||
| Extract Constant JsNumber.to_string => | ||||
|   "(fun f ->  | ||||
|     prerr_string (""Warning:  JsNumber.to_string called.  This might be responsible for errors.  Argument value:  "" ^ string_of_float f ^ "".""); | ||||
|     prerr_newline(); | ||||
|     let string_of_number n = | ||||
|       let sfn = string_of_float n in | ||||
|       (if (sfn = ""inf"") then ""Infinity"" else | ||||
|        if (sfn = ""-inf"") then ""-Infinity"" else | ||||
|        if (sfn = ""nan"") then ""NaN"" else | ||||
|        let inum = int_of_float n in | ||||
|        if (float_of_int inum = n) then (string_of_int inum) else (string_of_float n)) in | ||||
|     let ret = ref [] in (* Ugly, but the API for OCaml string is not very functional... *) | ||||
|     String.iter (fun c -> ret := c :: !ret) (string_of_number f); | ||||
|     List.rev !ret) | ||||
|    (* Note that this is ugly, we should use the spec of JsNumber.to_string here (9.8.1). *)". | ||||
|  | ||||
| Extract Constant JsNumber.add => "(+.)". | ||||
| Extract Constant JsNumber.sub => "(-.)". | ||||
| Extract Constant JsNumber.mult => "( *. )". | ||||
| Extract Constant JsNumber.div => "(/.)". | ||||
| Extract Constant JsNumber.fmod => "mod_float". | ||||
| Extract Constant JsNumber.neg => "(~-.)". | ||||
| Extract Constant JsNumber.sign => "(fun f -> float_of_int (compare f 0.))". | ||||
| Extract Constant JsNumber.number_comparable => "(fun n1 n2 -> 0 = compare n1 n2)". | ||||
| Extract Constant JsNumber.lt_bool => "(<)". | ||||
|  | ||||
| Extract Constant JsNumber.to_int32 =>  | ||||
| "fun n -> | ||||
|   match classify_float n with | ||||
|   | FP_normal | FP_subnormal -> | ||||
|     let i32 = 2. ** 32. in | ||||
|     let i31 = 2. ** 31. in | ||||
|     let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in | ||||
|     let int32bit = | ||||
|       let smod = mod_float posint i32 in | ||||
|       if smod < 0. then smod +. i32 else smod | ||||
|     in | ||||
|     (if int32bit >= i31 then int32bit -. i32 else int32bit) | ||||
|   | _ -> 0.". (* LATER:  do in Coq.  Spec is 9.5, p. 47.*) | ||||
|  | ||||
| Extract Constant JsNumber.to_uint32 => | ||||
| "fun n -> | ||||
|   match classify_float n with | ||||
|   | FP_normal | FP_subnormal -> | ||||
|     let i32 = 2. ** 32. in | ||||
|     let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in | ||||
|     let int32bit = | ||||
|       let smod = mod_float posint i32 in | ||||
|       if smod < 0. then smod +. i32 else smod | ||||
|     in | ||||
|     int32bit | ||||
|   | _ -> 0.". (* LAER:  do in Coq.  Spec is 9.6, p47.*) | ||||
|  | ||||
| Extract Constant JsNumber.modulo_32 => "(fun x -> let r = mod_float x 32. in if x < 0. then r +. 32. else r)". | ||||
| Extract Constant JsNumber.int32_bitwise_not => "fun x -> Int32.to_float (Int32.lognot (Int32.of_float x))". | ||||
| Extract Constant JsNumber.int32_bitwise_and => "fun x y -> Int32.to_float (Int32.logand (Int32.of_float x) (Int32.of_float y))". | ||||
| Extract Constant JsNumber.int32_bitwise_or => "fun x y -> Int32.to_float (Int32.logor (Int32.of_float x) (Int32.of_float y))". | ||||
| Extract Constant JsNumber.int32_bitwise_xor => "fun x y -> Int32.to_float (Int32.logxor (Int32.of_float x) (Int32.of_float y))". | ||||
| Extract Constant JsNumber.int32_left_shift => "(fun x y -> Int32.to_float (Int32.shift_left (Int32.of_float x) (int_of_float y)))". | ||||
| Extract Constant JsNumber.int32_right_shift => "(fun x y -> Int32.to_float (Int32.shift_right (Int32.of_float x) (int_of_float y)))". | ||||
| Extract Constant JsNumber.uint32_right_shift =>  | ||||
| "(fun x y -> | ||||
|   let i31 = 2. ** 31. in | ||||
|   let i32 = 2. ** 32. in | ||||
|   let newx = if x >= i31 then x -. i32 else x in | ||||
|   let r = Int32.to_float (Int32.shift_right_logical (Int32.of_float newx) (int_of_float y)) in | ||||
|   if r < 0. then r +. i32 else r)". | ||||
|  | ||||
| Extract Constant int_of_char => "(fun c -> float_of_int (int_of_char c))". | ||||
|  | ||||
| Extract Constant ascii_comparable => "(=)". | ||||
| Extract Constant lt_int_decidable => "(<)". | ||||
| Extract Constant le_int_decidable => "(<=)". | ||||
| Extract Constant ge_nat_decidable => "(>=)". | ||||
|  | ||||
| (* TODO ARTHUR:  This TLC lemma does not extract to something computable... whereas it should! *) | ||||
| Extract Constant prop_eq_decidable => "(=)". | ||||
|  | ||||
| Extract Constant env_loc_global_env_record => "0". | ||||
|  | ||||
| (* The following functions make pattern matches with floats and shall thus be removed. *) | ||||
| Extraction Inline Fappli_IEEE.Bplus Fappli_IEEE.binary_normalize Fappli_IEEE_bits.b64_plus. | ||||
| Extraction Inline Fappli_IEEE.Bmult Fappli_IEEE.Bmult_FF Fappli_IEEE_bits.b64_mult. | ||||
| Extraction Inline Fappli_IEEE.Bdiv Fappli_IEEE_bits.b64_div. | ||||
|  | ||||
| (* New options for the interpreter to work in Coq 8.4 *) | ||||
| Set Extraction AccessOpaque. | ||||
|  | ||||
| (* These parameters are implementation-dependant according to the spec. | ||||
|    I've chosed some very simple values, but we could choose another thing for them. *) | ||||
| Extract Constant object_prealloc_global_proto => "(Coq_value_prim Coq_prim_null)". | ||||
| Extract Constant object_prealloc_global_class => "( | ||||
|   let rec aux s = function | ||||
|   | 0 -> [] | ||||
|   | n -> let n' = n - 1 in | ||||
|     s.[n'] :: aux s n' | ||||
|   in let aux2 s = | ||||
|     List.rev (aux s (String.length s)) | ||||
|   in aux2 ""GlobalClass"")". | ||||
|  | ||||
|  | ||||
| (* Parsing *) | ||||
| Extract Constant parse_pickable => "(fun s strict -> | ||||
|     let str = String.concat """" (List.map (String.make 1) s) in | ||||
|     try | ||||
|       let parserExp = Parser_main.exp_from_string ~force_strict:strict str in | ||||
|       Some (JsSyntaxInfos.add_infos_prog strict | ||||
|         (Translate_syntax.exp_to_prog parserExp)) | ||||
|     with | ||||
|     (* | Translate_syntax.CoqSyntaxDoesNotSupport _ -> assert false (* Temporary *) *) | ||||
|     | Parser.ParserFailure _ | ||||
|     | Parser.InvalidArgument -> | ||||
|       prerr_string (""Warning:  Parser error on eval.  Input string:  \"""" ^ str ^ ""\""\n""); | ||||
|       None | ||||
|   )". | ||||
|  | ||||
|  | ||||
| (* Debugging *) | ||||
| Extract Inlined Constant not_yet_implemented_because => "(fun s -> | ||||
|   print_endline (__LOC__ ^ "": Not implemented because: "" ^ Prheap.string_of_char_list s) ; | ||||
|   Coq_result_not_yet_implemented)". | ||||
| Extract Inlined Constant impossible_because => "(fun s -> | ||||
|   print_endline (__LOC__ ^ "": Stuck because: "" ^ Prheap.string_of_char_list s) ; | ||||
|   Coq_result_impossible)". | ||||
| Extract Inlined Constant impossible_with_heap_because => "(fun s message -> | ||||
|   print_endline (__LOC__ ^ "": Stuck!\nState:  "" ^ Prheap.prstate true s | ||||
|     ^ ""\nMessage:\t"" ^ Prheap.string_of_char_list message) ; | ||||
|   Coq_result_impossible)". | ||||
|  | ||||
|  | ||||
| (* Final Extraction *) | ||||
| Extraction Blacklist string list bool. | ||||
| Separate Extraction runs run_javascript. | ||||
|  | ||||
|  | ||||
|  | ||||
| (* -- LATER: extract inequality_test_string in more efficient way*) | ||||
|  | ||||
							
								
								
									
										1051
									
								
								samples/Coq/JsNumber.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1051
									
								
								samples/Coq/JsNumber.v
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1766
									
								
								samples/Coq/JsPrettyInterm.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1766
									
								
								samples/Coq/JsPrettyInterm.v
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										42
									
								
								samples/Coq/Main.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								samples/Coq/Main.v
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| Require Import FunctionNinjas.All. | ||||
| Require Import ListString.All. | ||||
| Require Import Computation. | ||||
|  | ||||
| Import C.Notations. | ||||
|  | ||||
| Definition error (message : LString.t) : C.t := | ||||
|   do_call! Command.ShowError message in | ||||
|   ret. | ||||
|  | ||||
| Definition main : C.t := | ||||
|   call! card_is_valid := Command.AskCard in | ||||
|   if card_is_valid then | ||||
|     call! pin := Command.AskPIN in | ||||
|     match pin with | ||||
|     | None => error @@ LString.s "No PIN given." | ||||
|     | Some pin => | ||||
|       call! pin_is_valid := Command.CheckPIN pin in | ||||
|       if pin_is_valid then | ||||
|         call! ask_amount := Command.AskAmount in | ||||
|         match ask_amount with | ||||
|         | None => error @@ LString.s "No amount given." | ||||
|         | Some amount => | ||||
|           call! amount_is_valid := Command.CheckAmount amount in | ||||
|           if amount_is_valid then | ||||
|             call! card_is_given := Command.GiveCard in | ||||
|             if card_is_given then | ||||
|               call! amount_is_given := Command.GiveAmount amount in | ||||
|               if amount_is_given then | ||||
|                 ret | ||||
|               else | ||||
|                 error @@ LString.s "Cannot give you the amount. Please contact your bank." | ||||
|             else | ||||
|               error @@ LString.s "Cannot give you back the card. Please contact your bank." | ||||
|           else | ||||
|             error @@ LString.s "Invalid amount." | ||||
|         end | ||||
|       else | ||||
|         error @@ LString.s "Invalid PIN." | ||||
|     end | ||||
|   else | ||||
|     error @@ LString.s "Invalid card.". | ||||
| @@ -1,539 +0,0 @@ | ||||
| Require Import Omega Relations Multiset SetoidList. | ||||
|  | ||||
| (** This file is deprecated, use [Permutation.v] instead. | ||||
|  | ||||
|     Indeed, this file defines a notion of permutation based on | ||||
|     multisets (there exists a permutation between two lists iff every | ||||
|     elements have the same multiplicity in the two lists) which | ||||
|     requires a more complex apparatus (the equipment of the domain | ||||
|     with a decidable equality) than [Permutation] in [Permutation.v]. | ||||
|  | ||||
|     The relation between the two relations are in lemma | ||||
|     [permutation_Permutation]. | ||||
|  | ||||
|     File [Permutation] concerns Leibniz equality : it shows in particular | ||||
|     that [List.Permutation] and [permutation] are equivalent in this context. | ||||
| *) | ||||
|  | ||||
| Set Implicit Arguments. | ||||
|  | ||||
| Local Notation "[ ]" := nil. | ||||
| Local Notation "[ a ; .. ; b ]" := (a :: .. (b :: []) ..). | ||||
|  | ||||
| Section Permut. | ||||
|  | ||||
| (** * From lists to multisets *) | ||||
|  | ||||
| Variable A : Type. | ||||
| Variable eqA : relation A. | ||||
| Hypothesis eqA_equiv : Equivalence eqA. | ||||
| Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}. | ||||
|  | ||||
| Let emptyBag := EmptyBag A. | ||||
| Let singletonBag := SingletonBag _ eqA_dec. | ||||
|  | ||||
| (** contents of a list *) | ||||
|  | ||||
| Fixpoint list_contents (l:list A) : multiset A := | ||||
|   match l with | ||||
|   | [] => emptyBag | ||||
|   | a :: l => munion (singletonBag a) (list_contents l) | ||||
|   end. | ||||
|  | ||||
| Lemma list_contents_app : | ||||
|   forall l m:list A, | ||||
|     meq (list_contents (l ++ m)) (munion (list_contents l) (list_contents m)). | ||||
| Proof. | ||||
|   simple induction l; simpl; auto with datatypes. | ||||
|   intros. | ||||
|   apply meq_trans with | ||||
|     (munion (singletonBag a) (munion (list_contents l0) (list_contents m))); | ||||
|     auto with datatypes. | ||||
| Qed. | ||||
|  | ||||
| (** * [permutation]: definition and basic properties *) | ||||
|  | ||||
| Definition permutation (l m:list A) := meq (list_contents l) (list_contents m). | ||||
|  | ||||
| Lemma permut_refl : forall l:list A, permutation l l. | ||||
| Proof. | ||||
|   unfold permutation; auto with datatypes. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_sym : | ||||
|   forall l1 l2 : list A, permutation l1 l2 -> permutation l2 l1. | ||||
| Proof. | ||||
|   unfold permutation, meq; intros; symmetry; trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_trans : | ||||
|   forall l m n:list A, permutation l m -> permutation m n -> permutation l n. | ||||
| Proof. | ||||
|   unfold permutation; intros. | ||||
|   apply meq_trans with (list_contents m); auto with datatypes. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_cons_eq : | ||||
|   forall l m:list A, | ||||
|     permutation l m -> forall a a', eqA a a' -> permutation (a :: l) (a' :: m). | ||||
| Proof. | ||||
|   unfold permutation; simpl; intros. | ||||
|   apply meq_trans with (munion (singletonBag a') (list_contents l)). | ||||
|   apply meq_left, meq_singleton; auto. | ||||
|   auto with datatypes. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_cons : | ||||
|   forall l m:list A, | ||||
|     permutation l m -> forall a:A, permutation (a :: l) (a :: m). | ||||
| Proof. | ||||
|   unfold permutation; simpl; auto with datatypes. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_app : | ||||
|   forall l l' m m':list A, | ||||
|     permutation l l' -> permutation m m' -> permutation (l ++ m) (l' ++ m'). | ||||
| Proof. | ||||
|   unfold permutation; intros. | ||||
|   apply meq_trans with (munion (list_contents l) (list_contents m)); | ||||
|     auto using permut_cons, list_contents_app with datatypes. | ||||
|   apply meq_trans with (munion (list_contents l') (list_contents m')); | ||||
|     auto using permut_cons, list_contents_app with datatypes. | ||||
|   apply meq_trans with (munion (list_contents l') (list_contents m)); | ||||
|     auto using permut_cons, list_contents_app with datatypes. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_add_inside_eq : | ||||
|   forall a a' l1 l2 l3 l4, eqA a a' -> | ||||
|     permutation (l1 ++ l2) (l3 ++ l4) -> | ||||
|     permutation (l1 ++ a :: l2) (l3 ++ a' :: l4). | ||||
| Proof. | ||||
|   unfold permutation, meq in *; intros. | ||||
|   specialize H0 with a0. | ||||
|   repeat rewrite list_contents_app in *; simpl in *. | ||||
|   destruct (eqA_dec a a0) as [Ha|Ha]; rewrite H in Ha; | ||||
|     decide (eqA_dec a' a0) with Ha; simpl; auto with arith. | ||||
|   do 2 rewrite <- plus_n_Sm; f_equal; auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_add_inside : | ||||
|   forall a l1 l2 l3 l4, | ||||
|     permutation (l1 ++ l2) (l3 ++ l4) -> | ||||
|     permutation (l1 ++ a :: l2) (l3 ++ a :: l4). | ||||
| Proof. | ||||
|   unfold permutation, meq in *; intros. | ||||
|   generalize (H a0); clear H. | ||||
|   do 4 rewrite list_contents_app. | ||||
|   simpl. | ||||
|   destruct (eqA_dec a a0); simpl; auto with arith. | ||||
|   do 2 rewrite <- plus_n_Sm; f_equal; auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_add_cons_inside_eq : | ||||
|   forall a a' l l1 l2, eqA a a' -> | ||||
|     permutation l (l1 ++ l2) -> | ||||
|     permutation (a :: l) (l1 ++ a' :: l2). | ||||
| Proof. | ||||
|   intros; | ||||
|   replace (a :: l) with ([] ++ a :: l); trivial; | ||||
|     apply permut_add_inside_eq; trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_add_cons_inside : | ||||
|   forall a l l1 l2, | ||||
|     permutation l (l1 ++ l2) -> | ||||
|     permutation (a :: l) (l1 ++ a :: l2). | ||||
| Proof. | ||||
|   intros; | ||||
|     replace (a :: l) with ([] ++ a :: l); trivial; | ||||
|         apply permut_add_inside; trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_middle : | ||||
|   forall (l m:list A) (a:A), permutation (a :: l ++ m) (l ++ a :: m). | ||||
| Proof. | ||||
|   intros; apply permut_add_cons_inside; auto using permut_sym, permut_refl. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_sym_app : | ||||
|   forall l1 l2, permutation (l1 ++ l2) (l2 ++ l1). | ||||
| Proof. | ||||
|   intros l1 l2; | ||||
|     unfold permutation, meq; | ||||
|         intro a; do 2 rewrite list_contents_app; simpl; | ||||
|           auto with arith. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_rev : | ||||
|   forall l, permutation l (rev l). | ||||
| Proof. | ||||
|   induction l. | ||||
|   simpl; trivial using permut_refl. | ||||
|   simpl. | ||||
|   apply permut_add_cons_inside. | ||||
|   rewrite <- app_nil_end. trivial. | ||||
| Qed. | ||||
|  | ||||
| (** * Some inversion results. *) | ||||
| Lemma permut_conv_inv : | ||||
|   forall e l1 l2, permutation (e :: l1) (e :: l2) -> permutation l1 l2. | ||||
| Proof. | ||||
|   intros e l1 l2; unfold permutation, meq; simpl; intros H a; | ||||
|     generalize (H a); apply plus_reg_l. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_app_inv1 : | ||||
|   forall l l1 l2, permutation (l1 ++ l) (l2 ++ l) -> permutation l1 l2. | ||||
| Proof. | ||||
|   intros l l1 l2; unfold permutation, meq; simpl; | ||||
|     intros H a; generalize (H a); clear H. | ||||
|   do 2 rewrite list_contents_app. | ||||
|   simpl. | ||||
|   intros; apply plus_reg_l with (multiplicity (list_contents l) a). | ||||
|   rewrite plus_comm; rewrite H; rewrite plus_comm. | ||||
|   trivial. | ||||
| Qed. | ||||
|  | ||||
| (** we can use [multiplicity] to define [InA] and [NoDupA]. *) | ||||
|  | ||||
| Fact if_eqA_then : forall a a' (B:Type)(b b':B), | ||||
|  eqA a a' -> (if eqA_dec a a' then b else b') = b. | ||||
| Proof. | ||||
|   intros. destruct eqA_dec as [_|NEQ]; auto. | ||||
|   contradict NEQ; auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_app_inv2 : | ||||
|   forall l l1 l2, permutation (l ++ l1) (l ++ l2) -> permutation l1 l2. | ||||
| Proof. | ||||
|   intros l l1 l2; unfold permutation, meq; simpl; | ||||
|     intros H a; generalize (H a); clear H. | ||||
|   do 2 rewrite list_contents_app. | ||||
|   simpl. | ||||
|   intros; apply plus_reg_l with (multiplicity (list_contents l) a). | ||||
|   trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_remove_hd_eq : | ||||
|   forall l l1 l2 a b, eqA a b -> | ||||
|     permutation (a :: l) (l1 ++ b :: l2) -> permutation l (l1 ++ l2). | ||||
| Proof. | ||||
|   unfold permutation, meq; simpl; intros l l1 l2 a b Heq H a0. | ||||
|   specialize H with a0. | ||||
|   rewrite list_contents_app in *; simpl in *. | ||||
|   apply plus_reg_l with (if eqA_dec a a0 then 1 else 0). | ||||
|   rewrite H; clear H. | ||||
|   symmetry; rewrite plus_comm, <- ! plus_assoc; f_equal. | ||||
|   rewrite plus_comm. | ||||
|   destruct (eqA_dec a a0) as [Ha|Ha]; rewrite Heq in Ha; | ||||
|     decide (eqA_dec b a0) with Ha; reflexivity. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_remove_hd : | ||||
|   forall l l1 l2 a, | ||||
|     permutation (a :: l) (l1 ++ a :: l2) -> permutation l (l1 ++ l2). | ||||
| Proof. | ||||
|   eauto using permut_remove_hd_eq, Equivalence_Reflexive. | ||||
| Qed. | ||||
|  | ||||
| Fact if_eqA_else : forall a a' (B:Type)(b b':B), | ||||
|  ~eqA a a' -> (if eqA_dec a a' then b else b') = b'. | ||||
| Proof. | ||||
|   intros. decide (eqA_dec a a') with H; auto. | ||||
| Qed. | ||||
|  | ||||
| Fact if_eqA_refl : forall a (B:Type)(b b':B), | ||||
|  (if eqA_dec a a then b else b') = b. | ||||
| Proof. | ||||
|   intros; apply (decide_left (eqA_dec a a)); auto with *. | ||||
| Qed. | ||||
|  | ||||
| (** PL: Inutilisable dans un rewrite sans un change prealable. *) | ||||
|  | ||||
| Global Instance if_eqA (B:Type)(b b':B) : | ||||
|  Proper (eqA==>eqA==>@eq _) (fun x y => if eqA_dec x y then b else b'). | ||||
| Proof. | ||||
|  intros x x' Hxx' y y' Hyy'. | ||||
|  intros; destruct (eqA_dec x y) as [H|H]; | ||||
|   destruct (eqA_dec x' y') as [H'|H']; auto. | ||||
|  contradict H'; transitivity x; auto with *; transitivity y; auto with *. | ||||
|  contradict H; transitivity x'; auto with *; transitivity y'; auto with *. | ||||
| Qed. | ||||
|  | ||||
| Fact if_eqA_rewrite_l : forall a1 a1' a2 (B:Type)(b b':B), | ||||
|  eqA a1 a1' -> (if eqA_dec a1 a2 then b else b') = | ||||
|                (if eqA_dec a1' a2 then b else b'). | ||||
| Proof. | ||||
|  intros; destruct (eqA_dec a1 a2) as [A1|A1]; | ||||
|   destruct (eqA_dec a1' a2) as [A1'|A1']; auto. | ||||
|  contradict A1'; transitivity a1; eauto with *. | ||||
|  contradict A1; transitivity a1'; eauto with *. | ||||
| Qed. | ||||
|  | ||||
| Fact if_eqA_rewrite_r : forall a1 a2 a2' (B:Type)(b b':B), | ||||
|  eqA a2 a2' -> (if eqA_dec a1 a2 then b else b') = | ||||
|                (if eqA_dec a1 a2' then b else b'). | ||||
| Proof. | ||||
|  intros; destruct (eqA_dec a1 a2) as [A2|A2]; | ||||
|   destruct (eqA_dec a1 a2') as [A2'|A2']; auto. | ||||
|  contradict A2'; transitivity a2; eauto with *. | ||||
|  contradict A2; transitivity a2'; eauto with *. | ||||
| Qed. | ||||
|  | ||||
|  | ||||
| Global Instance multiplicity_eqA (l:list A) : | ||||
|  Proper (eqA==>@eq _) (multiplicity (list_contents l)). | ||||
| Proof. | ||||
|   intros x x' Hxx'. | ||||
|   induction l as [|y l Hl]; simpl; auto. | ||||
|   rewrite (@if_eqA_rewrite_r y x x'); auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma multiplicity_InA : | ||||
|   forall l a, InA eqA a l <-> 0 < multiplicity (list_contents l) a. | ||||
| Proof. | ||||
|   induction l. | ||||
|   simpl. | ||||
|   split; inversion 1. | ||||
|   simpl. | ||||
|   intros a'; split; intros H. inversion_clear H. | ||||
|   apply (decide_left (eqA_dec a a')); auto with *. | ||||
|   destruct (eqA_dec a a'); auto with *. simpl; rewrite <- IHl; auto. | ||||
|   destruct (eqA_dec a a'); auto with *. right. rewrite IHl; auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma multiplicity_InA_O : | ||||
|   forall l a, ~ InA eqA a l -> multiplicity (list_contents l) a = 0. | ||||
| Proof. | ||||
|   intros l a; rewrite multiplicity_InA; | ||||
|     destruct (multiplicity (list_contents l) a); auto with arith. | ||||
|   destruct 1; auto with arith. | ||||
| Qed. | ||||
|  | ||||
| Lemma multiplicity_InA_S : | ||||
|   forall l a, InA eqA a l -> multiplicity (list_contents l) a >= 1. | ||||
| Proof. | ||||
|   intros l a; rewrite multiplicity_InA; auto with arith. | ||||
| Qed. | ||||
|  | ||||
| Lemma multiplicity_NoDupA : forall l, | ||||
|   NoDupA eqA l <-> (forall a, multiplicity (list_contents l) a <= 1). | ||||
| Proof. | ||||
|   induction l. | ||||
|   simpl. | ||||
|   split; auto with arith. | ||||
|   split; simpl. | ||||
|   inversion_clear 1. | ||||
|   rewrite IHl in H1. | ||||
|   intros; destruct (eqA_dec a a0) as [EQ|NEQ]; simpl; auto with *. | ||||
|   rewrite <- EQ. | ||||
|   rewrite multiplicity_InA_O; auto. | ||||
|   intros; constructor. | ||||
|   rewrite multiplicity_InA. | ||||
|   specialize (H a). | ||||
|   rewrite if_eqA_refl in H. | ||||
|   clear IHl; omega. | ||||
|   rewrite IHl; intros. | ||||
|   specialize (H a0). omega. | ||||
| Qed. | ||||
|  | ||||
| (** Permutation is compatible with InA. *) | ||||
| Lemma permut_InA_InA : | ||||
|   forall l1 l2 e, permutation l1 l2 -> InA eqA e l1 -> InA eqA e l2. | ||||
| Proof. | ||||
|   intros l1 l2 e. | ||||
|   do 2 rewrite multiplicity_InA. | ||||
|   unfold permutation, meq. | ||||
|   intros H;rewrite H; auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_cons_InA : | ||||
|   forall l1 l2 e, permutation (e :: l1) l2 -> InA eqA e l2. | ||||
| Proof. | ||||
|   intros; apply (permut_InA_InA (e:=e) H); auto with *. | ||||
| Qed. | ||||
|  | ||||
| (** Permutation of an empty list. *) | ||||
| Lemma permut_nil : | ||||
|   forall l, permutation l [] -> l = []. | ||||
| Proof. | ||||
|   intro l; destruct l as [ | e l ]; trivial. | ||||
|   assert (InA eqA e (e::l)) by (auto with *). | ||||
|   intro Abs; generalize (permut_InA_InA Abs H). | ||||
|   inversion 1. | ||||
| Qed. | ||||
|  | ||||
| (** Permutation for short lists. *) | ||||
|  | ||||
| Lemma permut_length_1: | ||||
|   forall a b, permutation [a] [b] -> eqA a b. | ||||
| Proof. | ||||
|   intros a b; unfold permutation, meq. | ||||
|   intro P; specialize (P b); simpl in *. | ||||
|   rewrite if_eqA_refl in *. | ||||
|   destruct (eqA_dec a b); simpl; auto; discriminate. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_length_2 : | ||||
|   forall a1 b1 a2 b2, permutation [a1; b1] [a2; b2] -> | ||||
|     (eqA a1 a2) /\ (eqA b1 b2) \/ (eqA a1 b2) /\ (eqA a2 b1). | ||||
| Proof. | ||||
|   intros a1 b1 a2 b2 P. | ||||
|   assert (H:=permut_cons_InA P). | ||||
|   inversion_clear H. | ||||
|   left; split; auto. | ||||
|   apply permut_length_1. | ||||
|   red; red; intros. | ||||
|   specialize (P a). simpl in *. | ||||
|   rewrite (@if_eqA_rewrite_l a1 a2 a) in P by auto. omega. | ||||
|   right. | ||||
|   inversion_clear H0; [|inversion H]. | ||||
|   split; auto. | ||||
|   apply permut_length_1. | ||||
|   red; red; intros. | ||||
|   specialize (P a); simpl in *. | ||||
|   rewrite (@if_eqA_rewrite_l a1 b2 a) in P by auto. omega. | ||||
| Qed. | ||||
|  | ||||
| (** Permutation is compatible with length. *) | ||||
| Lemma permut_length : | ||||
|   forall l1 l2, permutation l1 l2 -> length l1 = length l2. | ||||
| Proof. | ||||
|   induction l1; intros l2 H. | ||||
|   rewrite (permut_nil (permut_sym H)); auto. | ||||
|   assert (H0:=permut_cons_InA H). | ||||
|   destruct (InA_split H0) as (h2,(b,(t2,(H1,H2)))). | ||||
|   subst l2. | ||||
|   rewrite app_length. | ||||
|   simpl; rewrite <- plus_n_Sm; f_equal. | ||||
|   rewrite <- app_length. | ||||
|   apply IHl1. | ||||
|   apply permut_remove_hd with b. | ||||
|   apply permut_trans with (a::l1); auto. | ||||
|   revert H1; unfold permutation, meq; simpl. | ||||
|   intros; f_equal; auto. | ||||
|   rewrite (@if_eqA_rewrite_l a b a0); auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma NoDupA_equivlistA_permut : | ||||
|   forall l l', NoDupA eqA l -> NoDupA eqA l' -> | ||||
|     equivlistA eqA l l' -> permutation l l'. | ||||
| Proof. | ||||
|   intros. | ||||
|   red; unfold meq; intros. | ||||
|   rewrite multiplicity_NoDupA in H, H0. | ||||
|   generalize (H a) (H0 a) (H1 a); clear H H0 H1. | ||||
|   do 2 rewrite multiplicity_InA. | ||||
|   destruct 3; omega. | ||||
| Qed. | ||||
|  | ||||
| End Permut. | ||||
|  | ||||
| Section Permut_map. | ||||
|  | ||||
| Variables A B : Type. | ||||
|  | ||||
| Variable eqA : relation A. | ||||
| Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}. | ||||
| Hypothesis eqA_equiv : Equivalence eqA. | ||||
|  | ||||
| Variable eqB : B->B->Prop. | ||||
| Hypothesis eqB_dec : forall x y:B, { eqB x y }+{ ~eqB x y }. | ||||
| Hypothesis eqB_trans : Transitive eqB. | ||||
|  | ||||
| (** Permutation is compatible with map. *) | ||||
|  | ||||
| Lemma permut_map : | ||||
|   forall f, | ||||
|     (Proper (eqA==>eqB) f) -> | ||||
|     forall l1 l2, permutation _ eqA_dec l1 l2 -> | ||||
|       permutation _ eqB_dec (map f l1) (map f l2). | ||||
| Proof. | ||||
|   intros f; induction l1. | ||||
|   intros l2 P; rewrite (permut_nil eqA_equiv (permut_sym P)); apply permut_refl. | ||||
|   intros l2 P. | ||||
|   simpl. | ||||
|   assert (H0:=permut_cons_InA eqA_equiv P). | ||||
|   destruct (InA_split H0) as (h2,(b,(t2,(H1,H2)))). | ||||
|   subst l2. | ||||
|   rewrite map_app. | ||||
|   simpl. | ||||
|   apply permut_trans with (f b :: map f l1). | ||||
|   revert H1; unfold permutation, meq; simpl. | ||||
|   intros; f_equal; auto. | ||||
|   destruct (eqB_dec (f b) a0) as [H2|H2]; | ||||
|     destruct (eqB_dec (f a) a0) as [H3|H3]; auto. | ||||
|   destruct H3; transitivity (f b); auto with *. | ||||
|   destruct H2; transitivity (f a); auto with *. | ||||
|   apply permut_add_cons_inside. | ||||
|   rewrite <- map_app. | ||||
|   apply IHl1; auto. | ||||
|   apply permut_remove_hd with b; trivial. | ||||
|   apply permut_trans with (a::l1); auto. | ||||
|   revert H1; unfold permutation, meq; simpl. | ||||
|   intros; f_equal; auto. | ||||
|   rewrite (@if_eqA_rewrite_l _ _ eqA_equiv eqA_dec a b a0); auto. | ||||
| Qed. | ||||
|  | ||||
| End Permut_map. | ||||
|  | ||||
| Require Import Permutation. | ||||
|  | ||||
| Section Permut_permut. | ||||
|  | ||||
| Variable A : Type. | ||||
|  | ||||
| Variable eqA : relation A. | ||||
| Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}. | ||||
| Hypothesis eqA_equiv : Equivalence eqA. | ||||
|  | ||||
| Lemma Permutation_impl_permutation : forall l l', | ||||
|   Permutation l l' -> permutation _ eqA_dec l l'. | ||||
| Proof. | ||||
|   induction 1. | ||||
|     apply permut_refl. | ||||
|     apply permut_cons; auto using Equivalence_Reflexive. | ||||
|     change (x :: y :: l) with ([x] ++ y :: l); | ||||
|       apply permut_add_cons_inside; simpl; | ||||
|       apply permut_cons_eq; auto using Equivalence_Reflexive, permut_refl. | ||||
|     apply permut_trans with l'; trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma permut_eqA : forall l l', Forall2 eqA l l' -> permutation _ eqA_dec l l'. | ||||
| Proof. | ||||
|   induction 1. | ||||
|     apply permut_refl. | ||||
|     apply permut_cons_eq; trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma permutation_Permutation : forall l l', | ||||
|   permutation _ eqA_dec l l' <-> | ||||
|   exists l'', Permutation l l'' /\ Forall2 eqA l'' l'. | ||||
| Proof. | ||||
|   split; intro H. | ||||
|   (* -> *) | ||||
|   induction l in l', H |- *. | ||||
|     exists []; apply permut_sym, permut_nil in H as ->; auto using Forall2. | ||||
|     pose proof H as H'. | ||||
|     apply permut_cons_InA, InA_split in H | ||||
|       as (l1 & y & l2 & Heq & ->); trivial. | ||||
|     apply permut_remove_hd_eq, IHl in H' | ||||
|       as (l'' & IHP & IHA); clear IHl; trivial. | ||||
|     apply Forall2_app_inv_r in IHA as (l1'' & l2'' & Hl1 & Hl2 & ->). | ||||
|     exists (l1'' ++ a :: l2''); split. | ||||
|       apply Permutation_cons_app; trivial. | ||||
|       apply Forall2_app, Forall2_cons; trivial. | ||||
|   (* <- *) | ||||
|   destruct H as (l'' & H & Heq). | ||||
|   apply permut_trans with l''. | ||||
|     apply Permutation_impl_permutation; trivial. | ||||
|     apply permut_eqA; trivial. | ||||
| Qed. | ||||
|  | ||||
| End Permut_permut. | ||||
|  | ||||
| (* begin hide *) | ||||
| (** For compatibilty *) | ||||
| Notation permut_right := permut_cons (only parsing). | ||||
| Notation permut_tran := permut_trans (only parsing). | ||||
| (* end hide *) | ||||
| @@ -1,632 +0,0 @@ | ||||
| (* Adapted in May 2006 by Jean-Marc Notin from initial contents by | ||||
|    Laurent Thery (Huffmann contribution, October 2003) *) | ||||
|  | ||||
| Require Import List Setoid Compare_dec Morphisms. | ||||
| Import ListNotations. (* For notations [] and [a;b;c] *) | ||||
| Set Implicit Arguments. | ||||
|  | ||||
| Section Permutation. | ||||
|  | ||||
| Variable A:Type. | ||||
|  | ||||
| Inductive Permutation : list A -> list A -> Prop := | ||||
| | perm_nil: Permutation [] [] | ||||
| | perm_skip x l l' : Permutation l l' -> Permutation (x::l) (x::l') | ||||
| | perm_swap x y l : Permutation (y::x::l) (x::y::l) | ||||
| | perm_trans l l' l'' : | ||||
|     Permutation l l' -> Permutation l' l'' -> Permutation l l''. | ||||
|  | ||||
| Local Hint Constructors Permutation. | ||||
|  | ||||
| (** Some facts about [Permutation] *) | ||||
|  | ||||
| Theorem Permutation_nil : forall (l : list A), Permutation [] l -> l = []. | ||||
| Proof. | ||||
|   intros l HF. | ||||
|   remember (@nil A) as m in HF. | ||||
|   induction HF; discriminate || auto. | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_nil_cons : forall (l : list A) (x : A), | ||||
|  ~ Permutation nil (x::l). | ||||
| Proof. | ||||
|   intros l x HF. | ||||
|   apply Permutation_nil in HF; discriminate. | ||||
| Qed. | ||||
|  | ||||
| (** Permutation over lists is a equivalence relation *) | ||||
|  | ||||
| Theorem Permutation_refl : forall l : list A, Permutation l l. | ||||
| Proof. | ||||
|   induction l; constructor. exact IHl. | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_sym : forall l l' : list A, | ||||
|  Permutation l l' -> Permutation l' l. | ||||
| Proof. | ||||
|   intros l l' Hperm; induction Hperm; auto. | ||||
|   apply perm_trans with (l':=l'); assumption. | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_trans : forall l l' l'' : list A, | ||||
|  Permutation l l' -> Permutation l' l'' -> Permutation l l''. | ||||
| Proof. | ||||
|   exact perm_trans. | ||||
| Qed. | ||||
|  | ||||
| End Permutation. | ||||
|  | ||||
| Hint Resolve Permutation_refl perm_nil perm_skip. | ||||
|  | ||||
| (* These hints do not reduce the size of the problem to solve and they | ||||
|    must be used with care to avoid combinatoric explosions *) | ||||
|  | ||||
| Local Hint Resolve perm_swap perm_trans. | ||||
| Local Hint Resolve Permutation_sym Permutation_trans. | ||||
|  | ||||
| (* This provides reflexivity, symmetry and transitivity and rewriting | ||||
|    on morphims to come *) | ||||
|  | ||||
| Instance Permutation_Equivalence A : Equivalence (@Permutation A) | 10 := { | ||||
|   Equivalence_Reflexive := @Permutation_refl A ; | ||||
|   Equivalence_Symmetric := @Permutation_sym A ; | ||||
|   Equivalence_Transitive := @Permutation_trans A }. | ||||
|  | ||||
| Instance Permutation_cons A : | ||||
|  Proper (Logic.eq ==> @Permutation A ==> @Permutation A) (@cons A) | 10. | ||||
| Proof. | ||||
|   repeat intro; subst; auto using perm_skip. | ||||
| Qed. | ||||
|  | ||||
| Section Permutation_properties. | ||||
|  | ||||
| Variable A:Type. | ||||
|  | ||||
| Implicit Types a b : A. | ||||
| Implicit Types l m : list A. | ||||
|  | ||||
| (** Compatibility with others operations on lists *) | ||||
|  | ||||
| Theorem Permutation_in : forall (l l' : list A) (x : A), | ||||
|  Permutation l l' -> In x l -> In x l'. | ||||
| Proof. | ||||
|   intros l l' x Hperm; induction Hperm; simpl; tauto. | ||||
| Qed. | ||||
|  | ||||
| Global Instance Permutation_in' : | ||||
|  Proper (Logic.eq ==> @Permutation A ==> iff) (@In A) | 10. | ||||
| Proof. | ||||
|   repeat red; intros; subst; eauto using Permutation_in. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_app_tail : forall (l l' tl : list A), | ||||
|  Permutation l l' -> Permutation (l++tl) (l'++tl). | ||||
| Proof. | ||||
|   intros l l' tl Hperm; induction Hperm as [|x l l'|x y l|l l' l'']; simpl; auto. | ||||
|   eapply Permutation_trans with (l':=l'++tl); trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_app_head : forall (l tl tl' : list A), | ||||
|  Permutation tl tl' -> Permutation (l++tl) (l++tl'). | ||||
| Proof. | ||||
|   intros l tl tl' Hperm; induction l; | ||||
|    [trivial | repeat rewrite <- app_comm_cons; constructor; assumption]. | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_app : forall (l m l' m' : list A), | ||||
|  Permutation l l' -> Permutation m m' -> Permutation (l++m) (l'++m'). | ||||
| Proof. | ||||
|   intros l m l' m' Hpermll' Hpermmm'; | ||||
|    induction Hpermll' as [|x l l'|x y l|l l' l'']; | ||||
|     repeat rewrite <- app_comm_cons; auto. | ||||
|   apply Permutation_trans with (l' := (x :: y :: l ++ m)); | ||||
|    [idtac | repeat rewrite app_comm_cons; apply Permutation_app_head]; trivial. | ||||
|   apply Permutation_trans with (l' := (l' ++ m')); try assumption. | ||||
|   apply Permutation_app_tail; assumption. | ||||
| Qed. | ||||
|  | ||||
| Global Instance Permutation_app' : | ||||
|  Proper (@Permutation A ==> @Permutation A ==> @Permutation A) (@app A) | 10. | ||||
| Proof. | ||||
|   repeat intro; now apply Permutation_app. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_add_inside : forall a (l l' tl tl' : list A), | ||||
|   Permutation l l' -> Permutation tl tl' -> | ||||
|   Permutation (l ++ a :: tl) (l' ++ a :: tl'). | ||||
| Proof. | ||||
|   intros; apply Permutation_app; auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_cons_append : forall (l : list A) x, | ||||
|   Permutation (x :: l) (l ++ x :: nil). | ||||
| Proof. induction l; intros; auto. simpl. rewrite <- IHl; auto. Qed. | ||||
| Local Hint Resolve Permutation_cons_append. | ||||
|  | ||||
| Theorem Permutation_app_comm : forall (l l' : list A), | ||||
|   Permutation (l ++ l') (l' ++ l). | ||||
| Proof. | ||||
|   induction l as [|x l]; simpl; intro l'. | ||||
|   rewrite app_nil_r; trivial. rewrite IHl. | ||||
|   rewrite app_comm_cons, Permutation_cons_append. | ||||
|   now rewrite <- app_assoc. | ||||
| Qed. | ||||
| Local Hint Resolve Permutation_app_comm. | ||||
|  | ||||
| Theorem Permutation_cons_app : forall (l l1 l2:list A) a, | ||||
|   Permutation l (l1 ++ l2) -> Permutation (a :: l) (l1 ++ a :: l2). | ||||
| Proof. | ||||
|   intros l l1 l2 a H. rewrite H. | ||||
|   rewrite app_comm_cons, Permutation_cons_append. | ||||
|   now rewrite <- app_assoc. | ||||
| Qed. | ||||
| Local Hint Resolve Permutation_cons_app. | ||||
|  | ||||
| Theorem Permutation_middle : forall (l1 l2:list A) a, | ||||
|   Permutation (a :: l1 ++ l2) (l1 ++ a :: l2). | ||||
| Proof. | ||||
|   auto. | ||||
| Qed. | ||||
| Local Hint Resolve Permutation_middle. | ||||
|  | ||||
| Theorem Permutation_rev : forall (l : list A), Permutation l (rev l). | ||||
| Proof. | ||||
|   induction l as [| x l]; simpl; trivial. now rewrite IHl at 1. | ||||
| Qed. | ||||
|  | ||||
| Global Instance Permutation_rev' : | ||||
|  Proper (@Permutation A ==> @Permutation A) (@rev A) | 10. | ||||
| Proof. | ||||
|   repeat intro; now rewrite <- 2 Permutation_rev. | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_length : forall (l l' : list A), | ||||
|  Permutation l l' -> length l = length l'. | ||||
| Proof. | ||||
|   intros l l' Hperm; induction Hperm; simpl; auto. now transitivity (length l'). | ||||
| Qed. | ||||
|  | ||||
| Global Instance Permutation_length' : | ||||
|  Proper (@Permutation A ==> Logic.eq) (@length A) | 10. | ||||
| Proof. | ||||
|   exact Permutation_length. | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_ind_bis : | ||||
|  forall P : list A -> list A -> Prop, | ||||
|    P [] [] -> | ||||
|    (forall x l l', Permutation l l' -> P l l' -> P (x :: l) (x :: l')) -> | ||||
|    (forall x y l l', Permutation l l' -> P l l' -> P (y :: x :: l) (x :: y :: l')) -> | ||||
|    (forall l l' l'', Permutation l l' -> P l l' -> Permutation l' l'' -> P l' l'' -> P l l'') -> | ||||
|    forall l l', Permutation l l' -> P l l'. | ||||
| Proof. | ||||
|   intros P Hnil Hskip Hswap Htrans. | ||||
|   induction 1; auto. | ||||
|   apply Htrans with (x::y::l); auto. | ||||
|   apply Hswap; auto. | ||||
|   induction l; auto. | ||||
|   apply Hskip; auto. | ||||
|   apply Hskip; auto. | ||||
|   induction l; auto. | ||||
|   eauto. | ||||
| Qed. | ||||
|  | ||||
| Ltac break_list l x l' H := | ||||
|   destruct l as [|x l']; simpl in *; | ||||
|   injection H; intros; subst; clear H. | ||||
|  | ||||
| Theorem Permutation_nil_app_cons : forall (l l' : list A) (x : A), | ||||
|  ~ Permutation nil (l++x::l'). | ||||
| Proof. | ||||
|   intros l l' x HF. | ||||
|   apply Permutation_nil in HF. destruct l; discriminate. | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_app_inv : forall (l1 l2 l3 l4:list A) a, | ||||
|   Permutation (l1++a::l2) (l3++a::l4) -> Permutation (l1++l2) (l3 ++ l4). | ||||
| Proof. | ||||
|   intros l1 l2 l3 l4 a; revert l1 l2 l3 l4. | ||||
|   set (P l l' := | ||||
|        forall l1 l2 l3 l4, l=l1++a::l2 -> l'=l3++a::l4 -> | ||||
|        Permutation (l1++l2) (l3++l4)). | ||||
|   cut (forall l l', Permutation l l' -> P l l'). | ||||
|   intros H; intros; eapply H; eauto. | ||||
|   apply (Permutation_ind_bis P); unfold P; clear P. | ||||
|   - (* nil *) | ||||
|     intros; now destruct l1. | ||||
|   - (* skip *) | ||||
|     intros x l l' H IH; intros. | ||||
|     break_list l1 b l1' H0; break_list l3 c l3' H1. | ||||
|     auto. | ||||
|     now rewrite H. | ||||
|     now rewrite <- H. | ||||
|     now rewrite (IH _ _ _ _ eq_refl eq_refl). | ||||
|   - (* swap *) | ||||
|     intros x y l l' Hp IH; intros. | ||||
|     break_list l1 b l1' H; break_list l3 c l3' H0. | ||||
|     auto. | ||||
|     break_list l3' b l3'' H. | ||||
|     auto. | ||||
|     constructor. now rewrite Permutation_middle. | ||||
|     break_list l1' c l1'' H1. | ||||
|     auto. | ||||
|     constructor. now rewrite Permutation_middle. | ||||
|     break_list l3' d l3'' H; break_list l1' e l1'' H1. | ||||
|     auto. | ||||
|     rewrite perm_swap. constructor. now rewrite Permutation_middle. | ||||
|     rewrite perm_swap. constructor. now rewrite Permutation_middle. | ||||
|     now rewrite perm_swap, (IH _ _ _ _ eq_refl eq_refl). | ||||
|   - (*trans*) | ||||
|     intros. | ||||
|     destruct (In_split a l') as (l'1,(l'2,H6)). | ||||
|     rewrite <- H. | ||||
|     subst l. | ||||
|     apply in_or_app; right; red; auto. | ||||
|     apply perm_trans with (l'1++l'2). | ||||
|     apply (H0 _ _ _ _ H3 H6). | ||||
|     apply (H2 _ _ _ _ H6 H4). | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_cons_inv l l' a : | ||||
|  Permutation (a::l) (a::l') -> Permutation l l'. | ||||
| Proof. | ||||
|   intro H; exact (Permutation_app_inv [] l [] l' a H). | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_cons_app_inv l l1 l2 a : | ||||
|  Permutation (a :: l) (l1 ++ a :: l2) -> Permutation l (l1 ++ l2). | ||||
| Proof. | ||||
|   intro H; exact (Permutation_app_inv [] l l1 l2 a H). | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_app_inv_l : forall l l1 l2, | ||||
|  Permutation (l ++ l1) (l ++ l2) -> Permutation l1 l2. | ||||
| Proof. | ||||
|   induction l; simpl; auto. | ||||
|   intros. | ||||
|   apply IHl. | ||||
|   apply Permutation_cons_inv with a; auto. | ||||
| Qed. | ||||
|  | ||||
| Theorem Permutation_app_inv_r : forall l l1 l2, | ||||
|  Permutation (l1 ++ l) (l2 ++ l) -> Permutation l1 l2. | ||||
| Proof. | ||||
|   induction l. | ||||
|   intros l1 l2; do 2 rewrite app_nil_r; auto. | ||||
|   intros. | ||||
|   apply IHl. | ||||
|   apply Permutation_app_inv with a; auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_length_1_inv: forall a l, Permutation [a] l -> l = [a]. | ||||
| Proof. | ||||
|   intros a l H; remember [a] as m in H. | ||||
|   induction H; try (injection Heqm as -> ->; clear Heqm); | ||||
|     discriminate || auto. | ||||
|   apply Permutation_nil in H as ->; trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_length_1: forall a b, Permutation [a] [b] -> a = b. | ||||
| Proof. | ||||
|   intros a b H. | ||||
|   apply Permutation_length_1_inv in H; injection H as ->; trivial. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_length_2_inv : | ||||
|   forall a1 a2 l, Permutation [a1;a2] l -> l = [a1;a2] \/ l = [a2;a1]. | ||||
| Proof. | ||||
|   intros a1 a2 l H; remember [a1;a2] as m in H. | ||||
|   revert a1 a2 Heqm. | ||||
|   induction H; intros; try (injection Heqm; intros; subst; clear Heqm); | ||||
|     discriminate || (try tauto). | ||||
|   apply Permutation_length_1_inv in H as ->; left; auto. | ||||
|   apply IHPermutation1 in Heqm as [H1|H1]; apply IHPermutation2 in H1 as (); | ||||
|     auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_length_2 : | ||||
|   forall a1 a2 b1 b2, Permutation [a1;a2] [b1;b2] -> | ||||
|     a1 = b1 /\ a2 = b2 \/ a1 = b2 /\ a2 = b1. | ||||
| Proof. | ||||
|   intros a1 b1 a2 b2 H. | ||||
|   apply Permutation_length_2_inv in H as [H|H]; injection H as -> ->; auto. | ||||
| Qed. | ||||
|  | ||||
| Let in_middle l l1 l2 (a:A) : l = l1 ++ a :: l2 -> | ||||
|  forall x, In x l <-> a = x \/ In x (l1++l2). | ||||
| Proof. | ||||
|  intros; subst; rewrite !in_app_iff; simpl. tauto. | ||||
| Qed. | ||||
|  | ||||
| Lemma NoDup_cardinal_incl (l l' : list A) : NoDup l -> NoDup l' -> | ||||
|   length l = length l' -> incl l l' -> incl l' l. | ||||
| Proof. | ||||
|  intros N. revert l'. induction N as [|a l Hal Hl IH]. | ||||
|  - destruct l'; now auto. | ||||
|  - intros l' Hl' E H x Hx. | ||||
|    assert (Ha : In a l') by (apply H; simpl; auto). | ||||
|    destruct (in_split _ _ Ha) as (l1 & l2 & H12). clear Ha. | ||||
|    rewrite in_middle in Hx; eauto. | ||||
|    destruct Hx as [Hx|Hx]; [left|right]; auto. | ||||
|    apply (IH (l1++l2)); auto. | ||||
|    * apply NoDup_remove_1 with a; rewrite <- H12; auto. | ||||
|    * apply eq_add_S. | ||||
|      simpl in E; rewrite E, H12, !app_length; simpl; auto with arith. | ||||
|    * intros y Hy. assert (Hy' : In y l') by (apply H; simpl; auto). | ||||
|      rewrite in_middle in Hy'; eauto. | ||||
|      destruct Hy'; auto. subst y; intuition. | ||||
| Qed. | ||||
|  | ||||
| Lemma NoDup_Permutation l l' : NoDup l -> NoDup l' -> | ||||
|   (forall x:A, In x l <-> In x l') -> Permutation l l'. | ||||
| Proof. | ||||
|  intros N. revert l'. induction N as [|a l Hal Hl IH]. | ||||
|  - destruct l'; simpl; auto. | ||||
|    intros Hl' H. exfalso. rewrite (H a); auto. | ||||
|  - intros l' Hl' H. | ||||
|    assert (Ha : In a l') by (apply H; simpl; auto). | ||||
|    destruct (In_split _ _ Ha) as (l1 & l2 & H12). | ||||
|    rewrite H12. | ||||
|    apply Permutation_cons_app. | ||||
|    apply IH; auto. | ||||
|    * apply NoDup_remove_1 with a; rewrite <- H12; auto. | ||||
|    * intro x. split; intros Hx. | ||||
|      + assert (Hx' : In x l') by (apply H; simpl; auto). | ||||
|        rewrite in_middle in Hx'; eauto. | ||||
|        destruct Hx'; auto. subst; intuition. | ||||
|      + assert (Hx' : In x l') by (rewrite (in_middle l1 l2 a); eauto). | ||||
|        rewrite <- H in Hx'. destruct Hx'; auto. | ||||
|        subst. destruct (NoDup_remove_2 _ _ _ Hl' Hx). | ||||
| Qed. | ||||
|  | ||||
| Lemma NoDup_Permutation_bis l l' : NoDup l -> NoDup l' -> | ||||
|   length l = length l' -> incl l l' -> Permutation l l'. | ||||
| Proof. | ||||
|  intros. apply NoDup_Permutation; auto. | ||||
|  split; auto. apply NoDup_cardinal_incl; auto. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_NoDup l l' : Permutation l l' -> NoDup l -> NoDup l'. | ||||
| Proof. | ||||
|  induction 1; auto. | ||||
|  * inversion_clear 1; constructor; eauto using Permutation_in. | ||||
|  * inversion_clear 1 as [|? ? H1 H2]. inversion_clear H2; simpl in *. | ||||
|    constructor. simpl; intuition. constructor; intuition. | ||||
| Qed. | ||||
|  | ||||
| Global Instance Permutation_NoDup' : | ||||
|  Proper (@Permutation A ==> iff) (@NoDup A) | 10. | ||||
| Proof. | ||||
|   repeat red; eauto using Permutation_NoDup. | ||||
| Qed. | ||||
|  | ||||
| End Permutation_properties. | ||||
|  | ||||
| Section Permutation_map. | ||||
|  | ||||
| Variable A B : Type. | ||||
| Variable f : A -> B. | ||||
|  | ||||
| Lemma Permutation_map l l' : | ||||
|   Permutation l l' -> Permutation (map f l) (map f l'). | ||||
| Proof. | ||||
|  induction 1; simpl; eauto. | ||||
| Qed. | ||||
|  | ||||
| Global Instance Permutation_map' : | ||||
|   Proper (@Permutation A ==> @Permutation B) (map f) | 10. | ||||
| Proof. | ||||
|   exact Permutation_map. | ||||
| Qed. | ||||
|  | ||||
| End Permutation_map. | ||||
|  | ||||
| Section Injection. | ||||
|  | ||||
| Definition injective {A B} (f : A->B) := | ||||
|  forall x y, f x = f y -> x = y. | ||||
|  | ||||
| Lemma injective_map_NoDup {A B} (f:A->B) (l:list A) : | ||||
|  injective f -> NoDup l -> NoDup (map f l). | ||||
| Proof. | ||||
|  intros Hf. induction 1 as [|x l Hx Hl IH]; simpl; constructor; trivial. | ||||
|  rewrite in_map_iff. intros (y & Hy & Hy'). apply Hf in Hy. now subst. | ||||
| Qed. | ||||
|  | ||||
| Lemma injective_bounded_surjective n f : | ||||
|  injective f -> | ||||
|  (forall x, x < n -> f x < n) -> | ||||
|  (forall y, y < n -> exists x, x < n /\ f x = y). | ||||
| Proof. | ||||
|  intros Hf H. | ||||
|  set (l := seq 0 n). | ||||
|  assert (P : incl (map f l) l). | ||||
|  { intros x. rewrite in_map_iff. intros (y & <- & Hy'). | ||||
|    unfold l in *. rewrite in_seq in *. simpl in *. | ||||
|    destruct Hy' as (_,Hy'). auto with arith. } | ||||
|  assert (P' : incl l (map f l)). | ||||
|  { unfold l. | ||||
|    apply NoDup_cardinal_incl; auto using injective_map_NoDup, seq_NoDup. | ||||
|    now rewrite map_length. } | ||||
|  intros x Hx. | ||||
|  assert (Hx' : In x l) by (unfold l; rewrite in_seq; auto with arith). | ||||
|  apply P' in Hx'. | ||||
|  rewrite in_map_iff in Hx'. destruct Hx' as (y & Hy & Hy'). | ||||
|  exists y; split; auto. unfold l in *; rewrite in_seq in Hy'. | ||||
|  destruct Hy'; auto with arith. | ||||
| Qed. | ||||
|  | ||||
| Lemma nat_bijection_Permutation n f : | ||||
|  injective f -> (forall x, x < n -> f x < n) -> | ||||
|  let l := seq 0 n in Permutation (map f l) l. | ||||
| Proof. | ||||
|  intros Hf BD. | ||||
|  apply NoDup_Permutation_bis; auto using injective_map_NoDup, seq_NoDup. | ||||
|  * now rewrite map_length. | ||||
|  * intros x. rewrite in_map_iff. intros (y & <- & Hy'). | ||||
|    rewrite in_seq in *. simpl in *. | ||||
|    destruct Hy' as (_,Hy'). auto with arith. | ||||
| Qed. | ||||
|  | ||||
| End Injection. | ||||
|  | ||||
| Section Permutation_alt. | ||||
| Variable A:Type. | ||||
| Implicit Type a : A. | ||||
| Implicit Type l : list A. | ||||
|  | ||||
| (** Alternative characterization of permutation | ||||
|     via [nth_error] and [nth] *) | ||||
|  | ||||
| Let adapt f n := | ||||
|  let m := f (S n) in if le_lt_dec m (f 0) then m else pred m. | ||||
|  | ||||
| Let adapt_injective f : injective f -> injective (adapt f). | ||||
| Proof. | ||||
|  unfold adapt. intros Hf x y EQ. | ||||
|  destruct le_lt_dec as [LE|LT]; destruct le_lt_dec as [LE'|LT']. | ||||
|  - now apply eq_add_S, Hf. | ||||
|  - apply Lt.le_lt_or_eq in LE. | ||||
|    destruct LE as [LT|EQ']; [|now apply Hf in EQ']. | ||||
|    unfold lt in LT. rewrite EQ in LT. | ||||
|    rewrite <- (Lt.S_pred _ _ LT') in LT. | ||||
|    elim (Lt.lt_not_le _ _ LT' LT). | ||||
|  - apply Lt.le_lt_or_eq in LE'. | ||||
|    destruct LE' as [LT'|EQ']; [|now apply Hf in EQ']. | ||||
|    unfold lt in LT'. rewrite <- EQ in LT'. | ||||
|    rewrite <- (Lt.S_pred _ _ LT) in LT'. | ||||
|    elim (Lt.lt_not_le _ _ LT LT'). | ||||
|  - apply eq_add_S, Hf. | ||||
|    now rewrite (Lt.S_pred _ _ LT), (Lt.S_pred _ _ LT'), EQ. | ||||
| Qed. | ||||
|  | ||||
| Let adapt_ok a l1 l2 f : injective f -> length l1 = f 0 -> | ||||
|  forall n, nth_error (l1++a::l2) (f (S n)) = nth_error (l1++l2) (adapt f n). | ||||
| Proof. | ||||
|  unfold adapt. intros Hf E n. | ||||
|  destruct le_lt_dec as [LE|LT]. | ||||
|  - apply Lt.le_lt_or_eq in LE. | ||||
|    destruct LE as [LT|EQ]; [|now apply Hf in EQ]. | ||||
|    rewrite <- E in LT. | ||||
|    rewrite 2 nth_error_app1; auto. | ||||
|  - rewrite (Lt.S_pred _ _ LT) at 1. | ||||
|    rewrite <- E, (Lt.S_pred _ _ LT) in LT. | ||||
|    rewrite 2 nth_error_app2; auto with arith. | ||||
|    rewrite <- Minus.minus_Sn_m; auto with arith. | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_nth_error l l' : | ||||
|  Permutation l l' <-> | ||||
|   (length l = length l' /\ | ||||
|    exists f:nat->nat, | ||||
|     injective f /\ forall n, nth_error l' n = nth_error l (f n)). | ||||
| Proof. | ||||
|  split. | ||||
|  { intros P. | ||||
|    split; [now apply Permutation_length|]. | ||||
|    induction P. | ||||
|    - exists (fun n => n). | ||||
|      split; try red; auto. | ||||
|    - destruct IHP as (f & Hf & Hf'). | ||||
|      exists (fun n => match n with O => O | S n => S (f n) end). | ||||
|      split; try red. | ||||
|      * intros [|y] [|z]; simpl; now auto. | ||||
|      * intros [|n]; simpl; auto. | ||||
|    - exists (fun n => match n with 0 => 1 | 1 => 0 | n => n end). | ||||
|      split; try red. | ||||
|      * intros [|[|z]] [|[|t]]; simpl; now auto. | ||||
|      * intros [|[|n]]; simpl; auto. | ||||
|    - destruct IHP1 as (f & Hf & Hf'). | ||||
|      destruct IHP2 as (g & Hg & Hg'). | ||||
|      exists (fun n => f (g n)). | ||||
|      split; try red. | ||||
|      * auto. | ||||
|      * intros n. rewrite <- Hf'; auto. } | ||||
|  { revert l. induction l'. | ||||
|    - intros [|l] (E & _); now auto. | ||||
|    - intros l (E & f & Hf & Hf'). | ||||
|      simpl in E. | ||||
|      assert (Ha : nth_error l (f 0) = Some a) | ||||
|       by (symmetry; apply (Hf' 0)). | ||||
|      destruct (nth_error_split l (f 0) Ha) as (l1 & l2 & L12 & L1). | ||||
|      rewrite L12. rewrite <- Permutation_middle. constructor. | ||||
|      apply IHl'; split; [|exists (adapt f); split]. | ||||
|      * revert E. rewrite L12, !app_length. simpl. | ||||
|        rewrite <- plus_n_Sm. now injection 1. | ||||
|      * now apply adapt_injective. | ||||
|      * intro n. rewrite <- (adapt_ok a), <- L12; auto. | ||||
|        apply (Hf' (S n)). } | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_nth_error_bis l l' : | ||||
|  Permutation l l' <-> | ||||
|   exists f:nat->nat, | ||||
|     injective f /\ | ||||
|     (forall n, n < length l -> f n < length l) /\ | ||||
|     (forall n, nth_error l' n = nth_error l (f n)). | ||||
| Proof. | ||||
|  rewrite Permutation_nth_error; split. | ||||
|  - intros (E & f & Hf & Hf'). | ||||
|    exists f. do 2 (split; trivial). | ||||
|    intros n Hn. | ||||
|    destruct (Lt.le_or_lt (length l) (f n)) as [LE|LT]; trivial. | ||||
|    rewrite <- nth_error_None, <- Hf', nth_error_None, <- E in LE. | ||||
|    elim (Lt.lt_not_le _ _ Hn LE). | ||||
|  - intros (f & Hf & Hf2 & Hf3); split; [|exists f; auto]. | ||||
|    assert (H : length l' <= length l') by auto with arith. | ||||
|    rewrite <- nth_error_None, Hf3, nth_error_None in H. | ||||
|    destruct (Lt.le_or_lt (length l) (length l')) as [LE|LT]; | ||||
|     [|apply Hf2 in LT; elim (Lt.lt_not_le _ _ LT H)]. | ||||
|    apply Lt.le_lt_or_eq in LE. destruct LE as [LT|EQ]; trivial. | ||||
|    rewrite <- nth_error_Some, Hf3, nth_error_Some in LT. | ||||
|    destruct (injective_bounded_surjective Hf Hf2 LT) as (y & Hy & Hy'). | ||||
|    apply Hf in Hy'. subst y. elim (Lt.lt_irrefl _ Hy). | ||||
| Qed. | ||||
|  | ||||
| Lemma Permutation_nth l l' d : | ||||
|  Permutation l l' <-> | ||||
|   (let n := length l in | ||||
|    length l' = n /\ | ||||
|    exists f:nat->nat, | ||||
|     (forall x, x < n -> f x < n) /\ | ||||
|     (forall x y, x < n -> y < n -> f x = f y -> x = y) /\ | ||||
|     (forall x, x < n -> nth x l' d = nth (f x) l d)). | ||||
| Proof. | ||||
|  split. | ||||
|  - intros H. | ||||
|    assert (E := Permutation_length H). | ||||
|    split; auto. | ||||
|    apply Permutation_nth_error_bis in H. | ||||
|    destruct H as (f & Hf & Hf2 & Hf3). | ||||
|    exists f. split; [|split]; auto. | ||||
|    intros n Hn. rewrite <- 2 nth_default_eq. unfold nth_default. | ||||
|     now rewrite Hf3. | ||||
|  - intros (E & f & Hf1 & Hf2 & Hf3). | ||||
|    rewrite Permutation_nth_error. | ||||
|    split; auto. | ||||
|    exists (fun n => if le_lt_dec (length l) n then n else f n). | ||||
|    split. | ||||
|    * intros x y. | ||||
|      destruct le_lt_dec as [LE|LT]; | ||||
|       destruct le_lt_dec as [LE'|LT']; auto. | ||||
|      + apply Hf1 in LT'. intros ->. | ||||
|        elim (Lt.lt_irrefl (f y)). eapply Lt.lt_le_trans; eauto. | ||||
|      + apply Hf1 in LT. intros <-. | ||||
|        elim (Lt.lt_irrefl (f x)). eapply Lt.lt_le_trans; eauto. | ||||
|    * intros n. | ||||
|      destruct le_lt_dec as [LE|LT]. | ||||
|      + assert (LE' : length l' <= n) by (now rewrite E). | ||||
|        rewrite <- nth_error_None in LE, LE'. congruence. | ||||
|      + assert (LT' : n < length l') by (now rewrite E). | ||||
|        specialize (Hf3 n LT). rewrite <- 2 nth_default_eq in Hf3. | ||||
|        unfold nth_default in Hf3. | ||||
|        apply Hf1 in LT. | ||||
|        rewrite <- nth_error_Some in LT, LT'. | ||||
|        do 2 destruct nth_error; congruence. | ||||
| Qed. | ||||
|  | ||||
| End Permutation_alt. | ||||
|  | ||||
| (* begin hide *) | ||||
| Notation Permutation_app_swap := Permutation_app_comm (only parsing). | ||||
| (* end hide *) | ||||
| @@ -1,2 +0,0 @@ | ||||
| Require Export Sorted. | ||||
| Require Export Mergesort. | ||||
							
								
								
									
										62
									
								
								samples/Coq/Spec.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								samples/Coq/Spec.v
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| (** Specifications. *) | ||||
| Require Import Coq.Lists.List. | ||||
| Require Import Coq.Strings.Ascii. | ||||
| Require Import FunctionNinjas.All. | ||||
| Require Import ListString.All. | ||||
| Require Import Computation. | ||||
|  | ||||
| Import ListNotations. | ||||
| Local Open Scope char. | ||||
|  | ||||
| (** A run is an execution of the program with explicit answers for the | ||||
|     system calls. *) | ||||
| Module Run. | ||||
|   (** We define a run by induction on the structure of a computation. *) | ||||
|   Inductive t : C.t -> Type := | ||||
|   | Ret : t C.Ret | ||||
|   | Call : forall (command : Command.t) (answer : Command.answer command) | ||||
|     {handler : Command.answer command -> C.t}, t (handler answer) -> | ||||
|     t (C.Call command handler). | ||||
|  | ||||
|   (** The trace of a run. *) | ||||
|   Fixpoint trace {x : C.t} (run : t x) | ||||
|     : list {command : Command.t & Command.answer command} := | ||||
|     match run with | ||||
|     | Ret => [] | ||||
|     | Call command answer _ run => existT _ command answer :: trace run | ||||
|     end. | ||||
| End Run. | ||||
|  | ||||
| Module Temporal. | ||||
|   Module All. | ||||
|     Inductive t (P : Command.t -> Prop) : C.t -> Prop := | ||||
|     | Ret : t P C.Ret | ||||
|     | Call : forall (c : Command.t) (h : Command.answer c -> C.t), | ||||
|       P c -> (forall a, t P (h a)) -> | ||||
|       t P (C.Call c h). | ||||
|   End All. | ||||
|  | ||||
|   Module One. | ||||
|     Inductive t (P : Command.t -> Prop) : C.t -> Prop := | ||||
|     | CallThis : forall (c : Command.t) (h : Command.answer c -> C.t), | ||||
|       P c -> | ||||
|       t P (C.Call c h) | ||||
|     | CallOther : forall (c : Command.t) (h : Command.answer c -> C.t), | ||||
|       (forall a, t P (h a)) -> | ||||
|       t P (C.Call c h). | ||||
|   End One. | ||||
|  | ||||
|   Module Then. | ||||
|     Inductive t (P1 P2 : Command.t -> Prop) : C.t -> Prop := | ||||
|     | Ret : t P1 P2 C.Ret | ||||
|     | Call : forall (c : Command.t) (h : Command.answer c -> C.t), | ||||
|       (forall a, t P1 P2 (h a)) -> | ||||
|       t P1 P2 (C.Call c h) | ||||
|     | CallThen : forall (c : Command.t) (h : Command.answer c -> C.t), | ||||
|       P1 c -> (forall a, One.t P2 (h a)) -> | ||||
|       t P1 P2 (C.Call c h). | ||||
|   End Then. | ||||
| End Temporal. | ||||
|  | ||||
| Module CardBeforeMoney. | ||||
| End CardBeforeMoney. | ||||
| @@ -1,419 +0,0 @@ | ||||
| (** Sketch of the proof of {p:nat|p<=n} = {p:nat|p<=m} -> n=m | ||||
|  | ||||
|   - preliminary results on the irrelevance of boundedness proofs | ||||
|   - introduce the notion of finite cardinal |A| | ||||
|   - prove that |{p:nat|p<=n}| = n | ||||
|   - prove that |A| = n /\ |A| = m -> n = m if equality is decidable on A | ||||
|   - prove that equality is decidable on A | ||||
|   - conclude | ||||
| *) | ||||
|  | ||||
| (** * Preliminary results on [nat] and [le] *) | ||||
|  | ||||
| (** Proving axiom K on [nat] *) | ||||
|  | ||||
| Require Import Eqdep_dec. | ||||
| Require Import Arith. | ||||
|  | ||||
| Theorem eq_rect_eq_nat : | ||||
|   forall (p:nat) (Q:nat->Type) (x:Q p) (h:p=p), x = eq_rect p Q x p h. | ||||
| Proof. | ||||
| intros. | ||||
| apply K_dec_set with (p := h). | ||||
| apply eq_nat_dec. | ||||
| reflexivity. | ||||
| Qed. | ||||
|  | ||||
| (** Proving unicity of proofs of [(n<=m)%nat] *) | ||||
|  | ||||
| Scheme le_ind' := Induction for le Sort Prop. | ||||
|  | ||||
| Theorem le_uniqueness_proof : forall (n m : nat) (p q : n <= m), p = q. | ||||
| Proof. | ||||
| induction p using le_ind'; intro q. | ||||
|  replace (le_n n) with | ||||
|   (eq_rect _ (fun n0 => n <= n0) (le_n n) _ (refl_equal n)). | ||||
|  2:reflexivity. | ||||
|   generalize (refl_equal n). | ||||
|     pattern n at 2 4 6 10, q; case q; [intro | intros m l e]. | ||||
|      rewrite <- eq_rect_eq_nat; trivial. | ||||
|      contradiction (le_Sn_n m); rewrite <- e; assumption. | ||||
|  replace (le_S n m p) with | ||||
|   (eq_rect _ (fun n0 => n <= n0) (le_S n m p) _ (refl_equal (S m))). | ||||
|  2:reflexivity. | ||||
|   generalize (refl_equal (S m)). | ||||
|     pattern (S m) at 1 3 4 6, q; case q; [intro Heq | intros m0 l HeqS]. | ||||
|      contradiction (le_Sn_n m); rewrite Heq; assumption. | ||||
|      injection HeqS; intro Heq; generalize l HeqS. | ||||
|       rewrite <- Heq; intros; rewrite <- eq_rect_eq_nat. | ||||
|       rewrite (IHp l0); reflexivity. | ||||
| Qed. | ||||
|  | ||||
| (** Proving irrelevance of boundedness proofs while building | ||||
|     elements of interval *) | ||||
|  | ||||
| Lemma dep_pair_intro : | ||||
|   forall (n x y:nat) (Hx : x<=n) (Hy : y<=n), x=y -> | ||||
|     exist (fun x => x <= n) x Hx = exist (fun x => x <= n) y Hy. | ||||
| Proof. | ||||
| intros n x y Hx Hy Heq. | ||||
| generalize Hy. | ||||
| rewrite <- Heq. | ||||
| intros. | ||||
| rewrite (le_uniqueness_proof x n Hx Hy0). | ||||
| reflexivity. | ||||
| Qed. | ||||
|  | ||||
| (** * Proving that {p:nat|p<=n} = {p:nat|p<=m} -> n=m *) | ||||
|  | ||||
| (** Definition of having finite cardinality [n+1] for a set [A] *) | ||||
|  | ||||
| Definition card (A:Set) n := | ||||
|   exists f, | ||||
|     (forall x:A, f x <= n) /\ | ||||
|     (forall x y:A, f x = f y -> x = y) /\ | ||||
|     (forall m, m <= n -> exists x:A, f x = m). | ||||
|  | ||||
| Require Import Arith. | ||||
|  | ||||
| (** Showing that the interval [0;n] has cardinality [n+1] *) | ||||
|  | ||||
| Theorem card_interval : forall n, card {x:nat|x<=n} n. | ||||
| Proof. | ||||
| intro n. | ||||
| exists (fun x:{x:nat|x<=n} => proj1_sig x). | ||||
| split. | ||||
| (* bounded *) | ||||
| intro x; apply (proj2_sig x). | ||||
| split. | ||||
| (* injectivity *) | ||||
| intros (p,Hp) (q,Hq). | ||||
| simpl. | ||||
| intro Hpq. | ||||
| apply dep_pair_intro; assumption. | ||||
| (* surjectivity *) | ||||
| intros m Hmn. | ||||
| exists (exist (fun x : nat => x <= n) m Hmn). | ||||
| reflexivity. | ||||
| Qed. | ||||
|  | ||||
| (** Showing that equality on the interval [0;n] is decidable *) | ||||
|  | ||||
| Lemma interval_dec : | ||||
|   forall n (x y : {m:nat|m<=n}), {x=y}+{x<>y}. | ||||
| Proof. | ||||
| intros n (p,Hp). | ||||
| induction p; intros ([|q],Hq). | ||||
| left. | ||||
|   apply dep_pair_intro. | ||||
|   reflexivity. | ||||
| right. | ||||
|   intro H; discriminate H. | ||||
| right. | ||||
|   intro H; discriminate H. | ||||
| assert (Hp' : p <= n). | ||||
|   apply le_Sn_le; assumption. | ||||
| assert (Hq' : q <= n). | ||||
|   apply le_Sn_le; assumption. | ||||
| destruct (IHp Hp' (exist (fun m => m <= n) q Hq')) | ||||
|   as [Heq|Hneq]. | ||||
| left. | ||||
|   injection Heq; intro Heq'. | ||||
|   apply dep_pair_intro. | ||||
|   apply eq_S. | ||||
|   assumption. | ||||
| right. | ||||
|   intro HeqS. | ||||
|   injection HeqS; intro Heq. | ||||
|   apply Hneq. | ||||
|   apply dep_pair_intro. | ||||
|   assumption. | ||||
| Qed. | ||||
|  | ||||
| (** Showing that the cardinality relation is functional on decidable sets *) | ||||
|  | ||||
| Lemma card_inj_aux : | ||||
|   forall (A:Type) f g n, | ||||
|     (forall x:A, f x <= 0) -> | ||||
|     (forall x y:A, f x = f y -> x = y) -> | ||||
|     (forall m, m <= S n -> exists x:A, g x = m) | ||||
|      -> False. | ||||
| Proof. | ||||
| intros A f g n Hfbound Hfinj Hgsurj. | ||||
| destruct (Hgsurj (S n) (le_n _)) as (x,Hx). | ||||
| destruct (Hgsurj n (le_S _ _ (le_n _))) as (x',Hx'). | ||||
| assert (Hfx : 0 = f x). | ||||
| apply le_n_O_eq. | ||||
| apply Hfbound. | ||||
| assert (Hfx' : 0 = f x'). | ||||
| apply le_n_O_eq. | ||||
| apply Hfbound. | ||||
| assert (x=x'). | ||||
| apply Hfinj. | ||||
| rewrite <- Hfx. | ||||
| rewrite <- Hfx'. | ||||
| reflexivity. | ||||
| rewrite H in Hx. | ||||
| rewrite Hx' in Hx. | ||||
| apply (n_Sn _ Hx). | ||||
| Qed. | ||||
|  | ||||
| (** For [dec_restrict], we use a lemma on the negation of equality | ||||
| that requires proof-irrelevance. It should be possible to avoid this | ||||
| lemma by generalizing over a first-order definition of [x<>y], say | ||||
| [neq] such that [{x=y}+{neq x y}] and [~(x=y /\ neq x y)]; for such | ||||
| [neq], unicity of proofs could be proven *) | ||||
|  | ||||
|   Require Import Classical. | ||||
|   Lemma neq_dep_intro : | ||||
|    forall (A:Set) (z x y:A) (p:x<>z) (q:y<>z), x=y -> | ||||
|       exist (fun x => x <> z) x p = exist (fun x => x <> z) y q. | ||||
|   Proof. | ||||
|   intros A z x y p q Heq. | ||||
|    generalize q; clear q; rewrite <- Heq; intro q. | ||||
|    rewrite (proof_irrelevance _ p q); reflexivity. | ||||
|   Qed. | ||||
|  | ||||
| Lemma dec_restrict : | ||||
|   forall (A:Set), | ||||
|     (forall x y :A, {x=y}+{x<>y}) -> | ||||
|      forall z (x y :{a:A|a<>z}), {x=y}+{x<>y}. | ||||
| Proof. | ||||
| intros A Hdec z (x,Hx) (y,Hy). | ||||
| destruct (Hdec x y) as [Heq|Hneq]. | ||||
| left; apply neq_dep_intro; assumption. | ||||
| right; intro Heq; injection Heq; exact Hneq. | ||||
| Qed. | ||||
|  | ||||
| Lemma pred_inj : forall n m, | ||||
|   0 <> n -> 0 <> m -> pred m = pred n -> m = n. | ||||
| Proof. | ||||
| destruct n. | ||||
| intros m H; destruct H; reflexivity. | ||||
| destruct m. | ||||
| intros _ H; destruct H; reflexivity. | ||||
| simpl; intros _ _ H. | ||||
| rewrite H. | ||||
| reflexivity. | ||||
| Qed. | ||||
|  | ||||
| Lemma le_neq_lt : forall n m, n <= m -> n<>m -> n < m. | ||||
| Proof. | ||||
| intros n m Hle Hneq. | ||||
| destruct (le_lt_eq_dec n m Hle). | ||||
| assumption. | ||||
| contradiction. | ||||
| Qed. | ||||
|  | ||||
| Lemma inj_restrict : | ||||
|   forall (A:Set) (f:A->nat) x y z, | ||||
|     (forall x y : A, f x = f y -> x = y) | ||||
|     -> x <> z -> f y < f z -> f z <= f x | ||||
|     -> pred (f x) = f y | ||||
|     -> False. | ||||
|  | ||||
| (* Search error sans le type de f !! *) | ||||
| Proof. | ||||
| intros A f x y z Hfinj Hneqx Hfy Hfx Heq. | ||||
| assert (f z <> f x). | ||||
|   apply sym_not_eq. | ||||
|   intro Heqf. | ||||
|   apply Hneqx. | ||||
|   apply Hfinj. | ||||
|   assumption. | ||||
| assert (f x = S (f y)). | ||||
|   assert (0 < f x). | ||||
|     apply le_lt_trans with (f z). | ||||
|     apply le_O_n. | ||||
|     apply le_neq_lt; assumption. | ||||
|   apply pred_inj. | ||||
|   apply O_S. | ||||
|   apply lt_O_neq; assumption. | ||||
|   exact Heq. | ||||
| assert (f z <= f y). | ||||
| destruct (le_lt_or_eq _ _ Hfx). | ||||
|   apply lt_n_Sm_le. | ||||
|   rewrite <- H0. | ||||
|   assumption. | ||||
|   contradiction Hneqx. | ||||
|   symmetry. | ||||
|   apply Hfinj. | ||||
|   assumption. | ||||
| contradiction (lt_not_le (f y) (f z)). | ||||
| Qed. | ||||
|  | ||||
| Theorem card_inj : forall m n (A:Set), | ||||
|   (forall x y :A, {x=y}+{x<>y}) -> | ||||
|   card A m -> card A n -> m = n. | ||||
| Proof. | ||||
| induction m; destruct n; | ||||
| intros A Hdec | ||||
|  (f,(Hfbound,(Hfinj,Hfsurj))) | ||||
|  (g,(Hgbound,(Hginj,Hgsurj))). | ||||
| (* 0/0 *) | ||||
| reflexivity. | ||||
| (* 0/Sm *) | ||||
| destruct (card_inj_aux _ _ _ _ Hfbound Hfinj Hgsurj). | ||||
| (* Sn/0 *) | ||||
| destruct (card_inj_aux _ _ _ _ Hgbound Hginj Hfsurj). | ||||
| (* Sn/Sm *) | ||||
| destruct (Hgsurj (S n) (le_n _)) as (xSn,HSnx). | ||||
| rewrite IHm with (n:=n) (A := {x:A|x<>xSn}). | ||||
| reflexivity. | ||||
| (* decidability of eq on {x:A|x<>xSm} *) | ||||
| apply dec_restrict. | ||||
| assumption. | ||||
| (* cardinality of {x:A|x<>xSn} is m *) | ||||
| pose (f' := fun x' : {x:A|x<>xSn} => | ||||
|     let (x,Hneq) := x' in | ||||
|     if le_lt_dec (f xSn) (f x) | ||||
|     then pred (f x) | ||||
|     else f x). | ||||
| exists f'. | ||||
| split. | ||||
| (* f' is bounded *) | ||||
| unfold f'. | ||||
| intros (x,_). | ||||
| destruct (le_lt_dec (f xSn) (f x)) as [Hle|Hge]. | ||||
| change m with (pred (S m)). | ||||
| apply le_pred. | ||||
| apply Hfbound. | ||||
| apply le_S_n. | ||||
| apply le_trans with (f xSn). | ||||
| exact Hge. | ||||
| apply Hfbound. | ||||
| split. | ||||
| (* f' is injective *) | ||||
| unfold f'. | ||||
| intros (x,Hneqx) (y,Hneqy) Heqf'. | ||||
| destruct (le_lt_dec (f xSn) (f x)) as [Hlefx|Hgefx]; | ||||
| destruct (le_lt_dec (f xSn) (f y)) as [Hlefy|Hgefy]. | ||||
| (* f xSn <= f x et f xSn <= f y *) | ||||
| assert (Heq : x = y). | ||||
|   apply Hfinj. | ||||
|   assert (f xSn <> f y). | ||||
|     apply sym_not_eq. | ||||
|     intro Heqf. | ||||
|     apply Hneqy. | ||||
|     apply Hfinj. | ||||
|     assumption. | ||||
|   assert (0 < f y). | ||||
|     apply le_lt_trans with (f xSn). | ||||
|     apply le_O_n. | ||||
|     apply le_neq_lt; assumption. | ||||
|   assert (f xSn <> f x). | ||||
|     apply sym_not_eq. | ||||
|     intro Heqf. | ||||
|     apply Hneqx. | ||||
|     apply Hfinj. | ||||
|     assumption. | ||||
|   assert (0 < f x). | ||||
|     apply le_lt_trans with (f xSn). | ||||
|     apply le_O_n. | ||||
|     apply le_neq_lt; assumption. | ||||
|   apply pred_inj. | ||||
|   apply lt_O_neq; assumption. | ||||
|   apply lt_O_neq; assumption. | ||||
|   assumption. | ||||
| apply neq_dep_intro; assumption. | ||||
| (* f y < f xSn <= f x *) | ||||
| destruct (inj_restrict A f x y xSn); assumption. | ||||
| (* f x < f xSn <= f y *) | ||||
| symmetry in Heqf'. | ||||
| destruct (inj_restrict A f y x xSn); assumption. | ||||
| (* f x < f xSn et f y < f xSn *) | ||||
| assert (Heq : x=y). | ||||
|   apply Hfinj; assumption. | ||||
| apply neq_dep_intro; assumption. | ||||
| (* f' is surjective *) | ||||
| intros p Hlep. | ||||
| destruct (le_lt_dec (f xSn) p) as [Hle|Hlt]. | ||||
| (* case f xSn <= p *) | ||||
| destruct (Hfsurj (S p) (le_n_S _ _ Hlep)) as (x,Hx). | ||||
| assert (Hneq : x <> xSn). | ||||
|   intro Heqx. | ||||
|   rewrite Heqx in Hx. | ||||
|   rewrite Hx in Hle. | ||||
|   apply le_Sn_n with p; assumption. | ||||
| exists (exist (fun a => a<>xSn) x Hneq). | ||||
| unfold f'. | ||||
| destruct (le_lt_dec (f xSn) (f x)) as [Hle'|Hlt']. | ||||
| rewrite Hx; reflexivity. | ||||
| rewrite Hx in Hlt'. | ||||
| contradiction (le_not_lt (f xSn) p). | ||||
| apply lt_trans with (S p). | ||||
| apply lt_n_Sn. | ||||
| assumption. | ||||
| (* case p < f xSn *) | ||||
| destruct (Hfsurj p (le_S _ _ Hlep)) as (x,Hx). | ||||
| assert (Hneq : x <> xSn). | ||||
|   intro Heqx. | ||||
|   rewrite Heqx in Hx. | ||||
|   rewrite Hx in Hlt. | ||||
|   apply (lt_irrefl p). | ||||
|   assumption. | ||||
| exists (exist (fun a => a<>xSn) x Hneq). | ||||
| unfold f'. | ||||
| destruct (le_lt_dec (f xSn) (f x)) as [Hle'|Hlt']. | ||||
|   rewrite Hx in Hle'. | ||||
|   contradiction (lt_irrefl p). | ||||
|   apply lt_le_trans with (f xSn); assumption. | ||||
|   assumption. | ||||
| (* cardinality of {x:A|x<>xSn} is n *) | ||||
| pose (g' := fun x' : {x:A|x<>xSn} => | ||||
|    let (x,Hneq) := x' in | ||||
|    if Hdec x xSn then 0 else g x). | ||||
| exists g'. | ||||
| split. | ||||
| (* g is bounded *) | ||||
| unfold g'. | ||||
| intros (x,_). | ||||
| destruct (Hdec x xSn) as [_|Hneq]. | ||||
| apply le_O_n. | ||||
| assert (Hle_gx:=Hgbound x). | ||||
| destruct (le_lt_or_eq _ _ Hle_gx). | ||||
| apply lt_n_Sm_le. | ||||
| assumption. | ||||
| contradiction Hneq. | ||||
| apply Hginj. | ||||
| rewrite HSnx. | ||||
| assumption. | ||||
| split. | ||||
| (* g is injective *) | ||||
| unfold g'. | ||||
| intros (x,Hneqx) (y,Hneqy) Heqg'. | ||||
| destruct (Hdec x xSn) as [Heqx|_]. | ||||
| contradiction Hneqx. | ||||
| destruct (Hdec y xSn) as [Heqy|_]. | ||||
| contradiction Hneqy. | ||||
| assert (Heq : x=y). | ||||
|   apply Hginj; assumption. | ||||
| apply neq_dep_intro; assumption. | ||||
| (* g is surjective *) | ||||
| intros p Hlep. | ||||
| destruct (Hgsurj p (le_S _ _ Hlep)) as (x,Hx). | ||||
| assert (Hneq : x<>xSn). | ||||
|   intro Heq. | ||||
|   rewrite Heq in Hx. | ||||
|   rewrite Hx in HSnx. | ||||
|   rewrite HSnx in Hlep. | ||||
|   contradiction (le_Sn_n _ Hlep). | ||||
| exists (exist (fun a => a<>xSn) x Hneq). | ||||
| simpl. | ||||
| destruct (Hdec x xSn) as [Heqx|_]. | ||||
| contradiction Hneq. | ||||
| assumption. | ||||
| Qed. | ||||
|  | ||||
| (** Conclusion *) | ||||
|  | ||||
| Theorem interval_discr : | ||||
|   forall n m, {p:nat|p<=n} = {p:nat|p<=m} -> n=m. | ||||
| Proof. | ||||
| intros n m Heq. | ||||
| apply card_inj with (A := {p:nat|p<=n}). | ||||
| apply interval_dec. | ||||
| apply card_interval. | ||||
| rewrite Heq. | ||||
| apply card_interval. | ||||
| Qed. | ||||
							
								
								
									
										24
									
								
								samples/EBNF/grammar.ebnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								samples/EBNF/grammar.ebnf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| (* | ||||
|   Source:  https://github.com/sunjay/lion | ||||
|   License: MIT | ||||
| *) | ||||
|  | ||||
| Statement = ( NamedFunction | AnonymousFunction | Assignment | Expr ) , "\n" ; | ||||
| Expr = AnonymousFunction | Term | "(" , Expr , ")" , | ||||
|     { AnonymousFunction | Term | "(" , Expr , ")" } ; | ||||
|  | ||||
| Assignment = Symbol , "=" , Expr ; | ||||
|  | ||||
| AnonymousFunction = "\" , FunctionRHS ; | ||||
| NamedFunction = Symbol , FunctionRHS ; | ||||
|  | ||||
| FunctionRHS = FunctionParams , "=" , FunctionBody ; | ||||
| FunctionParams = FunctionParam , { FunctionParam } ; | ||||
| FunctionParam = Term ; | ||||
| FunctionBody = Expr ; | ||||
|  | ||||
| Term = Symbol | Number | SingleWordString ; | ||||
| SingleWordString = '"' , Symbol , '"' ; | ||||
| (* Symbol is a collection of valid symbol characters, not defined here *) | ||||
| (* Number is a valid numeric literal *) | ||||
|  | ||||
							
								
								
									
										40
									
								
								samples/EBNF/material.ebnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								samples/EBNF/material.ebnf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| (* | ||||
|   Source:  https://github.com/io7m/jsom0 | ||||
|   License: ISC | ||||
| *) | ||||
|  | ||||
| name = | ||||
|   "name" , string , ";" ; | ||||
|  | ||||
| diffuse = | ||||
|   "diffuse" , real , real , real , ";" ; | ||||
|  | ||||
| ambient = | ||||
|   "ambient" , real , real , real , ";" ; | ||||
|  | ||||
| specular = | ||||
|   "specular" , real , real , real , real , ";" ; | ||||
|  | ||||
| shininess = | ||||
|   "shininess" , real , ";" ; | ||||
|  | ||||
| alpha = | ||||
|   "alpha" , real , ";" ; | ||||
|  | ||||
| mapping = | ||||
|   "map_chrome" | "map_uv" ; | ||||
|  | ||||
| texture = | ||||
|   "texture" , string , real , mapping , ";" ; | ||||
|  | ||||
| material = | ||||
|   "material" , ";" , | ||||
|     name , | ||||
|     diffuse , | ||||
|     ambient , | ||||
|     specular , | ||||
|     shininess , | ||||
|     alpha , | ||||
|     [ texture ] , | ||||
|   "end" , ";" ; | ||||
|  | ||||
							
								
								
									
										61
									
								
								samples/EBNF/object.ebnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								samples/EBNF/object.ebnf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| (* | ||||
|   Source:  https://github.com/io7m/jsom0 | ||||
|   License: ISC | ||||
| *) | ||||
|  | ||||
| vertex_p3n3_name = | ||||
|   "vertex_p3n3" ; | ||||
|  | ||||
| vertex_p3n3t2_name = | ||||
|   "vertex_p3n3t2" ; | ||||
|  | ||||
| vertex_type = | ||||
|   vertex_p3n3_name | vertex_p3n3t2_name ; | ||||
|  | ||||
| vertex_position = | ||||
|   "position" , real , real , real , ";" ; | ||||
|  | ||||
| vertex_normal = | ||||
|   "normal" , real , real , real , ";" ; | ||||
|  | ||||
| vertex_uv = | ||||
|   "uv" , real , real , ";" ; | ||||
|  | ||||
| vertex_p3n3 = | ||||
|   vertex_p3n3_name , vertex_position , vertex_normal , "end" , ";" ; | ||||
|  | ||||
| vertex_p3n3t2 = | ||||
|   vertex_p3n3t2_name , vertex_position , vertex_normal , vertex_uv , "end" , ";" ; | ||||
|  | ||||
| vertex = | ||||
|   vertex_p3n3 | vertex_p3n3t2 ; | ||||
|  | ||||
| vertex_array = | ||||
|   "array" , positive , vertex_type , { vertex } , "end" , ";" ; | ||||
|  | ||||
| vertices = | ||||
|   "vertices" , ";" , vertex_array , "end" , ";" ; | ||||
|  | ||||
| triangle = | ||||
|   "triangle" , natural , natural , natural , ";" ; | ||||
|  | ||||
| triangle_array = | ||||
|   "array" , positive, "triangle" , { triangle } , "end" , ";" ; | ||||
|  | ||||
| triangles = | ||||
|   "triangles" , ";" , triangle_array , "end" , ";" ; | ||||
|  | ||||
| name = | ||||
|   "name" , string , ";" ; | ||||
|  | ||||
| material_name = | ||||
|   "material_name" , string , ";" ; | ||||
|  | ||||
| object = | ||||
|   "object" , ";" , | ||||
|     name , | ||||
|     material_name , | ||||
|     vertices , | ||||
|     triangles , | ||||
|   "end" , ";" ; | ||||
|  | ||||
							
								
								
									
										20
									
								
								samples/EBNF/types.ebnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/EBNF/types.ebnf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| (* | ||||
|   Source:  https://github.com/io7m/jsom0 | ||||
|   License: ISC | ||||
| *) | ||||
|  | ||||
| digit_without_zero = | ||||
|   "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; | ||||
|  | ||||
| digit = | ||||
|   "0" | digit_without_zero ; | ||||
|  | ||||
| positive = | ||||
|   digit_without_zero , { digit } ; | ||||
|  | ||||
| natural = | ||||
|   "0" | positive ; | ||||
|  | ||||
| real = | ||||
|   [ "-" ] , digit , [ "." , { digit } ] ; | ||||
|  | ||||
							
								
								
									
										6
									
								
								samples/Emacs Lisp/filenames/.abbrev_defs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/Emacs Lisp/filenames/.abbrev_defs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| (define-abbrev-table 'c-mode-abbrev-table '( | ||||
| 	)) | ||||
| (define-abbrev-table 'fundamental-mode-abbrev-table '( | ||||
| 	("TM" "™" nil 0) | ||||
| 	("(R)" "®" nil 0) | ||||
| 	("C=" "€" nil 0))) | ||||
							
								
								
									
										20
									
								
								samples/Emacs Lisp/filenames/.gnus
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/Emacs Lisp/filenames/.gnus
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| (setq user-full-name "Alhadis") | ||||
| (setq user-mail-address "fake.account@gmail.com") | ||||
|  | ||||
| (auto-image-file-mode) | ||||
| (setq mm-inline-large-images t) | ||||
| (add-to-list 'mm-attachment-override-types "image/*") | ||||
|  | ||||
| (setq gnus-select-method  | ||||
| 	  '(nnimap "gmail" | ||||
| 		(nnimap-address "imap.gmail.com") | ||||
| 		(nnimap-server-port 777) | ||||
| 		(nnimap-stream ssl))) | ||||
|  | ||||
| (setq message-send-mail-function 'smtpmail-send-it | ||||
| 	  smtpmail-starttls-credentials '(("smtp.gmail.com" 600 nil nil)) | ||||
| 	  smtpmail-auth-credentials '(("smtp.gmail.com" 700 "me@lisp.com" nil)) | ||||
| 	  smtpmail-default-smtp-server "smtp.gmail.com" | ||||
| 	  smtpmail-smtp-server "smtp.gmail.com" | ||||
| 	  smtpmail-smtp-service 800 | ||||
| 	  setq gnus-ignored-from-addresses "^from\\.Telstra[ \t\r\n]+Thanks") | ||||
							
								
								
									
										10
									
								
								samples/Emacs Lisp/filenames/.viper
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/Emacs Lisp/filenames/.viper
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| (setq viper-inhibit-startup-message 't) | ||||
| (setq viper-expert-level '5) | ||||
|  | ||||
| ; Key bindings | ||||
| (define-key viper-vi-global-user-map "\C-d" 'end-of-line) | ||||
|  | ||||
| ; Return to top of window | ||||
| (defun my-viper-return-to-top () | ||||
|   (interactive) | ||||
|   (beginning-of-buffer)) | ||||
							
								
								
									
										34
									
								
								samples/Emacs Lisp/filenames/Project.ede
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								samples/Emacs Lisp/filenames/Project.ede
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| ;; Object EDE | ||||
| (ede-proj-project "Linguist" | ||||
|   :name "Linguist" | ||||
|   :version "4.9" | ||||
|   :file "Project.ede" | ||||
|   :targets (list  | ||||
|    (ede-proj-target-elisp-autoloads "autoloads" | ||||
|     :name "autoloads" | ||||
|     :path "test/samples/Emacs Lisp" | ||||
|     :autoload-file "dude.el" | ||||
|     ) | ||||
|    (ede-proj-target-elisp "init" | ||||
|     :name "init" | ||||
|     :path "" | ||||
|     :source '("ede-load.el" "wait-what.el") | ||||
|     :compiler 'ede-emacs-preload-compiler | ||||
|     :pre-load-packages '("sample-names") | ||||
|     ) | ||||
|    (ede-proj-target-elisp "what" | ||||
|     :name "the" | ||||
|     :path "" | ||||
|     :source '("h.el" "am-i-writing.el") | ||||
|     :versionsource '("hell.el") | ||||
|     :compiler 'ede-emacs-preload-compiler | ||||
|     :aux-packages '("what" "the" "hell-files" "am-i-writing") | ||||
|     ) | ||||
|    ) | ||||
|   :web-site-url "https://github.com/github/linguist" | ||||
|   :web-site-directory "../" | ||||
|   :web-site-file "CONTRIBUTING.md" | ||||
|   :ftp-upload-site "/ftp@git.hub.com:/madeup" | ||||
|   :configuration-variables 'nil | ||||
|   :metasubproject 't | ||||
|   ) | ||||
							
								
								
									
										70
									
								
								samples/Emacs Lisp/filenames/_emacs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								samples/Emacs Lisp/filenames/_emacs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| ;; UTF-8 support | ||||
| ;; (set-language-environment "UTF-8") | ||||
| (setenv "LANG" "en_AU.UTF-8") | ||||
| (setenv "LC_ALL" "en_AU.UTF-8") | ||||
| (setq default-tab-width 4) | ||||
|  | ||||
|  | ||||
| ;;; Function to load all ".el" files in ~/.emacs.d/config | ||||
| (defun load-directory (directory) | ||||
|   "Recursively load all Emacs Lisp files in a directory." | ||||
|   (dolist (element (directory-files-and-attributes directory nil nil nil)) | ||||
|     (let* ((path (car element)) | ||||
|            (fullpath (concat directory "/" path)) | ||||
|            (isdir (car (cdr element))) | ||||
|            (ignore-dir (or (string= path ".") (string= path "..")))) | ||||
|       (cond | ||||
|        ((and (eq isdir t) (not ignore-dir)) | ||||
|         (load-directory fullpath)) | ||||
|        ((and (eq isdir nil) (string= (substring path -3) ".el")) | ||||
|         (load (file-name-sans-extension fullpath))))))) | ||||
|  | ||||
| ;; Tell Emacs we'd like to use Hunspell for spell-checking | ||||
| (setq ispell-program-name (executable-find "hunspell")) | ||||
|  | ||||
| ;; Load Homebrew-installed packages | ||||
| (let ((default-directory "/usr/local/share/emacs/site-lisp/")) | ||||
|   (normal-top-level-add-subdirs-to-load-path)) | ||||
| (load "aggressive-indent") | ||||
| (add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode) | ||||
| (autoload 'rust-mode "rust-mode" nil t) | ||||
| (add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode)) | ||||
|  | ||||
| ;; Load Git-related syntax highlighting | ||||
| (add-to-list 'load-path "~/.emacs.d/lisp/") | ||||
| (load "git-modes") | ||||
| (load "git-commit") | ||||
|  | ||||
| ;; Keybindings | ||||
| (global-set-key (kbd "C-u") (lambda () | ||||
|                              (interactive) | ||||
|                              (kill-line 0))) | ||||
|  | ||||
| ;; Show cursor's current column number | ||||
| (setq column-number-mode t) | ||||
|  | ||||
| ;; Disable autosave | ||||
| (setq auto-save-default nil) | ||||
|  | ||||
| ;; Use a single directory for storing backup files | ||||
| (setq backup-directory-alist `(("." . "~/.emacs.d/auto-save-list"))) | ||||
| (setq backup-by-copying t) | ||||
| (setq delete-old-versions t | ||||
|       kept-new-versions 6 | ||||
|       kept-old-versions 2 | ||||
|       version-control t) | ||||
|  | ||||
| (custom-set-variables | ||||
|  ;; custom-set-variables was added by Custom. | ||||
|  ;; If you edit it by hand, you could mess it up, so be careful. | ||||
|  ;; Your init file should contain only one such instance. | ||||
|  ;; If there is more than one, they won't work right. | ||||
|  '(blink-cursor-mode nil) | ||||
|  '(column-number-mode t) | ||||
|  '(show-paren-mode t)) | ||||
| (custom-set-faces | ||||
|  ;; custom-set-faces was added by Custom. | ||||
|  ;; If you edit it by hand, you could mess it up, so be careful. | ||||
|  ;; Your init file should contain only one such instance. | ||||
|  ;; If there is more than one, they won't work right. | ||||
|  ) | ||||
							
								
								
									
										8
									
								
								samples/Emacs Lisp/filenames/abbrev_defs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Emacs Lisp/filenames/abbrev_defs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| (define-abbrev-table 'fundamental-mode-abbrev-table '( | ||||
| 	("cat" "Concatenate" nil 0) | ||||
| 	("WTF" "World Trade Federation " nil 0) | ||||
| 	("rtbtm" "Read that back to me" nil 0))) | ||||
|  | ||||
| (define-abbrev-table 'shell-script-mode-abbrev-table '( | ||||
| 	("brake", "bundle rake exec" nil 0) | ||||
| 	("pls", "warning: setting Encoding.default_external"))) | ||||
							
								
								
									
										6
									
								
								samples/Fortran/bug-185631.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/Fortran/bug-185631.f
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| ! Codes/HYCOM/hycom/ATLb2.00/src_2.0.01_22_one/ | ||||
|       real onemu, twomu | ||||
|       data onemu/0.0098/ | ||||
|       data twomu/1./ | ||||
|       data threemu/0.e9/ | ||||
|       end | ||||
							
								
								
									
										59
									
								
								samples/GN/BUILD.2.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								samples/GN/BUILD.2.gn
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| # Copyright 2016 the V8 project authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("../gni/isolate.gni") | ||||
|  | ||||
| group("gn_all") { | ||||
|   testonly = true | ||||
|  | ||||
|   if (v8_test_isolation_mode != "noop") { | ||||
|     deps = [ | ||||
|       ":check-static-initializers_run", | ||||
|       ":jsfunfuzz_run", | ||||
|       ":run-deopt-fuzzer_run", | ||||
|       ":run-gcmole_run", | ||||
|       ":run-valgrind_run", | ||||
|     ] | ||||
|   } | ||||
| } | ||||
|  | ||||
| v8_isolate_run("check-static-initializers") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "check-static-initializers.isolate" | ||||
| } | ||||
|  | ||||
| v8_isolate_run("jsfunfuzz") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "jsfunfuzz/jsfunfuzz.isolate" | ||||
| } | ||||
|  | ||||
| v8_isolate_run("run-deopt-fuzzer") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "run-deopt-fuzzer.isolate" | ||||
| } | ||||
|  | ||||
| v8_isolate_run("run-gcmole") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "gcmole/run-gcmole.isolate" | ||||
| } | ||||
|  | ||||
| v8_isolate_run("run-valgrind") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "run-valgrind.isolate" | ||||
| } | ||||
							
								
								
									
										1646
									
								
								samples/GN/BUILD.3.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1646
									
								
								samples/GN/BUILD.3.gn
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2583
									
								
								samples/GN/BUILD.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2583
									
								
								samples/GN/BUILD.gn
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2781
									
								
								samples/GN/android-rules.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2781
									
								
								samples/GN/android-rules.gni
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								samples/GN/clang.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/GN/clang.gni
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| # Copyright 2014 The Chromium Authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("//build/toolchain/toolchain.gni") | ||||
|  | ||||
| declare_args() { | ||||
|   # Indicates if the build should use the Chrome-specific plugins for enforcing | ||||
|   # coding guidelines, etc. Only used when compiling with Clang. | ||||
|   clang_use_chrome_plugins = is_clang && !is_nacl && !use_xcode_clang | ||||
|  | ||||
|   clang_base_path = "//third_party/llvm-build/Release+Asserts" | ||||
| } | ||||
							
								
								
									
										25
									
								
								samples/GN/filenames/.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/GN/filenames/.gn
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| # This file is used by the GN meta build system to find the root of the source | ||||
| # tree and to set startup options. For documentation on the values set in this | ||||
| # file, run "gn help dotfile" at the command line. | ||||
|  | ||||
| import("//build/dotfile_settings.gni") | ||||
|  | ||||
| # The location of the build configuration file. | ||||
| buildconfig = "//build/config/BUILDCONFIG.gn" | ||||
|  | ||||
| # The secondary source root is a parallel directory tree where | ||||
| # GN build files are placed when they can not be placed directly | ||||
| # in the source tree, e.g. for third party source trees. | ||||
| secondary_source = "//build/secondary/" | ||||
|  | ||||
| # These are the targets to check headers for by default. The files in targets | ||||
| # matching these patterns (see "gn help label_pattern" for format) will have | ||||
| # their includes checked for proper dependencies when you run either | ||||
| # "gn check" or "gn gen --check". | ||||
| check_targets = [] | ||||
|  | ||||
| # These are the list of GN files that run exec_script. This whitelist exists | ||||
| # to force additional review for new uses of exec_script, which is strongly | ||||
| # discouraged except for gypi_to_gn calls. | ||||
| exec_script_whitelist = | ||||
|     build_dotfile_settings.exec_script_whitelist + [ "//test/test262/BUILD.gn" ] | ||||
							
								
								
									
										503
									
								
								samples/GN/gcc_toolchain.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										503
									
								
								samples/GN/gcc_toolchain.gni
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,503 @@ | ||||
| # Copyright (c) 2013 The Chromium Authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("//build/config/android/config.gni") | ||||
| import("//build/config/clang/clang.gni") | ||||
| import("//build/config/nacl/config.gni") | ||||
| import("//build/config/sanitizers/sanitizers.gni") | ||||
| import("//build/config/v8_target_cpu.gni") | ||||
| import("//build/toolchain/cc_wrapper.gni") | ||||
| import("//build/toolchain/goma.gni") | ||||
| import("//build/toolchain/toolchain.gni") | ||||
|  | ||||
| # This template defines a toolchain for something that works like gcc | ||||
| # (including clang). | ||||
| # | ||||
| # It requires the following variables specifying the executables to run: | ||||
| #  - ar | ||||
| #  - cc | ||||
| #  - cxx | ||||
| #  - ld | ||||
| # | ||||
| # Optional parameters that control the tools: | ||||
| # | ||||
| #  - extra_cflags | ||||
| #      Extra flags to be appended when compiling C files (but not C++ files). | ||||
| #  - extra_cppflags | ||||
| #      Extra flags to be appended when compiling both C and C++ files. "CPP" | ||||
| #      stands for "C PreProcessor" in this context, although it can be | ||||
| #      used for non-preprocessor flags as well. Not to be confused with | ||||
| #      "CXX" (which follows). | ||||
| #  - extra_cxxflags | ||||
| #      Extra flags to be appended when compiling C++ files (but not C files). | ||||
| #  - extra_ldflags | ||||
| #      Extra flags to be appended when linking | ||||
| # | ||||
| #  - libs_section_prefix | ||||
| #  - libs_section_postfix | ||||
| #      The contents of these strings, if specified, will be placed around | ||||
| #      the libs section of the linker line. It allows one to inject libraries | ||||
| #      at the beginning and end for all targets in a toolchain. | ||||
| #  - solink_libs_section_prefix | ||||
| #  - solink_libs_section_postfix | ||||
| #      Same as libs_section_{pre,post}fix except used for solink instead of link. | ||||
| #  - link_outputs | ||||
| #      The content of this array, if specified, will be added to the list of | ||||
| #      outputs from the link command. This can be useful in conjunction with | ||||
| #      the post_link parameter. | ||||
| #  - post_link | ||||
| #      The content of this string, if specified, will be run as a separate | ||||
| #      command following the the link command. | ||||
| #  - deps | ||||
| #      Just forwarded to the toolchain definition. | ||||
| #  - executable_extension | ||||
| #      If this string is specified it will be used for the file extension | ||||
| #      for an executable, rather than using no extension; targets will | ||||
| #      still be able to override the extension using the output_extension | ||||
| #      variable. | ||||
| #  - rebuild_define | ||||
| #      The contents of this string, if specified, will be passed as a #define | ||||
| #      to the toolchain. It can be used to force recompiles whenever a | ||||
| #      toolchain is updated. | ||||
| #  - shlib_extension | ||||
| #      If this string is specified it will be used for the file extension | ||||
| #      for a shared library, rather than default value specified in | ||||
| #      toolchain.gni | ||||
| #  - strip | ||||
| #      Location of the strip executable. When specified, strip will be run on | ||||
| #      all shared libraries and executables as they are built. The pre-stripped | ||||
| #      artifacts will be put in lib.unstripped/ and exe.unstripped/. | ||||
| template("gcc_toolchain") { | ||||
|   toolchain(target_name) { | ||||
|     assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value") | ||||
|     assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value") | ||||
|     assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value") | ||||
|     assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value") | ||||
|  | ||||
|     # This define changes when the toolchain changes, forcing a rebuild. | ||||
|     # Nothing should ever use this define. | ||||
|     if (defined(invoker.rebuild_define)) { | ||||
|       rebuild_string = "-D" + invoker.rebuild_define + " " | ||||
|     } else { | ||||
|       rebuild_string = "" | ||||
|     } | ||||
|  | ||||
|     # GN's syntax can't handle more than one scope dereference at once, like | ||||
|     # "invoker.toolchain_args.foo", so make a temporary to hold the toolchain | ||||
|     # args so we can do "invoker_toolchain_args.foo". | ||||
|     assert(defined(invoker.toolchain_args), | ||||
|            "Toolchains must specify toolchain_args") | ||||
|     invoker_toolchain_args = invoker.toolchain_args | ||||
|     assert(defined(invoker_toolchain_args.current_cpu), | ||||
|            "toolchain_args must specify a current_cpu") | ||||
|     assert(defined(invoker_toolchain_args.current_os), | ||||
|            "toolchain_args must specify a current_os") | ||||
|  | ||||
|     # When invoking this toolchain not as the default one, these args will be | ||||
|     # passed to the build. They are ignored when this is the default toolchain. | ||||
|     toolchain_args = { | ||||
|       # Populate toolchain args from the invoker. | ||||
|       forward_variables_from(invoker_toolchain_args, "*") | ||||
|  | ||||
|       # The host toolchain value computed by the default toolchain's setup | ||||
|       # needs to be passed through unchanged to all secondary toolchains to | ||||
|       # ensure that it's always the same, regardless of the values that may be | ||||
|       # set on those toolchains. | ||||
|       host_toolchain = host_toolchain | ||||
|  | ||||
|       if (!defined(invoker_toolchain_args.v8_current_cpu)) { | ||||
|         v8_current_cpu = invoker_toolchain_args.current_cpu | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     # When the invoker has explicitly overridden use_goma or cc_wrapper in the | ||||
|     # toolchain args, use those values, otherwise default to the global one. | ||||
|     # This works because the only reasonable override that toolchains might | ||||
|     # supply for these values are to force-disable them. | ||||
|     if (defined(toolchain_args.use_goma)) { | ||||
|       toolchain_uses_goma = toolchain_args.use_goma | ||||
|     } else { | ||||
|       toolchain_uses_goma = use_goma | ||||
|     } | ||||
|     if (defined(toolchain_args.cc_wrapper)) { | ||||
|       toolchain_cc_wrapper = toolchain_args.cc_wrapper | ||||
|     } else { | ||||
|       toolchain_cc_wrapper = cc_wrapper | ||||
|     } | ||||
|  | ||||
|     # Compute the compiler prefix. | ||||
|     if (toolchain_uses_goma) { | ||||
|       assert(toolchain_cc_wrapper == "", | ||||
|              "Goma and cc_wrapper can't be used together.") | ||||
|       compiler_prefix = "$goma_dir/gomacc " | ||||
|     } else if (toolchain_cc_wrapper != "") { | ||||
|       compiler_prefix = toolchain_cc_wrapper + " " | ||||
|     } else { | ||||
|       compiler_prefix = "" | ||||
|     } | ||||
|  | ||||
|     cc = compiler_prefix + invoker.cc | ||||
|     cxx = compiler_prefix + invoker.cxx | ||||
|     ar = invoker.ar | ||||
|     ld = invoker.ld | ||||
|     if (defined(invoker.readelf)) { | ||||
|       readelf = invoker.readelf | ||||
|     } else { | ||||
|       readelf = "readelf" | ||||
|     } | ||||
|     if (defined(invoker.nm)) { | ||||
|       nm = invoker.nm | ||||
|     } else { | ||||
|       nm = "nm" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.shlib_extension)) { | ||||
|       default_shlib_extension = invoker.shlib_extension | ||||
|     } else { | ||||
|       default_shlib_extension = shlib_extension | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.executable_extension)) { | ||||
|       default_executable_extension = invoker.executable_extension | ||||
|     } else { | ||||
|       default_executable_extension = "" | ||||
|     } | ||||
|  | ||||
|     # Bring these into our scope for string interpolation with default values. | ||||
|     if (defined(invoker.libs_section_prefix)) { | ||||
|       libs_section_prefix = invoker.libs_section_prefix | ||||
|     } else { | ||||
|       libs_section_prefix = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.libs_section_postfix)) { | ||||
|       libs_section_postfix = invoker.libs_section_postfix | ||||
|     } else { | ||||
|       libs_section_postfix = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.solink_libs_section_prefix)) { | ||||
|       solink_libs_section_prefix = invoker.solink_libs_section_prefix | ||||
|     } else { | ||||
|       solink_libs_section_prefix = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.solink_libs_section_postfix)) { | ||||
|       solink_libs_section_postfix = invoker.solink_libs_section_postfix | ||||
|     } else { | ||||
|       solink_libs_section_postfix = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.extra_cflags) && invoker.extra_cflags != "") { | ||||
|       extra_cflags = " " + invoker.extra_cflags | ||||
|     } else { | ||||
|       extra_cflags = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != "") { | ||||
|       extra_cppflags = " " + invoker.extra_cppflags | ||||
|     } else { | ||||
|       extra_cppflags = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.extra_cxxflags) && invoker.extra_cxxflags != "") { | ||||
|       extra_cxxflags = " " + invoker.extra_cxxflags | ||||
|     } else { | ||||
|       extra_cxxflags = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") { | ||||
|       extra_ldflags = " " + invoker.extra_ldflags | ||||
|     } else { | ||||
|       extra_ldflags = "" | ||||
|     } | ||||
|  | ||||
|     # These library switches can apply to all tools below. | ||||
|     lib_switch = "-l" | ||||
|     lib_dir_switch = "-L" | ||||
|  | ||||
|     # Object files go in this directory. | ||||
|     object_subdir = "{{target_out_dir}}/{{label_name}}" | ||||
|  | ||||
|     tool("cc") { | ||||
|       depfile = "{{output}}.d" | ||||
|       command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}" | ||||
|       depsformat = "gcc" | ||||
|       description = "CC {{output}}" | ||||
|       outputs = [ | ||||
|         # The whitelist file is also an output, but ninja does not | ||||
|         # currently support multiple outputs for tool("cc"). | ||||
|         "$object_subdir/{{source_name_part}}.o", | ||||
|       ] | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         compile_wrapper = | ||||
|             rebase_path("//build/toolchain/gcc_compile_wrapper.py", | ||||
|                         root_build_dir) | ||||
|         command = "$python_path \"$compile_wrapper\" --resource-whitelist=\"{{output}}.whitelist\" $command" | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     tool("cxx") { | ||||
|       depfile = "{{output}}.d" | ||||
|       command = "$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}" | ||||
|       depsformat = "gcc" | ||||
|       description = "CXX {{output}}" | ||||
|       outputs = [ | ||||
|         # The whitelist file is also an output, but ninja does not | ||||
|         # currently support multiple outputs for tool("cxx"). | ||||
|         "$object_subdir/{{source_name_part}}.o", | ||||
|       ] | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         compile_wrapper = | ||||
|             rebase_path("//build/toolchain/gcc_compile_wrapper.py", | ||||
|                         root_build_dir) | ||||
|         command = "$python_path \"$compile_wrapper\" --resource-whitelist=\"{{output}}.whitelist\" $command" | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     tool("asm") { | ||||
|       # For GCC we can just use the C compiler to compile assembly. | ||||
|       depfile = "{{output}}.d" | ||||
|       command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" | ||||
|       depsformat = "gcc" | ||||
|       description = "ASM {{output}}" | ||||
|       outputs = [ | ||||
|         "$object_subdir/{{source_name_part}}.o", | ||||
|       ] | ||||
|     } | ||||
|  | ||||
|     tool("alink") { | ||||
|       rspfile = "{{output}}.rsp" | ||||
|       whitelist_flag = " " | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         whitelist_flag = " --resource-whitelist=\"{{output}}.whitelist\"" | ||||
|       } | ||||
|  | ||||
|       # This needs a Python script to avoid using simple sh features in this | ||||
|       # command, in case the host does not use a POSIX shell (e.g. compiling | ||||
|       # POSIX-like toolchains such as NaCl on Windows). | ||||
|       ar_wrapper = | ||||
|           rebase_path("//build/toolchain/gcc_ar_wrapper.py", root_build_dir) | ||||
|       command = "$python_path \"$ar_wrapper\"$whitelist_flag --output={{output}} --ar=\"$ar\" {{arflags}} rcsD @\"$rspfile\"" | ||||
|       description = "AR {{output}}" | ||||
|       rspfile_content = "{{inputs}}" | ||||
|       outputs = [ | ||||
|         "{{output_dir}}/{{target_output_name}}{{output_extension}}", | ||||
|       ] | ||||
|  | ||||
|       # Shared libraries go in the target out directory by default so we can | ||||
|       # generate different targets with the same name and not have them collide. | ||||
|       default_output_dir = "{{target_out_dir}}" | ||||
|       default_output_extension = ".a" | ||||
|       output_prefix = "lib" | ||||
|     } | ||||
|  | ||||
|     tool("solink") { | ||||
|       soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so". | ||||
|       sofile = "{{output_dir}}/$soname"  # Possibly including toolchain dir. | ||||
|       rspfile = sofile + ".rsp" | ||||
|       pool = "//build/toolchain:link_pool($default_toolchain)" | ||||
|       whitelist_flag = " " | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         whitelist_file = "$sofile.whitelist" | ||||
|         whitelist_flag = " --resource-whitelist=\"$whitelist_file\"" | ||||
|       } | ||||
|  | ||||
|       if (defined(invoker.strip)) { | ||||
|         unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname" | ||||
|       } else { | ||||
|         unstripped_sofile = sofile | ||||
|       } | ||||
|  | ||||
|       # These variables are not built into GN but are helpers that | ||||
|       # implement (1) linking to produce a .so, (2) extracting the symbols | ||||
|       # from that file (3) if the extracted list differs from the existing | ||||
|       # .TOC file, overwrite it, otherwise, don't change it. | ||||
|       tocfile = sofile + ".TOC" | ||||
|  | ||||
|       link_command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | ||||
|  | ||||
|       assert(defined(readelf), "to solink you must have a readelf") | ||||
|       assert(defined(nm), "to solink you must have an nm") | ||||
|       strip_switch = "" | ||||
|       if (defined(invoker.strip)) { | ||||
|         strip_switch = "--strip=${invoker.strip}" | ||||
|       } | ||||
|  | ||||
|       # This needs a Python script to avoid using a complex shell command | ||||
|       # requiring sh control structures, pipelines, and POSIX utilities. | ||||
|       # The host might not have a POSIX shell and utilities (e.g. Windows). | ||||
|       solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py") | ||||
|       command = "$python_path \"$solink_wrapper\" --readelf=\"$readelf\" --nm=\"$nm\" $strip_switch --sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\" --output=\"$sofile\"$whitelist_flag -- $link_command" | ||||
|  | ||||
|       rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" | ||||
|  | ||||
|       description = "SOLINK $sofile" | ||||
|  | ||||
|       # Use this for {{output_extension}} expansions unless a target manually | ||||
|       # overrides it (in which case {{output_extension}} will be what the target | ||||
|       # specifies). | ||||
|       default_output_extension = default_shlib_extension | ||||
|  | ||||
|       default_output_dir = "{{root_out_dir}}" | ||||
|       if (shlib_subdir != ".") { | ||||
|         default_output_dir += "/$shlib_subdir" | ||||
|       } | ||||
|  | ||||
|       output_prefix = "lib" | ||||
|  | ||||
|       # Since the above commands only updates the .TOC file when it changes, ask | ||||
|       # Ninja to check if the timestamp actually changed to know if downstream | ||||
|       # dependencies should be recompiled. | ||||
|       restat = true | ||||
|  | ||||
|       # Tell GN about the output files. It will link to the sofile but use the | ||||
|       # tocfile for dependency management. | ||||
|       outputs = [ | ||||
|         sofile, | ||||
|         tocfile, | ||||
|       ] | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         outputs += [ whitelist_file ] | ||||
|       } | ||||
|       if (sofile != unstripped_sofile) { | ||||
|         outputs += [ unstripped_sofile ] | ||||
|       } | ||||
|       link_output = sofile | ||||
|       depend_output = tocfile | ||||
|     } | ||||
|  | ||||
|     tool("solink_module") { | ||||
|       soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so". | ||||
|       sofile = "{{output_dir}}/$soname" | ||||
|       rspfile = sofile + ".rsp" | ||||
|       pool = "//build/toolchain:link_pool($default_toolchain)" | ||||
|  | ||||
|       if (defined(invoker.strip)) { | ||||
|         unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname" | ||||
|       } else { | ||||
|         unstripped_sofile = sofile | ||||
|       } | ||||
|  | ||||
|       command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | ||||
|  | ||||
|       if (defined(invoker.strip)) { | ||||
|         strip_command = "${invoker.strip} --strip-unneeded -o \"$sofile\" \"$unstripped_sofile\"" | ||||
|         command += " && " + strip_command | ||||
|       } | ||||
|       rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" | ||||
|  | ||||
|       description = "SOLINK_MODULE $sofile" | ||||
|  | ||||
|       # Use this for {{output_extension}} expansions unless a target manually | ||||
|       # overrides it (in which case {{output_extension}} will be what the target | ||||
|       # specifies). | ||||
|       if (defined(invoker.loadable_module_extension)) { | ||||
|         default_output_extension = invoker.loadable_module_extension | ||||
|       } else { | ||||
|         default_output_extension = default_shlib_extension | ||||
|       } | ||||
|  | ||||
|       default_output_dir = "{{root_out_dir}}" | ||||
|       if (shlib_subdir != ".") { | ||||
|         default_output_dir += "/$shlib_subdir" | ||||
|       } | ||||
|  | ||||
|       output_prefix = "lib" | ||||
|  | ||||
|       outputs = [ | ||||
|         sofile, | ||||
|       ] | ||||
|       if (sofile != unstripped_sofile) { | ||||
|         outputs += [ unstripped_sofile ] | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     tool("link") { | ||||
|       exename = "{{target_output_name}}{{output_extension}}" | ||||
|       outfile = "{{output_dir}}/$exename" | ||||
|       rspfile = "$outfile.rsp" | ||||
|       unstripped_outfile = outfile | ||||
|       pool = "//build/toolchain:link_pool($default_toolchain)" | ||||
|  | ||||
|       # Use this for {{output_extension}} expansions unless a target manually | ||||
|       # overrides it (in which case {{output_extension}} will be what the target | ||||
|       # specifies). | ||||
|       default_output_extension = default_executable_extension | ||||
|  | ||||
|       default_output_dir = "{{root_out_dir}}" | ||||
|  | ||||
|       if (defined(invoker.strip)) { | ||||
|         unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename" | ||||
|       } | ||||
|  | ||||
|       command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" -Wl,--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix" | ||||
|       if (defined(invoker.strip)) { | ||||
|         link_wrapper = | ||||
|             rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir) | ||||
|         command = "$python_path \"$link_wrapper\" --strip=\"${invoker.strip}\" --unstripped-file=\"$unstripped_outfile\" --output=\"$outfile\" -- $command" | ||||
|       } | ||||
|       description = "LINK $outfile" | ||||
|       rspfile_content = "{{inputs}}" | ||||
|       outputs = [ | ||||
|         outfile, | ||||
|       ] | ||||
|       if (outfile != unstripped_outfile) { | ||||
|         outputs += [ unstripped_outfile ] | ||||
|       } | ||||
|       if (defined(invoker.link_outputs)) { | ||||
|         outputs += invoker.link_outputs | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     # These two are really entirely generic, but have to be repeated in | ||||
|     # each toolchain because GN doesn't allow a template to be used here. | ||||
|     # See //build/toolchain/toolchain.gni for details. | ||||
|     tool("stamp") { | ||||
|       command = stamp_command | ||||
|       description = stamp_description | ||||
|     } | ||||
|     tool("copy") { | ||||
|       command = copy_command | ||||
|       description = copy_description | ||||
|     } | ||||
|  | ||||
|     forward_variables_from(invoker, [ "deps" ]) | ||||
|   } | ||||
| } | ||||
|  | ||||
| # This is a shorthand for gcc_toolchain instances based on the Chromium-built | ||||
| # version of Clang. Only the toolchain_cpu and toolchain_os variables need to | ||||
| # be specified by the invoker, and optionally toolprefix if it's a | ||||
| # cross-compile case. Note that for a cross-compile case this toolchain | ||||
| # requires a config to pass the appropriate -target option, or else it will | ||||
| # actually just be doing a native compile. The invoker can optionally override | ||||
| # use_gold too. | ||||
| template("clang_toolchain") { | ||||
|   if (defined(invoker.toolprefix)) { | ||||
|     toolprefix = invoker.toolprefix | ||||
|   } else { | ||||
|     toolprefix = "" | ||||
|   } | ||||
|  | ||||
|   gcc_toolchain(target_name) { | ||||
|     prefix = rebase_path("$clang_base_path/bin", root_build_dir) | ||||
|     cc = "$prefix/clang" | ||||
|     cxx = "$prefix/clang++" | ||||
|     ld = cxx | ||||
|  | ||||
|     readelf = "${toolprefix}readelf" | ||||
|     ar = "${toolprefix}ar" | ||||
|     nm = "${toolprefix}nm" | ||||
|  | ||||
|     forward_variables_from(invoker, [ "strip" ]) | ||||
|  | ||||
|     toolchain_args = { | ||||
|       if (defined(invoker.toolchain_args)) { | ||||
|         forward_variables_from(invoker.toolchain_args, "*") | ||||
|       } | ||||
|       is_clang = true | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										235
									
								
								samples/GN/icu.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								samples/GN/icu.gn
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| # Copyright 2016 The Chromium Authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("//build/config/linux/pkg_config.gni") | ||||
| import("//build/shim_headers.gni") | ||||
|  | ||||
| group("icu") { | ||||
|   public_deps = [ | ||||
|     ":icui18n", | ||||
|     ":icuuc", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| config("icu_config") { | ||||
|   defines = [ | ||||
|     "USING_SYSTEM_ICU=1", | ||||
|     "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| pkg_config("system_icui18n") { | ||||
|   packages = [ "icu-i18n" ] | ||||
| } | ||||
|  | ||||
| pkg_config("system_icuuc") { | ||||
|   packages = [ "icu-uc" ] | ||||
| } | ||||
|  | ||||
| source_set("icui18n") { | ||||
|   deps = [ | ||||
|     ":icui18n_shim", | ||||
|   ] | ||||
|   public_configs = [ | ||||
|     ":icu_config", | ||||
|     ":system_icui18n", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| source_set("icuuc") { | ||||
|   deps = [ | ||||
|     ":icuuc_shim", | ||||
|   ] | ||||
|   public_configs = [ | ||||
|     ":icu_config", | ||||
|     ":system_icuuc", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| shim_headers("icui18n_shim") { | ||||
|   root_path = "source/i18n" | ||||
|   headers = [ | ||||
|     # This list can easily be updated using the command below: | ||||
|     # find third_party/icu/source/i18n/unicode \ | ||||
|     # -iname '*.h' -printf '"%p",\n' | \ | ||||
|     # sed -e 's|third_party/icu/i18n/common/||' | sort -u | ||||
|     "unicode/alphaindex.h", | ||||
|     "unicode/basictz.h", | ||||
|     "unicode/calendar.h", | ||||
|     "unicode/choicfmt.h", | ||||
|     "unicode/coleitr.h", | ||||
|     "unicode/coll.h", | ||||
|     "unicode/compactdecimalformat.h", | ||||
|     "unicode/curramt.h", | ||||
|     "unicode/currpinf.h", | ||||
|     "unicode/currunit.h", | ||||
|     "unicode/datefmt.h", | ||||
|     "unicode/dcfmtsym.h", | ||||
|     "unicode/decimfmt.h", | ||||
|     "unicode/dtfmtsym.h", | ||||
|     "unicode/dtitvfmt.h", | ||||
|     "unicode/dtitvinf.h", | ||||
|     "unicode/dtptngen.h", | ||||
|     "unicode/dtrule.h", | ||||
|     "unicode/fieldpos.h", | ||||
|     "unicode/fmtable.h", | ||||
|     "unicode/format.h", | ||||
|     "unicode/fpositer.h", | ||||
|     "unicode/gender.h", | ||||
|     "unicode/gregocal.h", | ||||
|     "unicode/locdspnm.h", | ||||
|     "unicode/measfmt.h", | ||||
|     "unicode/measunit.h", | ||||
|     "unicode/measure.h", | ||||
|     "unicode/msgfmt.h", | ||||
|     "unicode/numfmt.h", | ||||
|     "unicode/numsys.h", | ||||
|     "unicode/plurfmt.h", | ||||
|     "unicode/plurrule.h", | ||||
|     "unicode/rbnf.h", | ||||
|     "unicode/rbtz.h", | ||||
|     "unicode/regex.h", | ||||
|     "unicode/region.h", | ||||
|     "unicode/reldatefmt.h", | ||||
|     "unicode/scientificnumberformatter.h", | ||||
|     "unicode/search.h", | ||||
|     "unicode/selfmt.h", | ||||
|     "unicode/simpletz.h", | ||||
|     "unicode/smpdtfmt.h", | ||||
|     "unicode/sortkey.h", | ||||
|     "unicode/stsearch.h", | ||||
|     "unicode/tblcoll.h", | ||||
|     "unicode/timezone.h", | ||||
|     "unicode/tmunit.h", | ||||
|     "unicode/tmutamt.h", | ||||
|     "unicode/tmutfmt.h", | ||||
|     "unicode/translit.h", | ||||
|     "unicode/tzfmt.h", | ||||
|     "unicode/tznames.h", | ||||
|     "unicode/tzrule.h", | ||||
|     "unicode/tztrans.h", | ||||
|     "unicode/ucal.h", | ||||
|     "unicode/ucol.h", | ||||
|     "unicode/ucoleitr.h", | ||||
|     "unicode/ucsdet.h", | ||||
|     "unicode/ucurr.h", | ||||
|     "unicode/udat.h", | ||||
|     "unicode/udateintervalformat.h", | ||||
|     "unicode/udatpg.h", | ||||
|     "unicode/udisplaycontext.h", | ||||
|     "unicode/ufieldpositer.h", | ||||
|     "unicode/uformattable.h", | ||||
|     "unicode/ugender.h", | ||||
|     "unicode/uldnames.h", | ||||
|     "unicode/ulocdata.h", | ||||
|     "unicode/umsg.h", | ||||
|     "unicode/unirepl.h", | ||||
|     "unicode/unum.h", | ||||
|     "unicode/unumsys.h", | ||||
|     "unicode/upluralrules.h", | ||||
|     "unicode/uregex.h", | ||||
|     "unicode/uregion.h", | ||||
|     "unicode/usearch.h", | ||||
|     "unicode/uspoof.h", | ||||
|     "unicode/utmscale.h", | ||||
|     "unicode/utrans.h", | ||||
|     "unicode/vtzone.h", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| shim_headers("icuuc_shim") { | ||||
|   root_path = "source/common" | ||||
|   headers = [ | ||||
|     # This list can easily be updated using the command below: | ||||
|     # find third_party/icu/source/common/unicode \ | ||||
|     # -iname '*.h' -printf '"%p",\n' | \ | ||||
|     # sed -e 's|third_party/icu/source/common/||' | sort -u | ||||
|     "unicode/appendable.h", | ||||
|     "unicode/brkiter.h", | ||||
|     "unicode/bytestream.h", | ||||
|     "unicode/bytestrie.h", | ||||
|     "unicode/bytestriebuilder.h", | ||||
|     "unicode/caniter.h", | ||||
|     "unicode/chariter.h", | ||||
|     "unicode/dbbi.h", | ||||
|     "unicode/docmain.h", | ||||
|     "unicode/dtintrv.h", | ||||
|     "unicode/enumset.h", | ||||
|     "unicode/errorcode.h", | ||||
|     "unicode/filteredbrk.h", | ||||
|     "unicode/icudataver.h", | ||||
|     "unicode/icuplug.h", | ||||
|     "unicode/idna.h", | ||||
|     "unicode/listformatter.h", | ||||
|     "unicode/localpointer.h", | ||||
|     "unicode/locid.h", | ||||
|     "unicode/messagepattern.h", | ||||
|     "unicode/normalizer2.h", | ||||
|     "unicode/normlzr.h", | ||||
|     "unicode/parseerr.h", | ||||
|     "unicode/parsepos.h", | ||||
|     "unicode/platform.h", | ||||
|     "unicode/ptypes.h", | ||||
|     "unicode/putil.h", | ||||
|     "unicode/rbbi.h", | ||||
|     "unicode/rep.h", | ||||
|     "unicode/resbund.h", | ||||
|     "unicode/schriter.h", | ||||
|     "unicode/std_string.h", | ||||
|     "unicode/strenum.h", | ||||
|     "unicode/stringpiece.h", | ||||
|     "unicode/stringtriebuilder.h", | ||||
|     "unicode/symtable.h", | ||||
|     "unicode/ubidi.h", | ||||
|     "unicode/ubrk.h", | ||||
|     "unicode/ucasemap.h", | ||||
|     "unicode/ucat.h", | ||||
|     "unicode/uchar.h", | ||||
|     "unicode/ucharstrie.h", | ||||
|     "unicode/ucharstriebuilder.h", | ||||
|     "unicode/uchriter.h", | ||||
|     "unicode/uclean.h", | ||||
|     "unicode/ucnv.h", | ||||
|     "unicode/ucnv_cb.h", | ||||
|     "unicode/ucnv_err.h", | ||||
|     "unicode/ucnvsel.h", | ||||
|     "unicode/uconfig.h", | ||||
|     "unicode/udata.h", | ||||
|     "unicode/uenum.h", | ||||
|     "unicode/uidna.h", | ||||
|     "unicode/uiter.h", | ||||
|     "unicode/ulistformatter.h", | ||||
|     "unicode/uloc.h", | ||||
|     "unicode/umachine.h", | ||||
|     "unicode/umisc.h", | ||||
|     "unicode/unifilt.h", | ||||
|     "unicode/unifunct.h", | ||||
|     "unicode/unimatch.h", | ||||
|     "unicode/uniset.h", | ||||
|     "unicode/unistr.h", | ||||
|     "unicode/unorm.h", | ||||
|     "unicode/unorm2.h", | ||||
|     "unicode/uobject.h", | ||||
|     "unicode/urename.h", | ||||
|     "unicode/urep.h", | ||||
|     "unicode/ures.h", | ||||
|     "unicode/uscript.h", | ||||
|     "unicode/uset.h", | ||||
|     "unicode/usetiter.h", | ||||
|     "unicode/ushape.h", | ||||
|     "unicode/usprep.h", | ||||
|     "unicode/ustring.h", | ||||
|     "unicode/ustringtrie.h", | ||||
|     "unicode/utext.h", | ||||
|     "unicode/utf.h", | ||||
|     "unicode/utf16.h", | ||||
|     "unicode/utf32.h", | ||||
|     "unicode/utf8.h", | ||||
|     "unicode/utf_old.h", | ||||
|     "unicode/utrace.h", | ||||
|     "unicode/utypes.h", | ||||
|     "unicode/uvernum.h", | ||||
|     "unicode/uversion.h", | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										2788
									
								
								samples/GN/internal_rules.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2788
									
								
								samples/GN/internal_rules.gni
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1422
									
								
								samples/GN/ios-rules.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1422
									
								
								samples/GN/ios-rules.gni
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										193
									
								
								samples/GN/isolate.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								samples/GN/isolate.gni
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | ||||
| # Copyright 2016 the V8 project authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("//build/config/sanitizers/sanitizers.gni") | ||||
| import("//third_party/icu/config.gni") | ||||
| import("v8.gni") | ||||
|  | ||||
| declare_args() { | ||||
|   # Sets the test isolation mode (noop|prepare|check). | ||||
|   v8_test_isolation_mode = "noop" | ||||
| } | ||||
|  | ||||
| template("v8_isolate_run") { | ||||
|   forward_variables_from(invoker, | ||||
|                          "*", | ||||
|                          [ | ||||
|                            "deps", | ||||
|                            "isolate", | ||||
|                          ]) | ||||
|  | ||||
|   # Remember target name as within the action scope the target name will be | ||||
|   # different. | ||||
|   name = target_name | ||||
|  | ||||
|   assert(defined(invoker.deps)) | ||||
|   assert(defined(invoker.isolate)) | ||||
|  | ||||
|   if (name != "" && v8_test_isolation_mode != "noop") { | ||||
|     action(name + "_run") { | ||||
|       testonly = true | ||||
|  | ||||
|       deps = invoker.deps | ||||
|  | ||||
|       script = "//tools/isolate_driver.py" | ||||
|  | ||||
|       sources = [ | ||||
|         invoker.isolate, | ||||
|       ] | ||||
|  | ||||
|       inputs = [ | ||||
|         # Files that are known to be involved in this step. | ||||
|         "//tools/swarming_client/isolate.py", | ||||
|         "//tools/swarming_client/run_isolated.py", | ||||
|       ] | ||||
|  | ||||
|       if (v8_test_isolation_mode == "prepare") { | ||||
|         outputs = [ | ||||
|           "$root_out_dir/$name.isolated.gen.json", | ||||
|         ] | ||||
|       } else if (v8_test_isolation_mode == "check") { | ||||
|         outputs = [ | ||||
|           "$root_out_dir/$name.isolated", | ||||
|           "$root_out_dir/$name.isolated.state", | ||||
|         ] | ||||
|       } | ||||
|  | ||||
|       # Translate gn to gyp variables. | ||||
|       if (is_asan) { | ||||
|         asan = "1" | ||||
|       } else { | ||||
|         asan = "0" | ||||
|       } | ||||
|       if (is_msan) { | ||||
|         msan = "1" | ||||
|       } else { | ||||
|         msan = "0" | ||||
|       } | ||||
|       if (is_tsan) { | ||||
|         tsan = "1" | ||||
|       } else { | ||||
|         tsan = "0" | ||||
|       } | ||||
|       if (is_cfi) { | ||||
|         cfi_vptr = "1" | ||||
|       } else { | ||||
|         cfi_vptr = "0" | ||||
|       } | ||||
|       if (target_cpu == "x86") { | ||||
|         target_arch = "ia32" | ||||
|       } else { | ||||
|         target_arch = target_cpu | ||||
|       } | ||||
|       if (is_debug) { | ||||
|         configuration_name = "Debug" | ||||
|       } else { | ||||
|         configuration_name = "Release" | ||||
|       } | ||||
|       if (is_component_build) { | ||||
|         component = "shared_library" | ||||
|       } else { | ||||
|         component = "static_library" | ||||
|       } | ||||
|       if (icu_use_data_file) { | ||||
|         icu_use_data_file_flag = "1" | ||||
|       } else { | ||||
|         icu_use_data_file_flag = "0" | ||||
|       } | ||||
|       if (v8_enable_inspector) { | ||||
|         enable_inspector = "1" | ||||
|       } else { | ||||
|         enable_inspector = "0" | ||||
|       } | ||||
|       if (v8_use_external_startup_data) { | ||||
|         use_external_startup_data = "1" | ||||
|       } else { | ||||
|         use_external_startup_data = "0" | ||||
|       } | ||||
|       if (v8_use_snapshot) { | ||||
|         use_snapshot = "true" | ||||
|       } else { | ||||
|         use_snapshot = "false" | ||||
|       } | ||||
|       if (v8_has_valgrind) { | ||||
|         has_valgrind = "1" | ||||
|       } else { | ||||
|         has_valgrind = "0" | ||||
|       } | ||||
|       if (v8_gcmole) { | ||||
|         gcmole = "1" | ||||
|       } else { | ||||
|         gcmole = "0" | ||||
|       } | ||||
|  | ||||
|       # Note, all paths will be rebased in isolate_driver.py to be relative to | ||||
|       # the isolate file. | ||||
|       args = [ | ||||
|         v8_test_isolation_mode, | ||||
|         "--isolated", | ||||
|         rebase_path("$root_out_dir/$name.isolated", root_build_dir), | ||||
|         "--isolate", | ||||
|         rebase_path(invoker.isolate, root_build_dir), | ||||
|  | ||||
|         # Path variables are used to replace file paths when loading a .isolate | ||||
|         # file | ||||
|         "--path-variable", | ||||
|         "DEPTH", | ||||
|         rebase_path("//", root_build_dir), | ||||
|         "--path-variable", | ||||
|         "PRODUCT_DIR", | ||||
|         rebase_path(root_out_dir, root_build_dir), | ||||
|  | ||||
|         # TODO(machenbach): Set variables for remaining features. | ||||
|         "--config-variable", | ||||
|         "CONFIGURATION_NAME=$configuration_name", | ||||
|         "--config-variable", | ||||
|         "OS=$target_os", | ||||
|         "--config-variable", | ||||
|         "asan=$asan", | ||||
|         "--config-variable", | ||||
|         "cfi_vptr=$cfi_vptr", | ||||
|         "--config-variable", | ||||
|         "gcmole=$gcmole", | ||||
|         "--config-variable", | ||||
|         "has_valgrind=$has_valgrind", | ||||
|         "--config-variable", | ||||
|         "icu_use_data_file_flag=$icu_use_data_file_flag", | ||||
|         "--config-variable", | ||||
|         "is_gn=1", | ||||
|         "--config-variable", | ||||
|         "msan=$msan", | ||||
|         "--config-variable", | ||||
|         "tsan=$tsan", | ||||
|         "--config-variable", | ||||
|         "coverage=0", | ||||
|         "--config-variable", | ||||
|         "sanitizer_coverage=0", | ||||
|         "--config-variable", | ||||
|         "component=$component", | ||||
|         "--config-variable", | ||||
|         "target_arch=$target_arch", | ||||
|         "--config-variable", | ||||
|         "v8_enable_inspector=$enable_inspector", | ||||
|         "--config-variable", | ||||
|         "v8_use_external_startup_data=$use_external_startup_data", | ||||
|         "--config-variable", | ||||
|         "v8_use_snapshot=$use_snapshot", | ||||
|       ] | ||||
|  | ||||
|       if (is_win) { | ||||
|         args += [ | ||||
|           "--config-variable", | ||||
|           "msvs_version=2015", | ||||
|         ] | ||||
|       } else { | ||||
|         args += [ | ||||
|           "--config-variable", | ||||
|           "msvs_version=0", | ||||
|         ] | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										48
									
								
								samples/HTML+Django/nunjucks.njk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								samples/HTML+Django/nunjucks.njk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| {% from "forms.html" import label as description %} | ||||
|  | ||||
|  | ||||
| {% macro field(name, value='', type='text') %} | ||||
|     <div class="field"> | ||||
|         <input type="{{ type }}" name="{{ name }}" | ||||
|                 value="{{ value | escape }}" /> | ||||
|     </div> | ||||
| {% endmacro %} | ||||
|  | ||||
| <html> | ||||
| <head> | ||||
|     {% extends "head.html" %} | ||||
| </head> | ||||
| <body> | ||||
| {% if horse %} | ||||
|     Chuck Norris once kicked a horse in the chin. Its descendants are known today as Giraffes. | ||||
| {% elif optimus %} | ||||
|     Chuck Norris once urinated in a semi truck's gas tank as a joke....that truck is now known as Optimus Prime. | ||||
| {% else %} | ||||
|     Chuck Norris threw a grenade and killed 50 people, then the grenade exploded. | ||||
| {% endif %} | ||||
|  | ||||
| {% block left %} | ||||
|     This is the left side! | ||||
| {% endblock %} | ||||
|  | ||||
| {% block right %} | ||||
|     This is the right side! | ||||
| {% endblock %} | ||||
|  | ||||
| {{ description('Username') }} | ||||
| {{ field('user') }} | ||||
| {{ field('pass', type='password') }} | ||||
|  | ||||
| <h1>Posts</h1> | ||||
| <ul> | ||||
|     {% for item in items %} | ||||
|         <li>{{ item.title }}</li> | ||||
|     {% else %} | ||||
|         <li>This would display if the 'item' collection were empty</li> | ||||
|     {% endfor %} | ||||
| </ul> | ||||
|  | ||||
| {# Don't escape foo #} | ||||
| {{ foo | safe }} | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										6
									
								
								samples/JSON5/filenames/.babelrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/JSON5/filenames/.babelrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "presets": [ | ||||
|     "es2015", | ||||
|     "es2016" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										60
									
								
								samples/Julia/julia
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								samples/Julia/julia
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| #!/usr/bin/env julia | ||||
|  | ||||
| # From https://github.com/JoshCheek/language-sampler-for-fullpath/blob/b766dcdbd249ec63516f491390a75315e78cba95/julia/fullpath | ||||
| help_screen = """ | ||||
| usage: fullpath *[relative-paths] [-c] | ||||
|  | ||||
|   Prints the fullpath of the paths | ||||
|   If no paths are given as args, it will read them from stdin | ||||
|  | ||||
|   If there is only one path, the trailing newline is omitted | ||||
|  | ||||
|   The -c flag will copy the results into your pasteboard | ||||
| """ | ||||
|  | ||||
| help  = false | ||||
| copy  = false | ||||
| dir   = pwd() | ||||
| paths = [] | ||||
|  | ||||
| for arg = ARGS | ||||
|   if arg == "-h" || arg == "--help" | ||||
|     help = true | ||||
|   elseif arg == "-c" || arg == "--copy" | ||||
|     copy = true | ||||
|   elseif arg != "" | ||||
|     push!(paths, arg) | ||||
|   end | ||||
| end | ||||
|  | ||||
| if help | ||||
|   print(help_screen) | ||||
|   exit() | ||||
| end | ||||
|  | ||||
| function notempty(string) | ||||
|   return !isempty(string) | ||||
| end | ||||
|  | ||||
| if length(paths) == 0 | ||||
|   paths = filter(notempty, map(chomp, readlines())) | ||||
| end | ||||
|  | ||||
| function print_paths(stream, paths) | ||||
|   if length(paths) == 1 | ||||
|     path = paths[1] | ||||
|     print(stream, "$dir/$path") | ||||
|   else | ||||
|     for path = paths | ||||
|       println(stream, "$dir/$path") | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
| if copy | ||||
|   read, write, process = readandwrite(`pbcopy`) | ||||
|   print_paths(write, paths) | ||||
|   close(write) | ||||
| end | ||||
|  | ||||
| print_paths(STDOUT, paths) | ||||
							
								
								
									
										47
									
								
								samples/MQL4/header-sample.mqh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								samples/MQL4/header-sample.mqh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                                header-sample.mqh | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| 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.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property strict | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                                                  | | ||||
| //+------------------------------------------------------------------+ | ||||
| class CSomeObject | ||||
|   { | ||||
| protected: | ||||
|    int               m_someproperty; | ||||
| private: | ||||
|    bool              SomeFunction() {return true;} | ||||
| public: | ||||
|                      CSomeObject(void): m_someproperty(0) {} | ||||
|                     ~CSomeObject(void)                    {} | ||||
|    void              SetName(int n){m_someproperty=n;}// sets somepropery | ||||
|    int               GetName(){return(m_someproperty);} // returns someproperty | ||||
|   }; | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										61
									
								
								samples/MQL4/indicator-sample.mq4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								samples/MQL4/indicator-sample.mq4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                             indicator-sample.mq4 | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| 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.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property version   "1.00" | ||||
| #property strict | ||||
|  | ||||
| #property indicator_chart_window | ||||
| #property indicator_plots 0 | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Custom indicator initialization function                         | | ||||
| //+------------------------------------------------------------------+ | ||||
| void OnInit(void) | ||||
|   { | ||||
|  //--- | ||||
|    } | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Bears Power                                                      | | ||||
| //+------------------------------------------------------------------+ | ||||
| int OnCalculate(const int rates_total, | ||||
|                 const int prev_calculated, | ||||
|                 const datetime &time[], | ||||
|                 const double &open[], | ||||
|                 const double &high[], | ||||
|                 const double &low[], | ||||
|                 const double &close[], | ||||
|                 const long &tick_volume[], | ||||
|                 const long &volume[], | ||||
|                 const int &spread[]) | ||||
|   { | ||||
|   Print("The number of bars on the current chart: ",iBars(Symbol(),Period())); | ||||
| //--- | ||||
|    return(rates_total); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										51
									
								
								samples/MQL4/script-sample.mq4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								samples/MQL4/script-sample.mq4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                                script-sample.mq4 | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| 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.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property version   "1.00" | ||||
| #property strict | ||||
| #property script_show_inputs | ||||
|  | ||||
| input int StopLoss=100; //Stop Loss | ||||
| input int TakeProfit=100; //Take Profit | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Script program start function                                    | | ||||
| //+------------------------------------------------------------------+ | ||||
| void OnStart() | ||||
|   { | ||||
|    double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); | ||||
|    Print("Minimum Stop Level=",minstoplevel," points"); | ||||
| //--- | ||||
|    double sl=NormalizeDouble(Bid-StopLoss*Point,Digits); | ||||
|    double tp=NormalizeDouble(Ask+TakeProfit*Point,Digits); | ||||
| //--- | ||||
|    int result=OrderSend(Symbol(),OP_BUY,0.01,Ask,1,sl,tp,"Test",0,0,clrNONE); | ||||
|    Print("Success? ",result); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										1390
									
								
								samples/MQL5/Regex.mqh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1390
									
								
								samples/MQL5/Regex.mqh
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										64
									
								
								samples/MQL5/indicator-sample.mq5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								samples/MQL5/indicator-sample.mq5
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                             indicator-sample.mq5 | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| 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.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property version   "1.00" | ||||
|  | ||||
| #property indicator_chart_window | ||||
| #property indicator_plots   0 | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Custom indicator initialization function                         | | ||||
| //+------------------------------------------------------------------+ | ||||
| int OnInit() | ||||
|   { | ||||
| //--- | ||||
|    return(INIT_SUCCEEDED); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Custom indicator iteration function                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| int OnCalculate(const int rates_total, | ||||
|                 const int prev_calculated, | ||||
|                 const datetime &time[], | ||||
|                 const double &open[], | ||||
|                 const double &high[], | ||||
|                 const double &low[], | ||||
|                 const double &close[], | ||||
|                 const long &tick_volume[], | ||||
|                 const long &volume[], | ||||
|                 const int &spread[]) | ||||
|   { | ||||
| //--- | ||||
|    int bars=Bars(Symbol(),0); | ||||
|    Print("Bars = ",bars,", rates_total = ",rates_total,",  prev_calculated = ",prev_calculated); | ||||
|    Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]); | ||||
| //--- return value of prev_calculated for next call | ||||
|    return(rates_total); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										56
									
								
								samples/MQL5/script-sample.mq5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								samples/MQL5/script-sample.mq5
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                                script-sample.mq5 | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| 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.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property version   "1.00" | ||||
| #property script_show_inputs | ||||
|  | ||||
| #include <Trade\Trade.mqh> | ||||
|  | ||||
| input int StopLoss=100; // Stop Loss | ||||
| input int TakeProfit=100; // Take Profit | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Script program start function                                    | | ||||
| //+------------------------------------------------------------------+ | ||||
| void OnStart() | ||||
|   { | ||||
|    CTrade trade; | ||||
| //--- | ||||
|    long stoplevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL); | ||||
|    Print("Minimum stop level is: ",stoplevel); | ||||
|    double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK); | ||||
|    double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID); | ||||
|    double sl = NormalizeDouble(bid - StopLoss*Point(),Digits()); | ||||
|    double tp = NormalizeDouble(ask + TakeProfit*Point(),Digits()); | ||||
| //--- | ||||
|    bool result=trade.Buy(0.01,Symbol(),ask,sl,tp,"test"); | ||||
| //--- | ||||
|    Print("Success? ",result); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										134
									
								
								samples/Makefile/file-icons.make
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								samples/Makefile/file-icons.make
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,134 @@ | ||||
| charmap     := charmap.md | ||||
| font-name   := file-icons | ||||
| font-folder := dist | ||||
| font-config := icomoon.json | ||||
| icon-size   := 34 | ||||
| icon-folder := svg | ||||
| repo-name   := Alhadis/FileIcons | ||||
| svg         := $(wildcard $(icon-folder)/*.svg) | ||||
| last-commit  = $(shell git log -1 --oneline --no-abbrev | cut -d' ' -f1) | ||||
|  | ||||
|  | ||||
| all: unpack $(font-folder)/$(font-name).woff2 charmap | ||||
|  | ||||
|  | ||||
| # Aliases | ||||
| unpack:  $(font-folder)/$(font-name).ttf | ||||
| charmap: $(charmap) | ||||
|  | ||||
|  | ||||
| # Extract a downloaded IcoMoon folder | ||||
| $(font-folder)/%.ttf: %.zip | ||||
| 	@rm -rf $(font-folder) tmp $(font-config) | ||||
| 	@unzip -qd tmp $^ | ||||
| 	@mv tmp/fonts $(font-folder) | ||||
| 	@mv tmp/selection.json $(font-config) | ||||
| 	@rm -rf tmp $^ | ||||
| 	@perl -pi -e 's|^( {2})+|"\t" x (length($$&)/2)|ge' $(font-config) | ||||
| 	@echo "" >> $(font-config) # Ensure trailing newline | ||||
| 	@echo "Files extracted." | ||||
|  | ||||
|  | ||||
| # Generate a WOFF2 file from a TTF | ||||
| %.woff2: %.ttf | ||||
| 	@[ ! -f $@ ] && { \ | ||||
| 		hash woff2_compress 2>/dev/null || { \ | ||||
| 			echo >&2 "WOFF2 conversion tools not found. Consult the readme file."; \ | ||||
| 			exit 2; \ | ||||
| 		}; \ | ||||
| 		woff2_compress $^ >/dev/null; \ | ||||
| 		echo "WOFF2 file generated."; \ | ||||
| 	}; | ||||
| 	 | ||||
|  | ||||
|  | ||||
| # Clean up SVG source | ||||
| lint: $(svg) | ||||
| 	@perl -0777 -pi -e '\ | ||||
| 		s/\r\n/\n/g; \ | ||||
| 		s/<g id="icomoon-ignore">\s*<\/g>//gmi; \ | ||||
| 		s/<g\s*>\s*<\/g>//gmi; \ | ||||
| 		s/\s+(id|viewBox|xml:space)="[^"]*"/ /gmi; \ | ||||
| 		s/<!DOCTYPE[^>]*>//gi; \ | ||||
| 		s/<\?xml.*?\?>//gi; \ | ||||
| 		s/<!--.*?-->//gm; \ | ||||
| 		s/ style="enable-background:.*?;"//gmi; \ | ||||
| 		s/"\s+>/">/g; \ | ||||
| 		s/\x20{2,}/ /g; \ | ||||
| 		s/[\t\n]+//gm;' $^ | ||||
|  | ||||
|  | ||||
|  | ||||
| # Generate/update character map | ||||
| $(charmap): | ||||
| 	@./create-map.pl -r=$(repo-name) -i=$(icon-folder) --size=$(icon-size) $(font-folder)/$(font-name).svg $@ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # POSIX systems only: reattach hard links to File-Icons package | ||||
| relink: | ||||
| 	@$(call need-var,ATOM_FILE_ICONS,ERROR_NO_PKG) | ||||
| 	@ln -f $(font-folder)/$(font-name).woff2 $(wildcard $(ATOM_FILE_ICONS)/fonts/file-icons-*.woff2) | ||||
|  | ||||
|  | ||||
|  | ||||
| # Force an icon's preview to be refreshed on GitHub | ||||
| cachebust: | ||||
| 	@$(call need-var,icon,ERROR_NO_ICON) | ||||
| 	@base="https://cdn.rawgit.com/Alhadis/FileIcons/"; \ | ||||
| 	perl -pi -e 's{$$base\K\w+(?=/svg/$(icon:%.svg=%)\.svg")}{$(last-commit)}ig;' $(charmap) | ||||
|  | ||||
|  | ||||
| # Dummy task to improve feedback if `cachebust` is mistyped | ||||
| icon: | ||||
| 	$(call need-var,,ERROR_UNDEF_ICON) | ||||
|  | ||||
|  | ||||
|  | ||||
| # Reset unstaged changes/additions in object directories | ||||
| clean: | ||||
| 	@git clean -fd $(font-folder) | ||||
| 	@git checkout -- $(font-folder) 2>/dev/null || true | ||||
|  | ||||
|  | ||||
| # Delete extracted and generated files | ||||
| distclean: | ||||
| 	@rm -rf $(font-folder) | ||||
|  | ||||
|  | ||||
| .PHONY: clean distclean $(charmap) cachebust icon | ||||
| .ONESHELL: | ||||
|  | ||||
|  | ||||
| # Error message shown to users attempting to run `make relink` without a link | ||||
| ERROR_NO_PKG := Environment variable ATOM_FILE_ICONS not found. \ | ||||
| 	| \ | ||||
| 	| Try this instead:\ | ||||
| 	| \ | ||||
| 	| \	make relink ATOM_FILE_ICONS=/path/to/your/file-icons/installation |  | ||||
|  | ||||
|  | ||||
| # Error message shown when running `make cachebust` without an icon | ||||
| ERROR_NO_ICON := No icon specified. Task aborted.| \ | ||||
| 	| Usage: \ | ||||
| 	| \	make icon=file[.svg] cachebust \ | ||||
| 	| \ | ||||
| 	| Examples: \ | ||||
| 	| \	make icon=Manpage cachebust \ | ||||
| 	| \	make icon=APL.svg cachebust |  | ||||
|  | ||||
|  | ||||
| # Shown if user tries running `make icon NAME cachebust` by mistake | ||||
| ERROR_UNDEF_ICON := No task named \"icon\". \ | ||||
| 	| \ | ||||
| 	| Did you mean this? \ | ||||
| 	| \	make icon=NAME cachebust |  | ||||
| 	 | ||||
|  | ||||
|  | ||||
| # If the given value is empty, die with an error message | ||||
| need = @$(if $(1),,echo $(subst | ,$$'\n',$(2)); exit 2) | ||||
|  | ||||
| # Like `need`, but uses variable names instead of string values | ||||
| need-var = @$(call need,$($(1)),$($(2))) | ||||
							
								
								
									
										413
									
								
								samples/Objective-C/cocoa_monitor.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										413
									
								
								samples/Objective-C/cocoa_monitor.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,413 @@ | ||||
| //======================================================================== | ||||
| // GLFW 3.3 OS X - www.glfw.org | ||||
| //------------------------------------------------------------------------ | ||||
| // Copyright (c) 2002-2006 Marcus Geelnard | ||||
| // Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org> | ||||
| // | ||||
| // This software is provided 'as-is', without any express or implied | ||||
| // warranty. In no event will the authors be held liable for any damages | ||||
| // arising from the use of this software. | ||||
| // | ||||
| // Permission is granted to anyone to use this software for any purpose, | ||||
| // including commercial applications, and to alter it and redistribute it | ||||
| // freely, subject to the following restrictions: | ||||
| // | ||||
| // 1. The origin of this software must not be misrepresented; you must not | ||||
| //    claim that you wrote the original software. If you use this software | ||||
| //    in a product, an acknowledgment in the product documentation would | ||||
| //    be appreciated but is not required. | ||||
| // | ||||
| // 2. Altered source versions must be plainly marked as such, and must not | ||||
| //    be misrepresented as being the original software. | ||||
| // | ||||
| // 3. This notice may not be removed or altered from any source | ||||
| //    distribution. | ||||
| // | ||||
| //======================================================================== | ||||
|  | ||||
| #include "internal.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <limits.h> | ||||
|  | ||||
| #include <IOKit/graphics/IOGraphicsLib.h> | ||||
| #include <CoreVideo/CVBase.h> | ||||
| #include <CoreVideo/CVDisplayLink.h> | ||||
| #include <ApplicationServices/ApplicationServices.h> | ||||
|  | ||||
|  | ||||
| // Get the name of the specified display | ||||
| // | ||||
| static char* getDisplayName(CGDirectDisplayID displayID) | ||||
| { | ||||
|     char* name; | ||||
|     CFDictionaryRef info, names; | ||||
|     CFStringRef value; | ||||
|     CFIndex size; | ||||
|  | ||||
|     // NOTE: This uses a deprecated function because Apple has | ||||
|     //       (as of January 2015) not provided any alternative | ||||
|     info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), | ||||
|                                          kIODisplayOnlyPreferredName); | ||||
|     names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName)); | ||||
|  | ||||
|     if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"), | ||||
|                                                  (const void**) &value)) | ||||
|     { | ||||
|         // This may happen if a desktop Mac is running headless | ||||
|         _glfwInputError(GLFW_PLATFORM_ERROR, | ||||
|                         "Cocoa: Failed to retrieve display name"); | ||||
|  | ||||
|         CFRelease(info); | ||||
|         return strdup("Unknown"); | ||||
|     } | ||||
|  | ||||
|     size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value), | ||||
|                                              kCFStringEncodingUTF8); | ||||
|     name = calloc(size + 1, 1); | ||||
|     CFStringGetCString(value, name, size, kCFStringEncodingUTF8); | ||||
|  | ||||
|     CFRelease(info); | ||||
|  | ||||
|     return name; | ||||
| } | ||||
|  | ||||
| // Check whether the display mode should be included in enumeration | ||||
| // | ||||
| static GLFWbool modeIsGood(CGDisplayModeRef mode) | ||||
| { | ||||
|     uint32_t flags = CGDisplayModeGetIOFlags(mode); | ||||
|     if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag)) | ||||
|         return GLFW_FALSE; | ||||
|  | ||||
|     if (flags & kDisplayModeInterlacedFlag) | ||||
|         return GLFW_FALSE; | ||||
|  | ||||
|     if (flags & kDisplayModeStretchedFlag) | ||||
|         return GLFW_FALSE; | ||||
|  | ||||
|     CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); | ||||
|     if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) && | ||||
|         CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0)) | ||||
|     { | ||||
|         CFRelease(format); | ||||
|         return GLFW_FALSE; | ||||
|     } | ||||
|  | ||||
|     CFRelease(format); | ||||
|     return GLFW_TRUE; | ||||
| } | ||||
|  | ||||
| // Convert Core Graphics display mode to GLFW video mode | ||||
| // | ||||
| static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode, | ||||
|                                             CVDisplayLinkRef link) | ||||
| { | ||||
|     GLFWvidmode result; | ||||
|     result.width = (int) CGDisplayModeGetWidth(mode); | ||||
|     result.height = (int) CGDisplayModeGetHeight(mode); | ||||
|     result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode); | ||||
|  | ||||
|     if (result.refreshRate == 0) | ||||
|     { | ||||
|         const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link); | ||||
|         if (!(time.flags & kCVTimeIsIndefinite)) | ||||
|             result.refreshRate = (int) (time.timeScale / (double) time.timeValue); | ||||
|     } | ||||
|  | ||||
|     CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); | ||||
|  | ||||
|     if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0) | ||||
|     { | ||||
|         result.redBits = 5; | ||||
|         result.greenBits = 5; | ||||
|         result.blueBits = 5; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         result.redBits = 8; | ||||
|         result.greenBits = 8; | ||||
|         result.blueBits = 8; | ||||
|     } | ||||
|  | ||||
|     CFRelease(format); | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| // Starts reservation for display fading | ||||
| // | ||||
| static CGDisplayFadeReservationToken beginFadeReservation(void) | ||||
| { | ||||
|     CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken; | ||||
|  | ||||
|     if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess) | ||||
|         CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE); | ||||
|  | ||||
|     return token; | ||||
| } | ||||
|  | ||||
| // Ends reservation for display fading | ||||
| // | ||||
| static void endFadeReservation(CGDisplayFadeReservationToken token) | ||||
| { | ||||
|     if (token != kCGDisplayFadeReservationInvalidToken) | ||||
|     { | ||||
|         CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE); | ||||
|         CGReleaseDisplayFadeReservation(token); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
| //////                       GLFW internal API                      ////// | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| // Change the current video mode | ||||
| // | ||||
| GLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired) | ||||
| { | ||||
|     CFArrayRef modes; | ||||
|     CFIndex count, i; | ||||
|     CVDisplayLinkRef link; | ||||
|     CGDisplayModeRef native = NULL; | ||||
|     GLFWvidmode current; | ||||
|     const GLFWvidmode* best; | ||||
|  | ||||
|     best = _glfwChooseVideoMode(monitor, desired); | ||||
|     _glfwPlatformGetVideoMode(monitor, ¤t); | ||||
|     if (_glfwCompareVideoModes(¤t, best) == 0) | ||||
|         return GLFW_TRUE; | ||||
|  | ||||
|     CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); | ||||
|  | ||||
|     modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); | ||||
|     count = CFArrayGetCount(modes); | ||||
|  | ||||
|     for (i = 0;  i < count;  i++) | ||||
|     { | ||||
|         CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); | ||||
|         if (!modeIsGood(dm)) | ||||
|             continue; | ||||
|  | ||||
|         const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link); | ||||
|         if (_glfwCompareVideoModes(best, &mode) == 0) | ||||
|         { | ||||
|             native = dm; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (native) | ||||
|     { | ||||
|         if (monitor->ns.previousMode == NULL) | ||||
|             monitor->ns.previousMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); | ||||
|  | ||||
|         CGDisplayFadeReservationToken token = beginFadeReservation(); | ||||
|         CGDisplaySetDisplayMode(monitor->ns.displayID, native, NULL); | ||||
|         endFadeReservation(token); | ||||
|     } | ||||
|  | ||||
|     CFRelease(modes); | ||||
|     CVDisplayLinkRelease(link); | ||||
|  | ||||
|     if (!native) | ||||
|     { | ||||
|         _glfwInputError(GLFW_PLATFORM_ERROR, | ||||
|                         "Cocoa: Monitor mode list changed"); | ||||
|         return GLFW_FALSE; | ||||
|     } | ||||
|  | ||||
|     return GLFW_TRUE; | ||||
| } | ||||
|  | ||||
| // Restore the previously saved (original) video mode | ||||
| // | ||||
| void _glfwRestoreVideoModeNS(_GLFWmonitor* monitor) | ||||
| { | ||||
|     if (monitor->ns.previousMode) | ||||
|     { | ||||
|         CGDisplayFadeReservationToken token = beginFadeReservation(); | ||||
|         CGDisplaySetDisplayMode(monitor->ns.displayID, | ||||
|                                 monitor->ns.previousMode, NULL); | ||||
|         endFadeReservation(token); | ||||
|  | ||||
|         CGDisplayModeRelease(monitor->ns.previousMode); | ||||
|         monitor->ns.previousMode = NULL; | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
| //////                       GLFW platform API                      ////// | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| _GLFWmonitor** _glfwPlatformGetMonitors(int* count) | ||||
| { | ||||
|     uint32_t i, found = 0, displayCount; | ||||
|     _GLFWmonitor** monitors; | ||||
|     CGDirectDisplayID* displays; | ||||
|  | ||||
|     *count = 0; | ||||
|  | ||||
|     CGGetOnlineDisplayList(0, NULL, &displayCount); | ||||
|     displays = calloc(displayCount, sizeof(CGDirectDisplayID)); | ||||
|     monitors = calloc(displayCount, sizeof(_GLFWmonitor*)); | ||||
|  | ||||
|     CGGetOnlineDisplayList(displayCount, displays, &displayCount); | ||||
|  | ||||
|     for (i = 0;  i < displayCount;  i++) | ||||
|     { | ||||
|         _GLFWmonitor* monitor; | ||||
|  | ||||
|         if (CGDisplayIsAsleep(displays[i])) | ||||
|             continue; | ||||
|  | ||||
|         const CGSize size = CGDisplayScreenSize(displays[i]); | ||||
|         char* name = getDisplayName(displays[i]); | ||||
|  | ||||
|         monitor = _glfwAllocMonitor(name, size.width, size.height); | ||||
|         monitor->ns.displayID  = displays[i]; | ||||
|         monitor->ns.unitNumber = CGDisplayUnitNumber(displays[i]); | ||||
|  | ||||
|         free(name); | ||||
|  | ||||
|         found++; | ||||
|         monitors[found - 1] = monitor; | ||||
|     } | ||||
|  | ||||
|     free(displays); | ||||
|  | ||||
|     *count = found; | ||||
|     return monitors; | ||||
| } | ||||
|  | ||||
| GLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second) | ||||
| { | ||||
|     // HACK: Compare unit numbers instead of display IDs to work around display | ||||
|     //       replacement on machines with automatic graphics switching | ||||
|     return first->ns.unitNumber == second->ns.unitNumber; | ||||
| } | ||||
|  | ||||
| void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos) | ||||
| { | ||||
|     const CGRect bounds = CGDisplayBounds(monitor->ns.displayID); | ||||
|  | ||||
|     if (xpos) | ||||
|         *xpos = (int) bounds.origin.x; | ||||
|     if (ypos) | ||||
|         *ypos = (int) bounds.origin.y; | ||||
| } | ||||
|  | ||||
| GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count) | ||||
| { | ||||
|     CFArrayRef modes; | ||||
|     CFIndex found, i, j; | ||||
|     GLFWvidmode* result; | ||||
|     CVDisplayLinkRef link; | ||||
|  | ||||
|     *count = 0; | ||||
|  | ||||
|     CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); | ||||
|  | ||||
|     modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); | ||||
|     found = CFArrayGetCount(modes); | ||||
|     result = calloc(found, sizeof(GLFWvidmode)); | ||||
|  | ||||
|     for (i = 0;  i < found;  i++) | ||||
|     { | ||||
|         CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); | ||||
|         if (!modeIsGood(dm)) | ||||
|             continue; | ||||
|  | ||||
|         const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link); | ||||
|  | ||||
|         for (j = 0;  j < *count;  j++) | ||||
|         { | ||||
|             if (_glfwCompareVideoModes(result + j, &mode) == 0) | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         // Skip duplicate modes | ||||
|         if (i < *count) | ||||
|             continue; | ||||
|  | ||||
|         (*count)++; | ||||
|         result[*count - 1] = mode; | ||||
|     } | ||||
|  | ||||
|     CFRelease(modes); | ||||
|     CVDisplayLinkRelease(link); | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode) | ||||
| { | ||||
|     CGDisplayModeRef displayMode; | ||||
|     CVDisplayLinkRef link; | ||||
|  | ||||
|     CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); | ||||
|  | ||||
|     displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); | ||||
|     *mode = vidmodeFromCGDisplayMode(displayMode, link); | ||||
|     CGDisplayModeRelease(displayMode); | ||||
|  | ||||
|     CVDisplayLinkRelease(link); | ||||
| } | ||||
|  | ||||
| void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp) | ||||
| { | ||||
|     uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID); | ||||
|     CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue)); | ||||
|  | ||||
|     CGGetDisplayTransferByTable(monitor->ns.displayID, | ||||
|                                 size, | ||||
|                                 values, | ||||
|                                 values + size, | ||||
|                                 values + size * 2, | ||||
|                                 &size); | ||||
|  | ||||
|     _glfwAllocGammaArrays(ramp, size); | ||||
|  | ||||
|     for (i = 0; i < size; i++) | ||||
|     { | ||||
|         ramp->red[i]   = (unsigned short) (values[i] * 65535); | ||||
|         ramp->green[i] = (unsigned short) (values[i + size] * 65535); | ||||
|         ramp->blue[i]  = (unsigned short) (values[i + size * 2] * 65535); | ||||
|     } | ||||
|  | ||||
|     free(values); | ||||
| } | ||||
|  | ||||
| void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp) | ||||
| { | ||||
|     int i; | ||||
|     CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue)); | ||||
|  | ||||
|     for (i = 0;  i < ramp->size;  i++) | ||||
|     { | ||||
|         values[i]                  = ramp->red[i] / 65535.f; | ||||
|         values[i + ramp->size]     = ramp->green[i] / 65535.f; | ||||
|         values[i + ramp->size * 2] = ramp->blue[i] / 65535.f; | ||||
|     } | ||||
|  | ||||
|     CGSetDisplayTransferByTable(monitor->ns.displayID, | ||||
|                                 ramp->size, | ||||
|                                 values, | ||||
|                                 values + ramp->size, | ||||
|                                 values + ramp->size * 2); | ||||
|  | ||||
|     free(values); | ||||
| } | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
| //////                        GLFW native API                       ////// | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle) | ||||
| { | ||||
|     _GLFWmonitor* monitor = (_GLFWmonitor*) handle; | ||||
|     _GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay); | ||||
|     return monitor->ns.displayID; | ||||
| } | ||||
|  | ||||
							
								
								
									
										93
									
								
								samples/PHP/ThriftGenerated.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								samples/PHP/ThriftGenerated.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| <?php | ||||
| namespace github\com; | ||||
|  | ||||
| /** | ||||
|  * Autogenerated by Thrift Compiler (0.9.3) | ||||
|  * | ||||
|  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING | ||||
|  *  @generated | ||||
|  */ | ||||
| use Thrift\Base\TBase; | ||||
| use Thrift\Type\TType; | ||||
| use Thrift\Type\TMessageType; | ||||
| use Thrift\Exception\TException; | ||||
| use Thrift\Exception\TProtocolException; | ||||
| use Thrift\Protocol\TProtocol; | ||||
| use Thrift\Protocol\TBinaryProtocolAccelerated; | ||||
| use Thrift\Exception\TApplicationException; | ||||
|  | ||||
|  | ||||
| class PullRequest { | ||||
|   static $_TSPEC; | ||||
|  | ||||
|   /** | ||||
|    * @var string | ||||
|    */ | ||||
|   public $title = null; | ||||
|  | ||||
|   public function __construct($vals=null) { | ||||
|     if (!isset(self::$_TSPEC)) { | ||||
|       self::$_TSPEC = array( | ||||
|         1 => array( | ||||
|           'var' => 'title', | ||||
|           'type' => TType::STRING, | ||||
|           ), | ||||
|         ); | ||||
|     } | ||||
|     if (is_array($vals)) { | ||||
|       if (isset($vals['title'])) { | ||||
|         $this->title = $vals['title']; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public function getName() { | ||||
|     return 'PullRequest'; | ||||
|   } | ||||
|  | ||||
|   public function read($input) | ||||
|   { | ||||
|     $xfer = 0; | ||||
|     $fname = null; | ||||
|     $ftype = 0; | ||||
|     $fid = 0; | ||||
|     $xfer += $input->readStructBegin($fname); | ||||
|     while (true) | ||||
|     { | ||||
|       $xfer += $input->readFieldBegin($fname, $ftype, $fid); | ||||
|       if ($ftype == TType::STOP) { | ||||
|         break; | ||||
|       } | ||||
|       switch ($fid) | ||||
|       { | ||||
|         case 1: | ||||
|           if ($ftype == TType::STRING) { | ||||
|             $xfer += $input->readString($this->title); | ||||
|           } else { | ||||
|             $xfer += $input->skip($ftype); | ||||
|           } | ||||
|           break; | ||||
|         default: | ||||
|           $xfer += $input->skip($ftype); | ||||
|           break; | ||||
|       } | ||||
|       $xfer += $input->readFieldEnd(); | ||||
|     } | ||||
|     $xfer += $input->readStructEnd(); | ||||
|     return $xfer; | ||||
|   } | ||||
|  | ||||
|   public function write($output) { | ||||
|     $xfer = 0; | ||||
|     $xfer += $output->writeStructBegin('PullRequest'); | ||||
|     if ($this->title !== null) { | ||||
|       $xfer += $output->writeFieldBegin('title', TType::STRING, 1); | ||||
|       $xfer += $output->writeString($this->title); | ||||
|       $xfer += $output->writeFieldEnd(); | ||||
|     } | ||||
|     $xfer += $output->writeFieldStop(); | ||||
|     $xfer += $output->writeStructEnd(); | ||||
|     return $xfer; | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										37
									
								
								samples/PHP/filenames/.php_cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								samples/PHP/filenames/.php_cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| <?php | ||||
|  | ||||
| $header = <<<'EOF' | ||||
| This file is part of PHP CS Fixer. | ||||
|  | ||||
| (c) Fabien Potencier <fabien@symfony.com> | ||||
|     Dariusz Rumiński <dariusz.ruminski@gmail.com> | ||||
|  | ||||
| This source file is subject to the MIT license that is bundled | ||||
| with this source code in the file LICENSE. | ||||
| EOF; | ||||
|  | ||||
| return PhpCsFixer\Config::create() | ||||
|     ->setRiskyAllowed(true) | ||||
|     ->setRules(array( | ||||
|         '@Symfony' => true, | ||||
|         '@Symfony:risky' => true, | ||||
|         'combine_consecutive_unsets' => true, | ||||
|         'header_comment' => array('header' => $header), | ||||
|         'array_syntax' => array('syntax' => 'long'), | ||||
|         'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'), | ||||
|         'no_useless_else' => true, | ||||
|         'no_useless_return' => true, | ||||
|         'ordered_class_elements' => true, | ||||
|         'ordered_imports' => true, | ||||
|         'php_unit_strict' => true, | ||||
|         'phpdoc_add_missing_param_annotation' => true, | ||||
|         'psr4' => true, | ||||
|         'strict_comparison' => true, | ||||
|         'strict_param' => true, | ||||
|     )) | ||||
|     ->setFinder( | ||||
|         PhpCsFixer\Finder::create() | ||||
|             ->exclude('tests/Fixtures') | ||||
|             ->in(__DIR__) | ||||
|     ) | ||||
| ; | ||||
							
								
								
									
										37
									
								
								samples/PHP/filenames/.php_cs.dist
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								samples/PHP/filenames/.php_cs.dist
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| <?php | ||||
|  | ||||
| $header = <<<'EOF' | ||||
| This file is part of PHP CS Fixer. | ||||
|  | ||||
| (c) Fabien Potencier <fabien@symfony.com> | ||||
|     Dariusz Rumiński <dariusz.ruminski@gmail.com> | ||||
|  | ||||
| This source file is subject to the MIT license that is bundled | ||||
| with this source code in the file LICENSE. | ||||
| EOF; | ||||
|  | ||||
| return PhpCsFixer\Config::create() | ||||
|     ->setRiskyAllowed(true) | ||||
|     ->setRules(array( | ||||
|         '@Symfony' => true, | ||||
|         '@Symfony:risky' => true, | ||||
|         'combine_consecutive_unsets' => true, | ||||
|         'header_comment' => array('header' => $header), | ||||
|         'array_syntax' => array('syntax' => 'long'), | ||||
|         'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'), | ||||
|         'no_useless_else' => true, | ||||
|         'no_useless_return' => true, | ||||
|         'ordered_class_elements' => true, | ||||
|         'ordered_imports' => true, | ||||
|         'php_unit_strict' => true, | ||||
|         'phpdoc_add_missing_param_annotation' => true, | ||||
|         'psr4' => true, | ||||
|         'strict_comparison' => true, | ||||
|         'strict_param' => true, | ||||
|     )) | ||||
|     ->setFinder( | ||||
|         PhpCsFixer\Finder::create() | ||||
|             ->exclude('tests/Fixtures') | ||||
|             ->in(__DIR__) | ||||
|     ) | ||||
| ; | ||||
							
								
								
									
										13
									
								
								samples/Pic/dextroamphetamine.chem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/Pic/dextroamphetamine.chem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| # Dextroamphetamine molecule | ||||
| .cstart | ||||
| 	.ps 26 | ||||
| 	size 28 | ||||
| R1: | ||||
| 	ring double 1,2 3,4 5,6 | ||||
| 	bond 60 from R1.V2 | ||||
| 	bond 120 | ||||
| A1: | ||||
| 	front bond down ; CH3 | ||||
| 	bond 60 from A1 ; NH2 | ||||
| 	.ps | ||||
| .cend | ||||
							
								
								
									
										25
									
								
								samples/Pic/graph.pic
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/Pic/graph.pic
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| .PS | ||||
| 	ellipse "Pic" "example" | ||||
| 	arrow | ||||
| 	box "This is" "a box"  | ||||
| 	arrow right | ||||
| 	box "Another" "box" dashed | ||||
| 	move down then right; | ||||
| Thing: ellipse "This is a" "circle-thing" | ||||
| 	arrow <-> from last box.r to Thing.l | ||||
| 	move down then left; | ||||
| B: box "Still a box" | ||||
| 	arrow from Thing.l to B.r | ||||
| 	sprintf("Width = %g, Height = %g ", B.wid, B.ht) rjust at B.w | ||||
| 	move down | ||||
| .ps 15 | ||||
| 	define sadness { | ||||
| 		boxwid = 3; | ||||
| 		boxht = 1; | ||||
| 		textht = .5; | ||||
| 		box "\"I run from my depression by" " " "burying myself in code\"" | ||||
| 		arrow down from last box.s | ||||
| 		"Me" | ||||
| 	} | ||||
| 	sadness(); | ||||
| .PE | ||||
							
								
								
									
										15
									
								
								samples/Pic/ritalin.chem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/Pic/ritalin.chem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| .\" RITALIN: Methylphenidate Hydrochloride | ||||
| .cstart | ||||
| .ps 15 | ||||
| size 15 | ||||
| 	R1: ring double 1,2 3,4 5,6 pointing up | ||||
| 	bond 60 length .35 from R1.V2 ; BP | ||||
| 	bond 120 length .35 from BP | ||||
| 	R2: ring pointing up put N at 1 | ||||
| 	H above R2 | ||||
| 	bond up  length .35 from BP ; BP | ||||
| 	bond -60 length .35 from BP ; O | ||||
| 	bond up | ||||
| 	double bond 60 length .35 from BP ; O | ||||
| .ps 10 | ||||
| .cend | ||||
							
								
								
									
										9
									
								
								samples/Python/filenames/.gclient
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Python/filenames/.gclient
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| solutions = [ | ||||
|   { | ||||
|     "url": "https://chromium.googlesource.com/v8/v8.git", | ||||
|     "managed": False, | ||||
|     "name": "v8", | ||||
|     "deps_file": "DEPS", | ||||
|     "custom_deps": {}, | ||||
|   }, | ||||
| ] | ||||
							
								
								
									
										20
									
								
								samples/Python/py3.py3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/Python/py3.py3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| import random | ||||
|  | ||||
| guesses = 0 | ||||
|  | ||||
| number = random.randint(1, 20) | ||||
|  | ||||
| print("Guess the number between 1 and 20! You have 6 tries.") | ||||
| while guesses < 6: | ||||
|     guess = int(input("Is it... ")) | ||||
|  | ||||
|     if guess == number: | ||||
|         print("Hooray! You guessed it right!") | ||||
|         break | ||||
|     elif guess < number: | ||||
|         print("It's bigger...") | ||||
|     elif guess > number: | ||||
|         print("It's not so big.") | ||||
|     guesses += 1 | ||||
| if guesses == 6: | ||||
|     print("You've ran out of tries.") | ||||
							
								
								
									
										1522
									
								
								samples/Python/standalone.gypi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1522
									
								
								samples/Python/standalone.gypi
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1420
									
								
								samples/Python/toolchain.gypi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1420
									
								
								samples/Python/toolchain.gypi
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										10
									
								
								samples/Rascal/Analyze.rsc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/Rascal/Analyze.rsc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| module Analyze | ||||
|  | ||||
| import Syntax; | ||||
|  | ||||
| set[Id] unreachable(Machine m) { | ||||
|   r = { <q1,q2> | (State)`state <Id q1> <Trans* ts>` <- m.states,  | ||||
| 				  (Trans)`<Id _>: <Id q2>` <- ts }+; | ||||
|   qs = [ q.name | /State q := m ]; | ||||
|   return { q | q <- qs, q notin r[qs[0]] }; | ||||
| } | ||||
							
								
								
									
										18
									
								
								samples/Rascal/Compile.rsc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/Rascal/Compile.rsc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| module Compile | ||||
|  | ||||
| import Syntax; | ||||
|  | ||||
| str compile(Machine m) = | ||||
|   "while (true) { | ||||
|   '  event = input.next(); | ||||
|   '  switch (current) {  | ||||
|   '    <for (q <- m.states) {> | ||||
|   '    case \"<q.name>\": | ||||
|   '      <for (t <- q.out) {> | ||||
|   '      if (event.equals(\"<t.event>\")) | ||||
|   '        current = \"<t.to>\"; | ||||
|   '      <}> | ||||
|   '      break; | ||||
|   '    <}> | ||||
|   '  } | ||||
|   '}";  | ||||
							
								
								
									
										887
									
								
								samples/Rascal/Rascal.rsc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										887
									
								
								samples/Rascal/Rascal.rsc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,887 @@ | ||||
|  @license{ | ||||
|   Copyright (c) 2009-2015 CWI | ||||
|   All rights reserved. This program and the accompanying materials | ||||
|   are made available under the terms of the Eclipse Public License v1.0 | ||||
|   which accompanies this distribution, and is available at | ||||
|   http://www.eclipse.org/legal/epl-v10.html | ||||
| } | ||||
| @contributor{Jurgen J. Vinju - Jurgen.Vinju@cwi.nl - CWI} | ||||
| @contributor{Tijs van der Storm - Tijs.van.der.Storm@cwi.nl} | ||||
| @contributor{Paul Klint - Paul.Klint@cwi.nl - CWI} | ||||
| @contributor{Arnold Lankamp - Arnold.Lankamp@cwi.nl} | ||||
| @contributor{Michael Steindorfer - Michael.Steindorfer@cwi.nl - CWI} | ||||
| @doc{The syntax definition of Rascal, excluding concrete syntax fragments} | ||||
| module lang::rascal::\syntax::Rascal | ||||
|  | ||||
| lexical BooleanLiteral | ||||
| 	= "true"  | ||||
| 	| "false" ; | ||||
|  | ||||
| syntax Literal | ||||
| 	= integer: IntegerLiteral integerLiteral  | ||||
| 	| regExp: RegExpLiteral regExpLiteral  | ||||
| 	| \real: RealLiteral realLiteral  | ||||
| 	| boolean: BooleanLiteral booleanLiteral  | ||||
| 	| string: StringLiteral stringLiteral  | ||||
| 	| dateTime: DateTimeLiteral dateTimeLiteral  | ||||
| 	| location: LocationLiteral locationLiteral | ||||
| 	| rational: RationalLiteral rationalLiteral | ||||
| 	; | ||||
|  | ||||
| syntax Expression = concrete: Concrete concrete; | ||||
| syntax Pattern    = concrete: Concrete concrete; | ||||
|  | ||||
| lexical Concrete  | ||||
|   = typed: "(" LAYOUTLIST l1 Sym symbol LAYOUTLIST l2 ")" LAYOUTLIST l3 "`" ConcretePart* parts "`"; | ||||
|  | ||||
| lexical ConcretePart | ||||
|   = @category="MetaSkipped" text   : ![`\<\>\\\n]+ !>> ![`\<\>\\\n] | ||||
|   | newline: "\n" [\ \t \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000]* "\'" | ||||
|   | @category="MetaVariable" hole : ConcreteHole hole | ||||
|   | @category="MetaSkipped" lt: "\\\<" | ||||
|   | @category="MetaSkipped" gt: "\\\>" | ||||
|   | @category="MetaSkipped" bq: "\\`" | ||||
|   | @category="MetaSkipped" bs: "\\\\" | ||||
|   ; | ||||
|    | ||||
| syntax ConcreteHole  | ||||
|   = \one: "\<" Sym symbol Name name "\>" | ||||
|   ; | ||||
|    | ||||
| start syntax Module | ||||
| 	= \default: Header header Body body ; | ||||
|  | ||||
| syntax ModuleParameters | ||||
| 	= \default: "[" {TypeVar ","}+ parameters "]" ; | ||||
|  | ||||
| lexical DateAndTime | ||||
| 	= "$" DatePart "T" TimePartNoTZ !>> [+\-] "$" | ||||
| 	| "$" DatePart "T" TimePartNoTZ TimeZonePart "$"; | ||||
|  | ||||
| syntax Strategy | ||||
| 	= topDownBreak: "top-down-break"  | ||||
| 	| topDown: "top-down"  | ||||
| 	| bottomUp: "bottom-up"  | ||||
| 	| bottomUpBreak: "bottom-up-break"  | ||||
| 	| outermost: "outermost"  | ||||
| 	| innermost: "innermost" ; | ||||
|  | ||||
| lexical UnicodeEscape | ||||
| 	  = utf16: "\\" [u] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f]  | ||||
|     | utf32: "\\" [U] (("0" [0-9 A-F a-f]) | "10") [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] // 24 bits  | ||||
|     | ascii: "\\" [a] [0-7] [0-9A-Fa-f] | ||||
|     ; | ||||
|      | ||||
| syntax Variable | ||||
| 	= initialized: Name name "=" Expression initial  | ||||
| 	| unInitialized: Name name ; | ||||
|  | ||||
| lexical OctalIntegerLiteral | ||||
| 	= [0] [0-7]+ !>> [0-9 A-Z _ a-z] ; | ||||
|  | ||||
| syntax TypeArg | ||||
| 	= \default: Type type  | ||||
| 	| named: Type type Name name ; | ||||
|  | ||||
| syntax Renaming | ||||
| 	= \default: Name from "=\>" Name to ; | ||||
|  | ||||
| syntax Catch | ||||
| 	= \default: "catch" ":" Statement body  | ||||
| 	| binding: "catch" Pattern pattern ":" Statement body ; | ||||
|  | ||||
| lexical PathChars | ||||
| 	= URLChars [|] ; | ||||
|  | ||||
| syntax Signature | ||||
| 	= withThrows: FunctionModifiers modifiers Type type  Name name Parameters parameters "throws" {Type ","}+ exceptions  | ||||
| 	| noThrows: FunctionModifiers modifiers Type type  Name name Parameters parameters ; | ||||
|  | ||||
| syntax Sym | ||||
| // named non-terminals | ||||
| 	= nonterminal: Nonterminal nonterminal !>> "[" | ||||
| 	| parameter: "&" Nonterminal nonterminal  | ||||
| 	| parametrized: Nonterminal nonterminal >> "[" "[" {Sym ","}+ parameters "]" | ||||
| 	| \start: "start" "[" Nonterminal nonterminal "]" | ||||
| 	| labeled: Sym symbol NonterminalLabel label | ||||
| // literals  | ||||
| 	| characterClass: Class charClass  | ||||
| 	| literal: StringConstant string  | ||||
| 	| caseInsensitiveLiteral: CaseInsensitiveStringConstant cistring | ||||
| // regular expressions | ||||
| 	| iter: Sym symbol "+"  | ||||
| 	| iterStar: Sym symbol "*"  | ||||
| 	| iterSep: "{" Sym symbol Sym sep "}" "+"  | ||||
| 	| iterStarSep: "{" Sym symbol Sym sep "}" "*"  | ||||
| 	| optional: Sym symbol "?"  | ||||
| 	| alternative: "(" Sym first "|" {Sym "|"}+ alternatives ")" | ||||
| 	| sequence: "(" Sym first Sym+ sequence ")" | ||||
| 	// TODO: MinimalIter: Sym symbol IntegerConstant minimal "+" | ||||
| 	// TODO: MinimalIterSep: "{" Sym symbol Symbol sep "}" IntegerConstant minimal "+" | ||||
| 	// TODO | Permutation: "(" Sym first "~" {Sym "~"}+ participants ")" | ||||
| 	// TODO | Combination: "(" Sym first "#" {Sym "#"}+ elements ")" | ||||
| 	| empty: "(" ")" | ||||
| // conditionals | ||||
| 	| column: Sym symbol "@" IntegerLiteral column  | ||||
| 	| endOfLine: Sym symbol "$"  | ||||
| 	| startOfLine: "^" Sym symbol | ||||
| 	| except:   Sym symbol "!" NonterminalLabel label | ||||
| 	>   | ||||
| 	assoc (  | ||||
| 	  left  ( follow:     Sym symbol  "\>\>" Sym match | ||||
| 	        | notFollow:  Sym symbol "!\>\>" Sym match | ||||
| 	        ) | ||||
| 	  |  | ||||
| 	  right ( precede:    Sym match "\<\<" Sym symbol  | ||||
| 	        | notPrecede: Sym match "!\<\<" Sym symbol | ||||
| 	        ) | ||||
| 	) | ||||
| 	>  | ||||
| 	left unequal:  Sym symbol "\\" Sym match | ||||
| 	; | ||||
|  | ||||
| lexical TimePartNoTZ | ||||
| 	= [0-2] [0-9] [0-5] [0-9] [0-5] [0-9] ([, .] [0-9] ([0-9] [0-9]?)?)?  | ||||
| 	| [0-2] [0-9] ":" [0-5] [0-9] ":" [0-5] [0-9] ([, .] [0-9] ([0-9] [0-9]?)?)?  | ||||
| 	; | ||||
|  | ||||
| syntax Header | ||||
| 	= parameters: Tags tags "module" QualifiedName name ModuleParameters params Import* imports  | ||||
| 	| \default: Tags tags "module" QualifiedName name Import* imports ; | ||||
|  | ||||
| lexical Name | ||||
|     // Names are surrounded by non-alphabetical characters, i.e. we want longest match. | ||||
| 	=  ([A-Z a-z _] !<< [A-Z _ a-z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z]) \ RascalKeywords  | ||||
| 	| [\\] [A-Z _ a-z] [\- 0-9 A-Z _ a-z]* !>> [\- 0-9 A-Z _ a-z]  | ||||
| 	; | ||||
|  | ||||
| syntax SyntaxDefinition | ||||
| 	=  @Foldable \layout  : Visibility vis "layout"  Sym defined "=" Prod production ";"  | ||||
| 	|  @Foldable \lexical : "lexical" Sym defined "=" Prod production ";"  | ||||
| 	|  @Foldable \keyword : "keyword" Sym defined "=" Prod production ";" | ||||
| 	|  @Foldable language: Start start "syntax" Sym defined "=" Prod production ";" ; | ||||
|  | ||||
| syntax Kind | ||||
| 	= function: "function"  | ||||
| 	| variable: "variable"  | ||||
| 	| \all: "all"  | ||||
| 	| \anno: "anno"  | ||||
| 	| \data: "data"  | ||||
| 	| view: "view"  | ||||
| 	| \alias: "alias"  | ||||
| 	| \module: "module"  | ||||
| 	| \tag: "tag" ; | ||||
|  | ||||
| syntax ImportedModule | ||||
| 	= \default: QualifiedName name  | ||||
| 	| actualsRenaming: QualifiedName name ModuleActuals actuals Renamings renamings  | ||||
| 	| renamings: QualifiedName name Renamings renamings  | ||||
| 	| actuals: QualifiedName name ModuleActuals actuals  | ||||
| 	; | ||||
|  | ||||
| syntax Target | ||||
| 	= empty:  | ||||
| 	| labeled: Name name ; | ||||
|  | ||||
| syntax IntegerLiteral | ||||
| 	= /*prefer()*/ decimalIntegerLiteral: DecimalIntegerLiteral decimal  | ||||
| 	| /*prefer()*/ hexIntegerLiteral: HexIntegerLiteral hex  | ||||
| 	| /*prefer()*/ octalIntegerLiteral: OctalIntegerLiteral octal ; | ||||
|  | ||||
| syntax FunctionBody | ||||
| 	= \default: "{" Statement* statements "}" ; | ||||
|      | ||||
| syntax Expression | ||||
| 	= nonEmptyBlock  : "{" Statement+ statements "}"  | ||||
| 	| bracket \bracket: "(" Expression expression ")"  | ||||
| 	| closure        : Type type Parameters parameters "{" Statement+ statements "}"  | ||||
| 	| stepRange      : "[" Expression first "," Expression second ".." Expression last "]"  | ||||
| 	| voidClosure    : Parameters parameters "{" Statement* statements0 "}"  | ||||
| 	| \visit          : Label label Visit visit  | ||||
| 	| reducer        : "(" Expression init "|" Expression result "|" {Expression ","}+ generators ")"  | ||||
| 	| reifiedType    : "type" "(" Expression symbol "," Expression definitions ")"   | ||||
| 	| callOrTree     : Expression!transitiveClosure!transitiveReflexiveClosure!isDefined expression "(" {Expression ","}* arguments KeywordArguments[Expression] keywordArguments ")" | ||||
| 	| literal        : Literal literal  | ||||
| 	| \any            : "any" "(" {Expression ","}+ generators ")"  | ||||
| 	| \all            : "all" "(" {Expression ","}+ generators ")"  | ||||
| 	| comprehension  : Comprehension comprehension  | ||||
| 	| \set            : "{" {Expression ","}* elements0 "}"  | ||||
| 	| \list           : "[" {Expression ","}* elements0 "]" | ||||
| 	| reifyType      : "#" Type type !>> "[" !selector | ||||
| 	| range          : "[" Expression first ".." Expression last "]" | ||||
| 	| \tuple          : "\<" {Expression ","}+ elements "\>"  | ||||
| 	| \map            : "(" {Mapping[Expression] ","}* mappings ")"  | ||||
| 	| \it             : [A-Z a-z _] !<< "it" !>> [A-Z a-z _] | ||||
| 	| qualifiedName  : QualifiedName qualifiedName  | ||||
| 	| subscript    : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" {Expression ","}+ subscripts "]" | ||||
| 	| slice        : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" OptionalExpression optFirst ".." OptionalExpression optLast "]"  | ||||
|     | sliceStep    : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" OptionalExpression optFirst "," Expression second ".." OptionalExpression optLast "]"  | ||||
| 	| fieldAccess  : Expression expression "." Name field  | ||||
| 	| fieldUpdate  : Expression expression "[" Name key "=" Expression replacement "]"  | ||||
| 	| fieldProject : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "\<" {Field ","}+ fields "\>"  | ||||
| 	| setAnnotation: Expression expression "[" "@" Name name "=" Expression value "]"  | ||||
|     | getAnnotation: Expression expression >> "@" "@" Name name  | ||||
| 	| is           : Expression expression "is" Name name | ||||
| 	| has          : Expression expression "has" Name name | ||||
| 	| transitiveClosure: Expression argument "+" !>> "=" | ||||
|     | transitiveReflexiveClosure: Expression argument "*" !>> "="  | ||||
| 	> isDefined    : Expression argument "?"  | ||||
| 	> negation     : "!" Expression!match!noMatch argument  | ||||
| 	| negative     : "-" Expression argument  | ||||
| 	| non-assoc splice : "*" Expression argument | ||||
| 	| asType       : "[" Type type "]" Expression!match!noMatch argument | ||||
| 	> left composition: Expression lhs "o" Expression rhs  | ||||
| 	> left ( product: Expression lhs "*" () !>> "*" Expression!noMatch!match rhs   | ||||
| 		   | \join   : Expression lhs "join" Expression rhs  | ||||
| 	       | remainder: Expression lhs "%" Expression rhs | ||||
| 		   | division: Expression lhs "/" Expression rhs  | ||||
| 	     ) | ||||
| 	> left intersection: Expression lhs "&" !>> "&" Expression rhs  | ||||
| 	> left ( addition   : Expression lhs "+" Expression!noMatch!match rhs   | ||||
| 		   | subtraction: Expression!transitiveClosure!transitiveReflexiveClosure lhs "-" Expression rhs | ||||
| 		   | appendAfter: Expression lhs "\<\<" !>> "=" Expression rhs | ||||
| 		   | insertBefore: Expression lhs "\>\>" Expression rhs  | ||||
| 	       ) | ||||
| 	> left modulo: Expression lhs "mod" Expression rhs | ||||
| 	> non-assoc ( notIn: Expression lhs "notin" Expression rhs   | ||||
| 		        | \in: Expression lhs "in" Expression rhs  | ||||
| 	) | ||||
| 	> non-assoc ( greaterThanOrEq: Expression lhs "\>=" Expression rhs   | ||||
| 		        | lessThanOrEq   : Expression lhs "\<=" Expression rhs  | ||||
| 		        | lessThan       : Expression lhs "\<" !>> "-" Expression rhs  | ||||
| 		        | greaterThan    : Expression lhs "\>" Expression rhs  | ||||
| 	            ) | ||||
| 	> non-assoc ( equals         : Expression lhs "==" Expression rhs | ||||
| 	            | nonEquals      : Expression lhs "!=" Expression rhs  | ||||
| 	            ) | ||||
| 	> non-assoc ifDefinedOtherwise: Expression lhs "?" Expression rhs | ||||
| 	> non-assoc ( noMatch: Pattern pattern "!:=" Expression expression   | ||||
| 		        | match: Pattern pattern ":=" Expression expression  | ||||
| 		        | enumerator: Pattern pattern "\<-" Expression expression  | ||||
| 	            )  | ||||
| 	> non-assoc ( implication: Expression lhs "==\>" Expression rhs   | ||||
| 		        | equivalence: Expression lhs "\<==\>" Expression rhs  | ||||
| 	            ) | ||||
| 	> left and: Expression lhs "&&" Expression rhs  | ||||
| 	> left or: Expression lhs "||" Expression rhs  | ||||
| 	> right ifThenElse: Expression condition "?" Expression thenExp ":" Expression elseExp | ||||
| 	;  | ||||
|  | ||||
| syntax OptionalExpression  | ||||
|   = expression: Expression expression | ||||
|   | noExpression: () | ||||
|   ; | ||||
|      | ||||
| syntax UserType | ||||
| 	= name: QualifiedName name  | ||||
| 	| parametric: QualifiedName name >> "[" "[" {Type ","}+ parameters "]" ; | ||||
|  | ||||
| syntax Import | ||||
| 	= \extend: "extend" ImportedModule module ";"  | ||||
| 	| \default: "import" ImportedModule module ";" | ||||
| 	| \external: "import" QualifiedName name "=" LocationLiteral at ";" | ||||
| 	| \syntax: SyntaxDefinition syntax ; | ||||
|  | ||||
| syntax Body | ||||
| 	= toplevels: Toplevel* toplevels ; | ||||
|  | ||||
| lexical URLChars | ||||
| 	= ![\t-\n \r \  \< |]* ; | ||||
|  | ||||
| lexical TimeZonePart | ||||
| 	= [+ \-] [0-1] [0-9] ":" [0-5] [0-9]  | ||||
| 	| "Z"  | ||||
| 	| [+ \-] [0-1] [0-9]  | ||||
| 	| [+ \-] [0-1] [0-9] [0-5] [0-9]  | ||||
| 	; | ||||
|  | ||||
| syntax ProtocolPart | ||||
| 	= nonInterpolated: ProtocolChars protocolChars  | ||||
| 	| interpolated: PreProtocolChars pre Expression expression ProtocolTail tail ; | ||||
|  | ||||
| syntax StringTemplate | ||||
| 	= ifThen    : "if"    "(" {Expression ","}+ conditions ")" "{" Statement* preStats StringMiddle body Statement* postStats "}"  | ||||
| 	| ifThenElse: "if"    "(" {Expression ","}+ conditions ")" "{" Statement* preStatsThen StringMiddle thenString Statement* postStatsThen "}" "else" "{" Statement* preStatsElse StringMiddle elseString Statement* postStatsElse "}"  | ||||
| 	| \for       : "for"   "(" {Expression ","}+ generators ")" "{" Statement* preStats StringMiddle body Statement* postStats "}"  | ||||
| 	| doWhile   : "do"    "{" Statement* preStats StringMiddle body Statement* postStats "}" "while" "(" Expression condition ")"  | ||||
| 	| \while     : "while" "(" Expression condition ")" "{" Statement* preStats StringMiddle body Statement* postStats "}" ; | ||||
|  | ||||
| lexical PreStringChars | ||||
| 	= @category="Constant" [\"] StringCharacter* [\<] ; | ||||
|  | ||||
| lexical CaseInsensitiveStringConstant | ||||
| 	= @category="Constant" "\'" StringCharacter* chars "\'" ; | ||||
|  | ||||
| lexical Backslash | ||||
| 	= [\\] !>> [/ \< \> \\] ; | ||||
|  | ||||
| syntax Label | ||||
| 	= \default: Name name ":"  | ||||
| 	| empty: ; | ||||
|  | ||||
| lexical MidProtocolChars | ||||
| 	= "\>" URLChars "\<" ; | ||||
|  | ||||
| lexical NamedBackslash | ||||
| 	= [\\] !>> [\< \> \\] ; | ||||
|  | ||||
| syntax Field | ||||
| 	= index: IntegerLiteral fieldIndex  | ||||
| 	| name: Name fieldName ; | ||||
|  | ||||
| lexical JustDate | ||||
| 	= "$" DatePart "$"; | ||||
|  | ||||
| lexical PostPathChars | ||||
| 	=  "\>" URLChars "|" ; | ||||
|  | ||||
| syntax PathPart | ||||
| 	= nonInterpolated: PathChars pathChars  | ||||
| 	| interpolated: PrePathChars pre Expression expression PathTail tail ; | ||||
|  | ||||
| lexical DatePart | ||||
| 	= [0-9] [0-9] [0-9] [0-9] "-" [0-1] [0-9] "-" [0-3] [0-9]  | ||||
| 	| [0-9] [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] ; | ||||
|  | ||||
| syntax FunctionModifier | ||||
| 	= java: "java"  | ||||
| 	| \test: "test"  | ||||
| 	| \default: "default"; | ||||
|  | ||||
| syntax Assignment | ||||
| 	= ifDefined: "?="  | ||||
| 	| division: "/="  | ||||
| 	| product: "*="  | ||||
| 	| intersection: "&="  | ||||
| 	| subtraction: "-="  | ||||
| 	| \default: "="  | ||||
| 	| addition: "+="  | ||||
| 	| \append: "\<\<=" | ||||
| 	; | ||||
|  | ||||
| syntax Assignable | ||||
| 	= bracket \bracket   : "(" Assignable arg ")" | ||||
| 	| variable          : QualifiedName qualifiedName | ||||
|     | subscript         : Assignable receiver "[" Expression subscript "]"  | ||||
|     | slice             : Assignable receiver "[" OptionalExpression optFirst ".." OptionalExpression optLast "]"  | ||||
|     | sliceStep         : Assignable receiver "[" OptionalExpression optFirst "," Expression second ".." OptionalExpression optLast "]"      | ||||
| 	| fieldAccess       : Assignable receiver "." Name field  | ||||
| 	| ifDefinedOrDefault: Assignable receiver "?" Expression defaultExpression  | ||||
| 	| constructor       : Name name "(" {Assignable ","}+ arguments ")"   | ||||
| 	| \tuple             : "\<" {Assignable ","}+ elements "\>"  | ||||
| 	| annotation        : Assignable receiver "@" Name annotation  ; | ||||
|  | ||||
| lexical StringConstant | ||||
| 	= @category="Constant" "\"" StringCharacter* chars "\"" ; | ||||
|  | ||||
|  | ||||
|  | ||||
| syntax Assoc | ||||
| 	= associative: "assoc"  | ||||
| 	| left: "left"  | ||||
| 	| nonAssociative: "non-assoc"  | ||||
| 	| right: "right" ; | ||||
|  | ||||
| syntax Replacement | ||||
| 	= unconditional: Expression replacementExpression  | ||||
| 	| conditional: Expression replacementExpression "when" {Expression ","}+ conditions ; | ||||
|  | ||||
| syntax DataTarget | ||||
| 	= empty:  | ||||
| 	| labeled: Name label ":" ; | ||||
|  | ||||
| lexical StringCharacter | ||||
| 	= "\\" [\" \' \< \> \\ b f n r t]  | ||||
| 	| UnicodeEscape  | ||||
| 	| ![\" \' \< \> \\] | ||||
| 	| [\n][\ \t \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000]* [\'] // margin  | ||||
| 	; | ||||
|  | ||||
| lexical JustTime | ||||
| 	= "$T" TimePartNoTZ !>> [+\-] "$" | ||||
| 	| "$T" TimePartNoTZ TimeZonePart "$" | ||||
| 	; | ||||
|  | ||||
| lexical MidStringChars | ||||
| 	= @category="Constant" [\>] StringCharacter* [\<] ; | ||||
|  | ||||
| lexical ProtocolChars | ||||
| 	= [|] URLChars "://" !>> [\t-\n \r \ \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000]; | ||||
|  | ||||
| lexical RegExpModifier | ||||
| 	= [d i m s]* ; | ||||
|  | ||||
| syntax CommonKeywordParameters  | ||||
|   = absent: () | ||||
|   | present: "(" {KeywordFormal ","}+ keywordFormalList ")" | ||||
|   ; | ||||
|      | ||||
| syntax Parameters | ||||
| 	= \default: "(" Formals formals KeywordFormals keywordFormals ")"  | ||||
| 	| varArgs: "(" Formals formals "..." KeywordFormals keywordFormals ")" ; | ||||
|  | ||||
| lexical OptionalComma = \default: ","? ; | ||||
|  | ||||
| syntax KeywordFormals | ||||
|     = \default: OptionalComma optionalComma [,\ (\t\n] << {KeywordFormal ","}+ keywordFormalList | ||||
|     | none: () | ||||
|     ; | ||||
|      | ||||
| syntax KeywordFormal  | ||||
|     = \default: Type type Name name "=" Expression expression | ||||
|     ; | ||||
|      | ||||
| syntax KeywordArguments[&T] | ||||
|     = \default:  OptionalComma optionalComma [,\ (\t\n] << {KeywordArgument[&T] ","}+ keywordArgumentList | ||||
|     | none: () | ||||
|     ; | ||||
|      | ||||
| syntax KeywordArgument[&T] = \default: Name name "=" &T expression ; | ||||
|  | ||||
| lexical RegExp | ||||
| 	= ![/ \< \> \\]  | ||||
| 	| "\<" Name "\>"  | ||||
| 	| [\\] [/ \< \> \\]  | ||||
| 	| "\<" Name ":" NamedRegExp* "\>"  | ||||
| 	| Backslash  | ||||
| 	// | @category="MetaVariable" [\<]  Expression expression [\>] TODO: find out why this production existed  | ||||
| 	; | ||||
| 	 | ||||
|  | ||||
| layout LAYOUTLIST | ||||
| 	= LAYOUT* !>> [\u0009-\u000D \u0020 \u0085 \u00A0 \u1680 \u180E \u2000-\u200A \u2028 \u2029 \u202F \u205F \u3000] !>> "//" !>> "/*"; | ||||
|  | ||||
| syntax LocalVariableDeclaration | ||||
| 	= \default: Declarator declarator  | ||||
| 	| \dynamic: "dynamic" Declarator declarator ; | ||||
|  | ||||
| lexical RealLiteral | ||||
| 	= [0-9]+ [D F d f]  | ||||
| 	| [0-9]+ [E e] [+ \-]? [0-9]+ [D F d f]? | ||||
| 	| [0-9]+ "." !>> "." [0-9]* [D F d f]?   | ||||
| 	| [0-9]+ "." [0-9]* [E e] [+ \-]? [0-9]+ [D F d f]?  | ||||
| 	| [.] !<< "." [0-9]+ [D F d f]?  | ||||
| 	| [.] !<< "." [0-9]+ [E e] [+ \-]? [0-9]+ [D F d f]?  | ||||
| 	; | ||||
|  | ||||
| syntax Range | ||||
| 	= fromTo: Char start "-" Char end  | ||||
| 	| character: Char character ; | ||||
|  | ||||
| syntax LocationLiteral | ||||
| 	= \default: ProtocolPart protocolPart PathPart pathPart ; | ||||
|  | ||||
| syntax ShellCommand | ||||
| 	= setOption: "set" QualifiedName name Expression expression  | ||||
| 	| undeclare: "undeclare" QualifiedName name  | ||||
| 	| help: "help"  | ||||
| 	| edit: "edit" QualifiedName name  | ||||
| 	| unimport: "unimport" QualifiedName name  | ||||
| 	| listDeclarations: "declarations"  | ||||
| 	| quit: "quit"  | ||||
| 	| history: "history"  | ||||
| 	| \test: "test"  | ||||
| 	| listModules: "modules"  | ||||
| 	| clear: "clear"; | ||||
|  | ||||
| syntax StringMiddle | ||||
| 	= mid: MidStringChars mid  | ||||
| 	| template: MidStringChars mid StringTemplate template StringMiddle tail  | ||||
| 	| interpolated: MidStringChars mid Expression expression StringMiddle tail ; | ||||
|  | ||||
| syntax QualifiedName | ||||
| 	= \default: {Name "::"}+ names !>> "::" ; | ||||
|  | ||||
| lexical RationalLiteral | ||||
|    = [0-9][0-9]* [r] | ||||
|    | [1-9][0-9]* [r] [0-9][0-9]* !>> [0-9 A-Z _ a-z] | ||||
|    ; | ||||
|  | ||||
| lexical DecimalIntegerLiteral | ||||
| 	= "0" !>> [0-9 A-Z _ a-z]  | ||||
| 	| [1-9] [0-9]* !>> [0-9 A-Z _ a-z] ; | ||||
|  | ||||
| syntax DataTypeSelector | ||||
| 	= selector: QualifiedName sort "." Name production ; | ||||
|  | ||||
| syntax StringTail | ||||
| 	= midInterpolated: MidStringChars mid Expression expression StringTail tail  | ||||
| 	| post: PostStringChars post  | ||||
| 	| midTemplate: MidStringChars mid StringTemplate template StringTail tail ; | ||||
|  | ||||
| syntax PatternWithAction | ||||
| 	= replacing: Pattern pattern "=\>" Replacement replacement  | ||||
| 	| arbitrary: Pattern pattern ":" Statement statement ; | ||||
|  | ||||
| lexical LAYOUT | ||||
| 	= Comment  | ||||
| 	// all the white space chars defined in Unicode 6.0  | ||||
| 	| [\u0009-\u000D \u0020 \u0085 \u00A0 \u1680 \u180E \u2000-\u200A \u2028 \u2029 \u202F \u205F \u3000]  | ||||
| 	; | ||||
|  | ||||
| syntax Visit | ||||
| 	= givenStrategy: Strategy strategy "visit" "(" Expression subject ")" "{" Case+ cases "}"  | ||||
| 	| defaultStrategy: "visit" "(" Expression subject ")" "{" Case+ cases "}" ; | ||||
|  | ||||
| start syntax Commands | ||||
| 	= \commandlist: EvalCommand+ commands | ||||
| 	; | ||||
|  | ||||
| start syntax EvalCommand | ||||
|   = declaration: Declaration declaration   | ||||
|   | statement: Statement!variableDeclaration!functionDeclaration!visit statement  | ||||
|   | \import: Import imported | ||||
|   | output: Output | ||||
|   ; | ||||
|   | ||||
| lexical Output    | ||||
|   = @category="Result" resultOutput: "⇨" ![\n\r]* [\n]  | ||||
|   | @category="StdOut" stdoutOutput: ^ "≫" ![\n\r]* [\n] | ||||
|   | @category="StdErr" stderrOutput: ^ "⚠" ![\n\r]* [\n] | ||||
|   ; | ||||
|    | ||||
| start syntax Command | ||||
| 	= expression: Expression!nonEmptyBlock expression  | ||||
| 	| declaration: Declaration declaration  | ||||
| 	| shell: ":" ShellCommand command  | ||||
| 	| statement: Statement!variableDeclaration!functionDeclaration!visit statement  | ||||
| 	| \import: Import imported ; | ||||
|  | ||||
| lexical TagString | ||||
| 	= "\\" !<< "{" ( ![{}] | ("\\" [{}]) | TagString)* contents "\\" !<< "}"; | ||||
|  | ||||
| syntax ProtocolTail | ||||
| 	= mid: MidProtocolChars mid Expression expression ProtocolTail tail  | ||||
| 	| post: PostProtocolChars post ; | ||||
|  | ||||
| lexical Nonterminal | ||||
| 	= ([A-Z] !<< [A-Z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z]) \ RascalKeywords; | ||||
|  | ||||
| syntax PathTail | ||||
| 	= mid: MidPathChars mid Expression expression PathTail tail  | ||||
| 	| post: PostPathChars post ; | ||||
|  | ||||
| syntax Visibility | ||||
| 	= \private: "private"  | ||||
| 	| \default:  | ||||
| 	| \public: "public" ; | ||||
|  | ||||
| syntax StringLiteral | ||||
| 	= template: PreStringChars pre StringTemplate template StringTail tail  | ||||
| 	| interpolated: PreStringChars pre Expression expression StringTail tail  | ||||
| 	| nonInterpolated: StringConstant constant ; | ||||
|  | ||||
| lexical Comment | ||||
| 	= @category="Comment" "/*" (![*] | [*] !>> [/])* "*/"  | ||||
| 	| @category="Comment" "//" ![\n]* !>> [\ \t\r \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000] $ // the restriction helps with parsing speed | ||||
| 	; | ||||
| 	 | ||||
|  | ||||
| syntax Renamings | ||||
| 	= \default: "renaming" {Renaming ","}+ renamings ; | ||||
|  | ||||
| syntax Tags | ||||
| 	= \default: Tag* tags ; | ||||
|  | ||||
| syntax Formals | ||||
| 	= \default: {Pattern ","}* formals ; | ||||
|  | ||||
| lexical PostProtocolChars | ||||
| 	= "\>" URLChars "://" ; | ||||
|  | ||||
| syntax Start | ||||
| 	= absent:  | ||||
| 	| present: "start" ; | ||||
|  | ||||
| syntax Statement | ||||
| 	= @breakable \assert: "assert" Expression expression ";"  | ||||
| 	| @breakable assertWithMessage: "assert" Expression expression ":" Expression message ";"  | ||||
| 	| @breakable expression: Expression!visit!nonEmptyBlock expression ";"  | ||||
| 	| @breakable \visit: Label label Visit visit  | ||||
| 	| @breakable \while: Label label "while" "(" {Expression ","}+ conditions ")" Statement!variableDeclaration!functionDeclaration body  | ||||
| 	| @breakable doWhile: Label label "do" Statement body "while" "(" Expression condition ")" ";"  | ||||
| 	| @breakable @breakable{generators} \for: Label label "for" "(" {Expression ","}+ generators ")" Statement body  | ||||
| 	| @breakable ifThen: Label label "if" "(" {Expression ","}+ conditions ")" Statement!variableDeclaration!functionDeclaration thenStatement () !>> "else"  | ||||
| 	| @breakable ifThenElse: Label label "if" "(" {Expression ","}+ conditions ")" Statement thenStatement "else" Statement!variableDeclaration!functionDeclaration elseStatement  | ||||
| 	| @breakable \switch: Label label "switch" "(" Expression expression ")" "{" Case+ cases "}"  | ||||
| 	| @breakable \fail: "fail" Target target ";"  | ||||
| 	| @breakable \break: "break" Target target ";"  | ||||
| 	| @breakable \continue: "continue" Target target ";"  | ||||
|     | @breakable \filter: "filter" ";" | ||||
| 	| @breakable \solve: "solve" "(" {QualifiedName ","}+ variables Bound bound ")" Statement!variableDeclaration!functionDeclaration body  | ||||
| 	| @breakable non-assoc \try: "try" Statement body Catch+ handlers  | ||||
| 	| @breakable tryFinally: "try" Statement body Catch+ handlers "finally" Statement!variableDeclaration!functionDeclaration finallyBody  | ||||
| 	| nonEmptyBlock: Label label "{" Statement+ statements "}"  | ||||
| 	| emptyStatement: ";"  | ||||
| 	| @breakable globalDirective: "global" Type type {QualifiedName ","}+ names ";"  | ||||
| 	| @breakable assignment: Assignable assignable Assignment operator Statement!functionDeclaration!variableDeclaration statement | ||||
| 	| non-assoc  (  | ||||
| 		          @breakable \return    : "return" Statement!functionDeclaration!variableDeclaration statement   | ||||
| 		        | @breakable \throw     : "throw" Statement!functionDeclaration!variableDeclaration statement  | ||||
| 		        | @breakable \insert    : "insert" DataTarget dataTarget Statement!functionDeclaration!variableDeclaration statement  | ||||
| 		        | @breakable \append    : "append" DataTarget dataTarget Statement!functionDeclaration!variableDeclaration statement  | ||||
| 	            ) | ||||
|     | @breakable functionDeclaration: FunctionDeclaration functionDeclaration  | ||||
| 	| @breakable variableDeclaration: LocalVariableDeclaration declaration ";" | ||||
| 	;  | ||||
| 	 | ||||
|      | ||||
| syntax StructuredType | ||||
| 	= \default: BasicType basicType "[" {TypeArg ","}+ arguments "]" ; | ||||
|  | ||||
| lexical NonterminalLabel | ||||
| 	= [a-z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z] ; | ||||
|  | ||||
| syntax FunctionType | ||||
| 	= typeArguments: Type type "(" {TypeArg ","}* arguments ")" ; | ||||
|  | ||||
| syntax Case | ||||
| 	= @Foldable patternWithAction: "case" PatternWithAction patternWithAction  | ||||
| 	| @Foldable \default: "default" ":" Statement statement ; | ||||
|  | ||||
| syntax Declarator | ||||
| 	= \default: Type type {Variable ","}+ variables ; | ||||
|  | ||||
| syntax Bound | ||||
| 	= \default: ";" Expression expression  | ||||
| 	| empty: ; | ||||
|  | ||||
| keyword RascalKeywords | ||||
| 	= "o" | ||||
| 	| "syntax" | ||||
| 	| "keyword" | ||||
| 	| "lexical" | ||||
| 	| "int" | ||||
| 	| "break" | ||||
| 	| "continue" | ||||
| 	| "rat"  | ||||
| 	| "true"  | ||||
| 	| "bag"  | ||||
| 	| "num"  | ||||
| 	| "node"  | ||||
| 	| "finally"  | ||||
| 	| "private"  | ||||
| 	| "real"  | ||||
| 	| "list"  | ||||
| 	| "fail"  | ||||
| 	| "filter"  | ||||
| 	| "if"  | ||||
| 	| "tag"  | ||||
| 	| BasicType | ||||
| 	| "extend"  | ||||
| 	| "append"  | ||||
| 	| "rel"  | ||||
| 	| "lrel" | ||||
| 	| "void"  | ||||
| 	| "non-assoc"  | ||||
| 	| "assoc"  | ||||
| 	| "test"  | ||||
| 	| "anno"  | ||||
| 	| "layout"  | ||||
| 	| "data"  | ||||
| 	| "join"  | ||||
| 	| "it"  | ||||
| 	| "bracket"  | ||||
| 	| "in"  | ||||
| 	| "import"  | ||||
| 	| "false"  | ||||
| 	| "all"  | ||||
| 	| "dynamic"  | ||||
| 	| "solve"  | ||||
| 	| "type"  | ||||
| 	| "try"  | ||||
| 	| "catch"  | ||||
| 	| "notin"  | ||||
| 	| "else"  | ||||
| 	| "insert"  | ||||
| 	| "switch"  | ||||
| 	| "return"  | ||||
| 	| "case"  | ||||
| 	| "while"  | ||||
| 	| "str"  | ||||
| 	| "throws"  | ||||
| 	| "visit"  | ||||
| 	| "tuple"  | ||||
| 	| "for"  | ||||
| 	| "assert"  | ||||
| 	| "loc"  | ||||
| 	| "default"  | ||||
| 	| "map"  | ||||
| 	| "alias"  | ||||
| 	| "any"  | ||||
| 	| "module"  | ||||
| 	| "mod" | ||||
| 	| "bool"  | ||||
| 	| "public"  | ||||
| 	| "one"  | ||||
| 	| "throw"  | ||||
| 	| "set"  | ||||
| 	| "start" | ||||
| 	| "datetime"  | ||||
| 	| "value"  | ||||
| 	; | ||||
|  | ||||
| syntax Type | ||||
| 	= bracket \bracket: "(" Type type ")"  | ||||
| 	| user: UserType user | ||||
| 	| function: FunctionType function  | ||||
| 	| structured: StructuredType structured  | ||||
| 	| basic: BasicType basic  | ||||
| 	| selector: DataTypeSelector selector  | ||||
| 	| variable: TypeVar typeVar  | ||||
| 	| symbol: Sym!nonterminal!labeled!parametrized!parameter symbol | ||||
| 	; | ||||
|  | ||||
| syntax Declaration | ||||
| 	= variable    : Tags tags Visibility visibility Type type {Variable ","}+ variables ";"  | ||||
| 	| annotation  : Tags tags Visibility visibility "anno" Type annoType Type onType "@" Name name ";"  | ||||
| 	| \alias       : Tags tags Visibility visibility "alias" UserType user "=" Type base ";"  | ||||
| 	| \tag         : Tags tags Visibility visibility "tag" Kind kind Name name "on" {Type ","}+ types ";"  | ||||
| 	| dataAbstract: Tags tags Visibility visibility "data" UserType user CommonKeywordParameters commonKeywordParameters ";"  | ||||
| 	| @Foldable \data : Tags tags Visibility visibility "data" UserType user CommonKeywordParameters commonKeywordParameters"=" {Variant "|"}+ variants ";" | ||||
| 	| function       : FunctionDeclaration functionDeclaration  | ||||
| 	; | ||||
|  | ||||
| syntax Class | ||||
| 	= simpleCharclass: "[" Range* ranges "]"  | ||||
| 	| complement: "!" Class charClass  | ||||
| 	> left difference: Class lhs "-" Class rhs  | ||||
| 	> left intersection: Class lhs "&&" Class rhs  | ||||
| 	> left union: Class lhs "||" Class rhs  | ||||
| 	| bracket \bracket: "(" Class charclass ")" ; | ||||
|  | ||||
| lexical RegExpLiteral | ||||
| 	= "/" RegExp* "/" RegExpModifier ; | ||||
|  | ||||
| syntax FunctionModifiers | ||||
| 	= \modifierlist: FunctionModifier* modifiers ; | ||||
|  | ||||
| syntax Comprehension | ||||
| 	= @breakable{results,generators} \set: "{" {Expression ","}+ results "|" {Expression ","}+ generators "}"  | ||||
| 	| @breakable{from,to,generators} \map: "(" Expression from ":" Expression to "|" {Expression ","}+ generators ")"  | ||||
| 	| @breakable{results,generators} \list: "[" {Expression ","}+ results "|" {Expression ","}+ generators "]" ; | ||||
|  | ||||
| syntax Variant | ||||
| 	= nAryConstructor: Name name "(" {TypeArg ","}* arguments  KeywordFormals keywordArguments ")" ; | ||||
|  | ||||
| syntax FunctionDeclaration | ||||
| 	= abstract: Tags tags Visibility visibility Signature signature ";"  | ||||
| 	| @Foldable @breakable{expression} expression: Tags tags Visibility visibility Signature signature "=" Expression expression ";" | ||||
| 	| @Foldable @breakable{expression,conditions} conditional: Tags tags Visibility visibility Signature signature "=" Expression expression "when" {Expression ","}+ conditions ";" | ||||
| 	| @Foldable \default: Tags tags Visibility visibility Signature signature FunctionBody body ; | ||||
|  | ||||
| lexical PreProtocolChars | ||||
| 	= "|" URLChars "\<" ; | ||||
|  | ||||
| lexical NamedRegExp | ||||
| 	= "\<" Name "\>"  | ||||
| 	| [\\] [/ \< \> \\]  | ||||
| 	| NamedBackslash  | ||||
| 	| ![/ \< \> \\] ; | ||||
|  | ||||
| syntax ProdModifier | ||||
| 	= associativity: Assoc associativity  | ||||
| 	| \bracket: "bracket"  | ||||
| 	| \tag: Tag tag; | ||||
|  | ||||
| syntax Toplevel | ||||
| 	= givenVisibility: Declaration declaration ; | ||||
|  | ||||
| lexical PostStringChars | ||||
| 	= @category="Constant" [\>] StringCharacter* [\"] ; | ||||
|  | ||||
| lexical HexIntegerLiteral | ||||
| 	= [0] [X x] [0-9 A-F a-f]+ !>> [0-9 A-Z _ a-z] ; | ||||
|  | ||||
| syntax TypeVar | ||||
| 	= free: "&" Name name  | ||||
| 	| bounded: "&" Name name "\<:" Type bound ; | ||||
|  | ||||
|  | ||||
|  | ||||
| syntax BasicType | ||||
| 	= \value: "value"  | ||||
| 	| \loc: "loc"  | ||||
| 	| \node: "node"  | ||||
| 	| \num: "num"  | ||||
| 	| \type: "type"  | ||||
| 	| \bag: "bag"  | ||||
| 	| \int: "int" | ||||
| 	| rational: "rat"  | ||||
| 	| relation: "rel"  | ||||
| 	| listRelation: "lrel" | ||||
| 	| \real: "real"  | ||||
| 	| \tuple: "tuple"  | ||||
| 	| string: "str"  | ||||
| 	| \bool: "bool"  | ||||
| 	| \void: "void"  | ||||
| 	| dateTime: "datetime"  | ||||
| 	| \set: "set"  | ||||
| 	| \map: "map"  | ||||
| 	| \list: "list"  | ||||
| 	; | ||||
|  | ||||
| lexical Char | ||||
| 	= @category="Constant" "\\" [\  \" \' \- \< \> \[ \\ \] b f n r t]  | ||||
| 	| @category="Constant" ![\  \" \' \- \< \> \[ \\ \]]  | ||||
| 	| @category="Constant" UnicodeEscape  | ||||
|     ;  | ||||
|      | ||||
| syntax Prod | ||||
| 	= reference: ":" Name referenced | ||||
| 	| labeled: ProdModifier* modifiers Name name ":" Sym* syms  | ||||
| 	| others: "..."  | ||||
| 	| unlabeled: ProdModifier* modifiers Sym* syms | ||||
| 	| @Foldable associativityGroup: Assoc associativity "(" Prod group ")"  | ||||
| 	// | TODO add bracket rule for easy readability | ||||
| 	> left \all   : Prod lhs "|" Prod rhs  | ||||
| 	> left first : Prod lhs "\>" !>> "\>" Prod rhs | ||||
| 	; | ||||
|  | ||||
| syntax DateTimeLiteral | ||||
| 	= /*prefer()*/ dateLiteral: JustDate date  | ||||
| 	| /*prefer()*/ timeLiteral: JustTime time  | ||||
| 	| /*prefer()*/ dateAndTimeLiteral: DateAndTime dateAndTime ; | ||||
|  | ||||
| lexical PrePathChars | ||||
| 	= URLChars "\<" ; | ||||
|  | ||||
| syntax Mapping[&T] | ||||
| 	= \default: &T!ifDefinedOtherwise from ":" &T to  | ||||
| 	; | ||||
|  | ||||
| lexical MidPathChars | ||||
| 	= "\>" URLChars "\<" ; | ||||
|  | ||||
| /* | ||||
|   Note that Pattern must closely follow the definitions of Expression because eventually | ||||
|   these two non-terminals will be fused just before AST generation. | ||||
| */ | ||||
| syntax Pattern | ||||
| 	= \set                 : "{" {Pattern ","}* elements0 "}"  | ||||
| 	| \list                : "[" {Pattern ","}* elements0 "]"  | ||||
| 	| qualifiedName       : QualifiedName qualifiedName  | ||||
| 	| multiVariable       : QualifiedName qualifiedName "*" | ||||
| 	| splice              : "*" Pattern argument | ||||
| 	| splicePlus          : "+" Pattern argument  | ||||
| 	| negative            : "-" Pattern argument | ||||
| 	| literal             : Literal literal  | ||||
| 	| \tuple               : "\<" {Pattern ","}+ elements "\>"  | ||||
| 	| typedVariable       : Type type Name name  | ||||
| 	| \map                 : "(" {Mapping[Pattern] ","}* mappings ")"  | ||||
| 	| reifiedType         : "type" "(" Pattern symbol "," Pattern definitions ")"  | ||||
| 	| callOrTree          : Pattern expression "(" {Pattern ","}* arguments KeywordArguments[Pattern] keywordArguments ")"  | ||||
| 	> variableBecomes     : Name name ":" Pattern pattern | ||||
| 	| asType              : "[" Type type "]" Pattern argument  | ||||
| 	| descendant          : "/" Pattern pattern  | ||||
| 	| anti                : "!" Pattern pattern  | ||||
| 	| typedVariableBecomes: Type type Name name ":" Pattern pattern  | ||||
|     ; | ||||
|      | ||||
| syntax Tag | ||||
| 	= @Folded @category="Comment" \default   : "@" Name name TagString contents  | ||||
| 	| @Folded @category="Comment" empty     : "@" Name name  | ||||
| 	| @Folded @category="Comment" expression: "@" Name name "=" Expression expression !>> "@"; | ||||
|  | ||||
| syntax ModuleActuals | ||||
| 	= \default: "[" {Type ","}+ types "]" ; | ||||
							
								
								
									
										8
									
								
								samples/Rascal/Syntax.rsc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Rascal/Syntax.rsc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| module Syntax | ||||
|  | ||||
| extend lang::std::Layout; | ||||
| extend lang::std::Id; | ||||
|  | ||||
| start syntax Machine = machine: State+ states; | ||||
| syntax State = @Foldable state: "state" Id name Trans* out; | ||||
| syntax Trans = trans: Id event ":" Id to; | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user