zunscript 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f412e1847f8dfeebd98d2488b7f936c636e6bcac
4
+ data.tar.gz: c5797f7e07ccffc133e5461941ea1c0ec437b495
5
+ SHA512:
6
+ metadata.gz: a8df68e9a5f1a3efd2d00575a15e938c966e468619e072c88fb55b194901920d7d27de0188212950c2e0af2a015a2837ec4af5ffb62162c05bd41320ee618c2c
7
+ data.tar.gz: 4ffa9693c87f16a1b7ecb5c2961c5e35979967f0f15b90f8eaaadc7e5b66062c20427458678cce79aad5f0f81d89e74be7f746999fa14b5bd73174620a7d9edc
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ ZunScriptParser.rb
11
+ ZunScriptLexer.rb
12
+ *.tokens
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in zunscript.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 S0lll0s
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,100 @@
1
+ ZunScript
2
+ =========
3
+ ZunScript is a conceptual Scripting Language.
4
+ Below are some loosely-defined syntax rules.
5
+ I am borrowing and expanding upon concepts of Ruby, Python and Lua.
6
+
7
+ The main features I want to explore with ZunScript are method and parameter binding as well as a very monkeypatchable langauge.
8
+ I am trying to boil everything down to the a few very simple and concise rules and ideas with clear syntax;
9
+ On a higher level than Lua but not as polluted as Ruby is in my opinion (for example things like `$1, $2, ...` are way too specific to be in a language's core for example).
10
+
11
+ I want to eliminate keywords and hardcoded things wherever possible, if possible to the point where control structures are just functions too.
12
+
13
+ Property Access
14
+ ---------------
15
+ You can access an objects raw properties with the `!` symbol:
16
+
17
+ object!value # obtain value of object
18
+ object!method # obtain method of object
19
+
20
+ Methods can be bound with the `.` symbol:
21
+
22
+ object.method # obtain method of object (bound to object)
23
+
24
+ this will return another function that accepts one parameter less and is bound to `object` instead.
25
+
26
+
27
+ Calling
28
+ -------
29
+ You can invoke functions with the `!` symbol:
30
+
31
+ method!
32
+ method! 1, 2, 3
33
+
34
+ Together with bound/unbound property access you can do various things:
35
+
36
+ object = {}
37
+ def object.trace a, b, c # => function(3)
38
+ return a, b, c
39
+ end
40
+
41
+ object.trace # => function(2)
42
+ object!trace # => function(3)
43
+
44
+ object.trace! # => <object>, nil, nil
45
+ object.trace! 1, 2 # => <object>, 1, 2
46
+
47
+ object!trace! # => nil, nil, nil
48
+ object!trace! 1, 2 # => 1, 2, nil
49
+
50
+ a = object.trace 1, 2 # => function(0)
51
+ b = object!trace 1, 2 # => function(1)
52
+
53
+ a! # => <object>, 1, 2
54
+ b! # => 1, 2, nil
55
+ b! 3 # => 1, 2, 3
56
+
57
+ Blocks
58
+ ------
59
+ Blocks start with `>` and end with `end`:
60
+
61
+ do
62
+ print! "hello"
63
+ end
64
+
65
+ They can accept parmeters after the `>` sign:
66
+
67
+ print_block = >a, b
68
+ print! a, b
69
+ end
70
+
71
+ Blocks can be passed as parameters (as lambdas):
72
+
73
+ for 1, 4, >a
74
+ print! a
75
+ end
76
+
77
+ Single lines can also be passed as blocks:
78
+
79
+ just_like_if = <, condition, block
80
+ if condition, <
81
+ block!
82
+ end
83
+ end
84
+
85
+ print! "value was true!" < kind_of_if value
86
+
87
+ This will:
88
+ 3. bind `value` to `kind_of_if`
89
+ 2. build a Block from `print! "value was true!"
90
+ 1. invoke the bound `kind_of_if` with the Block as a parameter.
91
+
92
+ It is synonymous to this piece of code:
93
+
94
+ kind_of_if! value, <
95
+ print! "value was true!"
96
+ end
97
+
98
+ Single-line Block literals can also accept parameters:
99
+
100
+ print! a, b <a, b for 1, 4
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.test_files = FileList['test/**/test_*.rb']
6
+ end
7
+ desc "Run tests"
8
+
9
+ task default: :test
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
data/bin/zsi ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'trollop'
4
+ require 'colorize'
5
+ require 'zunscript'
6
+
7
+ opts = Trollop::options do
8
+ version "zsi (c) Sol Bekic 2015"
9
+ opt :log, "Print per-line results"
10
+ opt :debug, "Print debug info (AST)"
11
+ opt :interactive, "Go into interactive mode after running files"
12
+ end
13
+
14
+ e = ZunScript::Environment.new debug: opts[:debug]
15
+ ARGV.reject! do |file|
16
+ e.run_script open(file) do |res|
17
+ puts "[#{n.statement}]\t=> #{res.inspect}".colorize :red if opts[:log]
18
+ end
19
+ true
20
+ end
21
+
22
+ if opts[:interactive]
23
+ while true
24
+ print "zsi > "
25
+ buffer = ""
26
+ l = "asd"
27
+ buffer << gets
28
+ while not l == "\n"
29
+ print "... > "
30
+ l = gets
31
+ buffer << l
32
+ end
33
+ puts "=> #{(e.run_line buffer).inspect}".colorize :blue
34
+ end
35
+ end
@@ -0,0 +1,105 @@
1
+ # the Environment currently provides these blocks
2
+ # print - print all parameters on one line
3
+ # puts - print every parameter on its own line
4
+ # add - add two numbers
5
+ # multiply - multiply two numbers
6
+
7
+ ## Calling
8
+ ########
9
+ print! "hello world"
10
+ print! "one", 2
11
+ puts!
12
+
13
+ ## Assignment
14
+ ############
15
+ x = 2
16
+ print! "x is ", x
17
+ x = multiply! x, 2
18
+ print! "now x is ", x
19
+
20
+ ## Binding
21
+ #########
22
+ times_two = multiply 2
23
+ print! "two times 4 equals ", times_two! 4
24
+
25
+ ## nested Calls and Binding
26
+ ##########################
27
+ print! times_two! 4, "okay?"
28
+ print! "2 * 3 = ", (multiply! 2, 3), ", no?"
29
+
30
+ ## Blocks
31
+ ########
32
+ doubled_sum = > a, b
33
+ print! "(BLK) a = ", a
34
+ print! "(BLK) b = ", b
35
+ times_two! (add! a, b)
36
+ end
37
+
38
+ doubled_sum! 2, 3
39
+ doubled_sum! 2, 3
40
+
41
+ y = >
42
+ print! "parameterless block"
43
+ end
44
+
45
+ custom_multiply = > a, b
46
+ print! "a: ", a, ", b: ", b
47
+ multiply! a, b
48
+ end
49
+ custom_double = custom_multiply 2
50
+
51
+ print! custom_double! 4, " should be 8"
52
+ nine = custom_double 4.5
53
+ print! nine!, " should be 9"
54
+
55
+ ## lexical Scope
56
+ ################
57
+ plus_one = add 1
58
+
59
+ print! plus_one! 3
60
+ globally = >
61
+ plus_one = add 4
62
+ print! plus_one! 3
63
+ end
64
+ locally = >
65
+ plus_one = add 4
66
+ print! plus_one! 3
67
+ end
68
+ print! plus_one! 3
69
+ locally!
70
+ print! plus_one! 3
71
+ globally!
72
+ print! plus_one! 3
73
+
74
+ ## nested Blocks
75
+ ################
76
+ n_times = > n
77
+ > x
78
+ multiply! n, x
79
+ end
80
+ end
81
+ print! "-12 4-"
82
+ three_times = n_times! 3
83
+ two_times = n_times! 2
84
+ print! three_times! 4
85
+ print! two_times! 2
86
+
87
+ ## Flow Control
88
+ ###############
89
+ for! 1, 5, print
90
+
91
+ for! 1, 5, > x
92
+ print! x
93
+ end
94
+
95
+ y = > x
96
+ print! x, "th time!"
97
+ end
98
+ for! 1, 5, y
99
+
100
+ ## Objects
101
+ ##########
102
+ #a = Object.new!
103
+ #a.x = 2
104
+ #a.y = 1
105
+ #x.pos.x.y = greg.stuff! a.red
@@ -0,0 +1,9 @@
1
+ all:
2
+ antlr4ruby ZunScript.g
3
+
4
+ install:
5
+ mv ZunScriptLexer.rb lexer.rb
6
+ mv ZunScriptParser.rb parser.rb
7
+
8
+ clean:
9
+ rm -f ZunScript.tokens
@@ -0,0 +1,87 @@
1
+ grammar ZunScript;
2
+
3
+ options {
4
+ language = Ruby;
5
+ output = AST;
6
+ backtrack = true;
7
+ }
8
+
9
+ tokens {
10
+ ASSIGN;
11
+ INVOKE; BIND;
12
+ LEFTBLOCK;
13
+ PARAM;
14
+ NUM; STR; BLK;
15
+ VARIABLE;
16
+ BODY;
17
+ INDEX;
18
+ }
19
+
20
+ ASSIGN: '=';
21
+ BLOCK_LEFT: '<';
22
+ BLOCK_RIGHT: '>';
23
+ ARITH_SIGN: '+' | '-' | '*' | '/' | '^';
24
+ BANG: '!';
25
+ COMMENT: '#';
26
+ BLOCK_END: 'end';
27
+
28
+ COMMA: ',';
29
+ LPAREN: '(';
30
+ RPAREN: ')';
31
+
32
+ fragment NONCONTROL_CHAR: LETTER | DIGIT | SYMBOL | SPACE;
33
+ fragment LETTER: LOWER | UPPER;
34
+ fragment LOWER: 'a'..'z';
35
+ fragment UPPER: 'A'..'Z';
36
+ fragment DIGIT: '0'..'9';
37
+ fragment SYMBOL: '!' | '#'..'/' | ':'..'@' | '['..'`' | '{'..'~';
38
+
39
+ fragment FLOAT: INTEGER '.' '0'..'9'+;
40
+ fragment INTEGER: '0' | '-'? '1'..'9' '0'..'9'*;
41
+
42
+ NAME: LETTER (LETTER | DIGIT | '_' | '?')*;
43
+ STRING: '"' NONCONTROL_CHAR* '"';
44
+ NUMBER: INTEGER | FLOAT;
45
+
46
+ fragment SPACE: ' ' | '\t';
47
+ NEWLINE: ('\r'? '\n')+;
48
+ WHITESPACE: SPACE+ { $channel = HIDDEN; };
49
+
50
+ script: line* EOF!;
51
+ line: open_expression? comment!? NEWLINE!;
52
+
53
+ comment: COMMENT (~NEWLINE)*;
54
+
55
+ open_expression:
56
+ assign | invoke | bind | closed_expression;
57
+ closed_expression:
58
+ value | variable | closed_invoke | closed_bind
59
+ | LPAREN! open_expression RPAREN!;
60
+
61
+ variable: (NAME '.')* NAME -> ^(VARIABLE NAME*);
62
+
63
+ value:
64
+ v=NUMBER -> ^(NUM $v)
65
+ | v=STRING -> ^(STR $v)
66
+ | block;
67
+
68
+ block: BLOCK_RIGHT arguments NEWLINE block_body BLOCK_END -> ^(BLK arguments* block_body);
69
+ block_body: line* -> ^(BODY line*);
70
+
71
+ arguments: |NAME (COMMA! NAME)*;
72
+
73
+ assign:
74
+ variable ASSIGN open_expression -> ^(ASSIGN variable open_expression);
75
+
76
+ invoke:
77
+ variable BANG params -> ^(INVOKE variable params*);
78
+ bind:
79
+ variable params -> ^(BIND variable params*);
80
+ closed_invoke:
81
+ variable BANG param? -> ^(INVOKE variable param*);
82
+ closed_bind:
83
+ variable param -> ^(BIND variable param);
84
+
85
+ params:
86
+ param (COMMA! param)*;
87
+ param: closed_expression;
@@ -0,0 +1,106 @@
1
+ #! /usr/bin/ruby
2
+ # encoding: utf-8
3
+
4
+ =begin LICENSE
5
+ [The "BSD licence"]
6
+ Copyright (c) 2009-2011 Kyle Yetter
7
+ All rights reserved.
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions
10
+ are met:
11
+ 1. Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+ 2. Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+ 3. The name of the author may not be used to endorse or promote products
17
+ derived from this software without specific prior written permission.
18
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ =end
29
+
30
+ =begin rdoc antlr4ruby
31
+ A simple wrapper script to run the ANTLR tool with the ruby antlr3
32
+ target modifications in place of the default Ruby target data.
33
+ It essentially does two things:
34
+ * locate the `customized' ANTLR v.3 JAR archive file
35
+ * exec the command <tt>java -cp path/to/jar $ARGV</tt>
36
+ Thus, for ANTLR tool usage, refer to ANTLR's main documentation
37
+ at http://www.antlr.org .
38
+ There are a small number of additional options available
39
+ in addition to ANTLR's options:
40
+ --version display the Ruby target version and then the
41
+ ANTLR tool's version information
42
+
43
+ --help, -h as ANTLR does not provide these standard switches,
44
+ it executes the ANTLR tool without arguments to make
45
+ it print out usage information
46
+
47
+ --keep-classpath Do not unset the CLASSPATH environmental variable before
48
+ executing the java command (*)
49
+ (*) This script unsets CLASSPATH to avoid interference from system installations
50
+ of prior versions of ANTLR. The jar that is distributed with this package
51
+ is complete, and thus does not generally require any external libraries, so
52
+ this shouldn't cause any major problems. However, if for some reason you
53
+ need to keep this variable to execute the command properly, you can use
54
+ the --keep-classpath option.
55
+ =end
56
+
57
+ $0 = 'antlr4ruby'
58
+
59
+ begin
60
+ require 'antlr3'
61
+ rescue LoadError
62
+ __DIR__ = File.expand_path( File.dirname __FILE__ )
63
+ project_top = File.dirname __DIR__
64
+ lib = File.join( project_top, 'lib' )
65
+ $LOAD_PATH.unshift( lib )
66
+ require 'antlr3'
67
+ end
68
+
69
+ jar = ANTLR3.antlr_jar or fail( "cannot find antlr4ruby's customized ANTLR jar" )
70
+
71
+ # Convert the Posix path to a proper Windows path, otherwise the Java runtime
72
+ # will not find the antlr Jar file.
73
+ # -- Thanks to Marco Soeima for this fix
74
+ if /cygwin/i =~ RUBY_PLATFORM
75
+ jar = `cygpath -aw #{jar}`.strip
76
+ end
77
+
78
+ run = proc do | *args |
79
+ exec( 'java', '-jar', jar, *args )
80
+ end
81
+
82
+ ARGV.delete( '--keep-classpath' ) or
83
+ ENV.delete( 'CLASSPATH' )
84
+
85
+ if ARGV.include?( '--version' )
86
+
87
+ puts( "Ruby Target and Runtime Library Version: #{ ANTLR3::VERSION_STRING }" )
88
+ puts "ANTLR3 Jar Path: #{ jar }"
89
+ run.call( '-version' )
90
+
91
+ elsif ARGV.include?( '--help' ) or ARGV.include?( '-h' )
92
+
93
+ # the ANTLR tool doesn't follow the --help/-h convention
94
+ # -- it provides help only if no arguments are specified
95
+ run.call
96
+
97
+ elsif ARGV.include?( "--jar-path" )
98
+
99
+ puts "ANTLR3 Jar Path: #{ jar }"
100
+
101
+ else
102
+
103
+ # run the tool
104
+ run.call( *ARGV )
105
+
106
+ end