Demo updated.

This commit is contained in:
Onoshko Dan 2014-04-28 15:20:12 +07:00
parent 50ff6c272c
commit ff64dec3f7
5 changed files with 194 additions and 83 deletions

View File

@ -1,6 +1,6 @@
![logo](http://trigen.pro/colalogo.png) ![logo](http://trigen.pro/colalogo.png)
ColaScript is a language that compiles in JavaScript. This language is similar to Dart, CoffeeScript, Python and PHP, with some original ideas. Compiler based on [UglifyJS2](https://github.com/mishoo/UglifyJS2). In present time compiler in development. Play with language you can in `lib/index.html`. ColaScript is a language that compiles in JavaScript. This language is similar to Dart, CoffeeScript, Python and PHP, with some original ideas. Compiler based on [UglifyJS2](https://github.com/mishoo/UglifyJS2). In present time compiler in development. Play with language you can [here](http://develop.trigen.pro/cola/).
# to do: # to do:
@ -326,4 +326,4 @@ ColaScript is a language that compiles in JavaScript. This language is similar t
### Statistic ### Statistic
- 34 feature ( without classes ) - 34 feature ( without classes )
- 23 done - 26 done

121
demo.cola
View File

@ -1,51 +1,102 @@
// `main` functions may binding to a onload event
// Functions can defined without `function` keyword, with and without `type`
main(){ main(){
// Unary operators
// Two variants of `isset` operator. Which is better?
bool _seted = true, _empty;
console.log("`_seted` is", _seted?? ? "seted" : "empty");
console.log("`_empty` is", isset _empty ? "seted" : "empty");
// `clone` operator
Array _first = [584], _second = clone _first;
_first.push(404);
console.log("`_first`:",_first,"`_second`:",_second);
// Binary operators
// `pow` operator
console.log("5 ** 3 =", 5 ** 3);
// `modulo` operator
console.log("10 %% 4 = ", 10 %% 4);
// `isset` conditional assigment
int a, b = 4;
console.log("`a` is", a, ", now `a` is", a ?= b);
console.log("`a` is", a, ", now `a` still", a ?= 584);
// `isset` binary conditional
int x, y = 5;
console.log("`x` is", x, ", `y` is", y, ", x ? y = ", x ? y), x = 1;
console.log("`x` is", x, ", `y` is", y, ", x ? y = ", x ? y);
// `is` operator
console.log("'hello'", "hello" is String ? "is" : "isnt", "`String`");
// `isnt` operator
console.log("'goodby'", "goodby" isnt Number ? "isnt" : "is", "`Number`");
// Boolean alternatives
console.log("`yes` and `no`", yes is Boolean && no is Boolean ? "is" : "isnt", "`Boolean`");
console.log("`on` and `off`", on is Boolean && off is Boolean ? "is" : "isnt", "`Boolean`");
// Strings
// New quotes symbol, multi-lining and templating
console.log(` console.log(`
Hello! Hello!
My name is ColaScript, and i know who you are }:-> My name is ColaScript, and i know who you are }:->
@{navigator.userAgent} User agent: @{navigator.userAgent}
Vendor: {{navigator.vendor}}
`); `);
console.log("pow:", 5 ** 2, "; modulo:", 5 %% 3, ";"); // Raw strings
console.log(r"\n \r \t some@email.ru");
Number a = 3.14, b = 584, c; // Multiline RegExp's
a ?= b; console.log(a);
a = undefined;
a ?= b; console.log(a);
console.log(a = c ? b);
c = 404;
console.log(a = c ? b);
b = undefined;
Array x, y;
x = [123];
y = clone x;
y[] = 321;
console.log('original:',x,'cloned:',y, y[]);
y[0..1] = [1..10];
console.log(y[0..4]);
y.forEach((val) => console.log(val));
console.log("a is {{isset a ? 'set' : 'undefiend'}}, b is {{b?? ? 'set' : 'undefined'}}");
console.log(`is:`, location.href is String, `; isnt:`, 123 isnt Number, ";");
if(yes === true && on === true && no === false && off === false) console.log('Boolean alternatives');
console.log('Raw string:', r`@test \n \t \r`);
RegExp isEmail = / RegExp isEmail = /
([\w-\.]+) ([\w-\.]+)
@ @
((?:[\w]+\.)+) ((?:[\w]+\.)+)
([a-zA-Z]{2,4}) ([a-zA-Z]{2,4})
/, email = r'danon0404@gmail.com'; /;
console.log("@email is email:", isEmail.test(email)); String email = r'some@email.ru';
console.log("@email {{ isEmail.test(email) ? "is" : "isnt" }} valid email adress");
// Arrays
// Empty getter and setter ( pushig )
Array arr = [2, 4, 8, 16, 32];
console.log("Last element of `arr` is", arr[]), arr[] = 64;
console.log("Now last element of `arr` is", arr[]);
// Splice assigment
arr[2..4] = [3, 2, 1];
console.log("`arr` is", arr);
// Range
console.log("`[0..10]` is", [0..10]);
// Calling function
console.log(Profile(
"Dan", "Green",
"HTML5", "JavaScript", "Dart", "PHP", "CSS3", "LESS", "Qt",
age : 19,
petName : "Felix"
));
} }
main(); // Functions
// Named, positional and splated arguments, with default values.
// Arrow functions.
Object Profile(String firstName, String secondName, String country = "Russia", Array skills..., age:, petName: "Tux"){
skills.forEach((val) => val == "JavaScript" && console.log("JavaScript - It Awesome!"));
return {
firstName : firstName,
secondName : secondName,
age : age,
country : country,
skills : skills,
petName : petName
};
}

View File

@ -27,12 +27,14 @@
} }
textarea { textarea {
-moz-box-sizing: border-box;
box-sizing: border-box; box-sizing: border-box;
width: 33.333%; width: 33.333%;
height: 100%; height: 100%;
font-size: 12px; font-size: 12px;
float: left; float: left;
font-family: "Andale Mono"; font-family: "Andale Mono";
padding: 0 5px 26px 5px;
} }
#controls { #controls {
@ -60,61 +62,118 @@
background-color: white; background-color: white;
opacity: 0.5; opacity: 0.5;
} }
#lenstat {
float: right;
margin: 5px 8px 0 0;
}
</style> </style>
</head> </head>
<body> <body>
<textarea id="source" onkeyup="compile()">main(){ <textarea id="source" onkeyup="compile()">// `main` functions may binding to a onload event
// Functions can defined without `function` keyword, with and without `type`
main(){
// Unary operators
// Two variants of `isset` operator. Which is better?
bool _seted = true, _empty;
console.log("`_seted` is", _seted?? ? "seted" : "empty");
console.log("`_empty` is", isset _empty ? "seted" : "empty");
// `clone` operator
Array _first = [584], _second = clone _first;
_first.push(404);
console.log("`_first`:",_first,"`_second`:",_second);
// Binary operators
// `pow` operator
console.log("5 ** 3 =", 5 ** 3);
// `modulo` operator
console.log("10 %% 4 = ", 10 %% 4);
// `isset` conditional assigment
int a, b = 4;
console.log("`a` is", a, ", now `a` is", a ?= b);
console.log("`a` is", a, ", now `a` still", a ?= 584);
// `isset` binary conditional
int x, y = 5;
console.log("`x` is", x, ", `y` is", y, ", x ? y = ", x ? y), x = 1;
console.log("`x` is", x, ", `y` is", y, ", x ? y = ", x ? y);
// `is` operator
console.log("'hello'", "hello" is String ? "is" : "isnt", "`String`");
// `isnt` operator
console.log("'goodby'", "goodby" isnt Number ? "isnt" : "is", "`Number`");
// Boolean alternatives
console.log("`yes` and `no`", yes is Boolean && no is Boolean ? "is" : "isnt", "`Boolean`");
console.log("`on` and `off`", on is Boolean && off is Boolean ? "is" : "isnt", "`Boolean`");
// Strings
// New quotes symbol, multi-lining and templating
console.log(` console.log(`
Hello! Hello!
My name is ColaScript, and i know who you are }:-> My name is ColaScript, and i know who you are }:->
@{navigator.userAgent} User agent: @{navigator.userAgent}
Vendor: {{navigator.vendor}}
`); `);
console.log("pow:", 5 ** 2, "; modulo:", 5 %% 3, ";"); // Raw strings
console.log(r"\n \r \t some@email.ru");
Number a = 3.14, b = 584, c; // Multiline RegExp's
a ?= b; console.log(a);
a = undefined;
a ?= b; console.log(a);
console.log(a = c ? b);
c = 404;
console.log(a = c ? b);
b = undefined;
Array x, y;
x = [123];
y = clone x;
y[] = 321;
console.log('original:',x,'cloned:',y, y[]);
y[0..1] = [1..10];
console.log(y[0..4]);
y.forEach((val) => console.log(val));
console.log("a is {{isset a ? 'set' : 'undefiend'}}, b is {{b?? ? 'set' : 'undefined'}}");
console.log(`is:`, location.href is String, `; isnt:`, 123 isnt Number, ";");
if(yes === true && on === true && no === false && off === false) console.log('Boolean alternatives');
console.log('Raw string:', r`@test \n \t \r`);
RegExp isEmail = / RegExp isEmail = /
([\w-\.]+) ([\w-\.]+)
@ @
((?:[\w]+\.)+) ((?:[\w]+\.)+)
([a-zA-Z]{2,4}) ([a-zA-Z]{2,4})
/, email = r'danon0404@gmail.com'; /;
console.log("@email is email:", isEmail.test(email)); String email = r'some@email.ru';
console.log("@email {{ isEmail.test(email) ? "is" : "isnt" }} valid email adress");
// Arrays
// Empty getter and setter ( pushig )
Array arr = [2, 4, 8, 16, 32];
console.log("Last element of `arr` is", arr[]), arr[] = 64;
console.log("Now last element of `arr` is", arr[]);
// Splice assigment
arr[2..4] = [3, 2, 1];
console.log("`arr` is", arr);
// Range
console.log("`[0..10]` is", [0..10]);
// Calling function
console.log(Profile(
"Dan", "Green",
"HTML5", "JavaScript", "Dart", "PHP", "CSS3", "LESS", "Qt",
age : 19,
petName : "Felix"
));
} }
main();</textarea> // Functions
// Named, positional and splated arguments, with default values.
// Arrow functions.
Object Profile(String firstName, String secondName, String country = "Russia", Array skills..., age:, petName: "Tux"){
skills.forEach((val) => val == "JavaScript" && console.log("JavaScript - It Awesome!"));
return {
firstName : firstName,
secondName : secondName,
age : age,
country : country,
skills : skills,
petName : petName
};
}
</textarea>
<textarea id="translation"></textarea> <textarea id="translation"></textarea>
<textarea id="result"></textarea> <textarea id="result"></textarea>
<div id="controls"> <div id="controls">
@ -124,6 +183,8 @@ main();</textarea>
<button id="benchmark" onclick="benchmark()">Benchmark</button> <button id="benchmark" onclick="benchmark()">Benchmark</button>
<input type="checkbox" id="is_js" onclick="compile()"> <input type="checkbox" id="is_js" onclick="compile()">
<label for="is_js">js parser</label> <label for="is_js">js parser</label>
<input type="checkbox" id="main_binding" onclick="compile()">
<label for="main_binding">`main` binding</label>
<span id="lenstat"></span> <span id="lenstat"></span>
</div> </div>
</body> </body>
@ -132,16 +193,19 @@ main();</textarea>
translationArea = document.getElementById("translation"), translationArea = document.getElementById("translation"),
resultArea = document.getElementById("result"), resultArea = document.getElementById("result"),
isjs = document.getElementById("is_js"), isjs = document.getElementById("is_js"),
mainbinding = document.getElementById("main_binding"),
source; source;
if(!localStorage.source) localStorage.source = source = sourceArea.value; if(!localStorage.source) localStorage.source = source = sourceArea.value;
else sourceArea.value = source = localStorage.source; else sourceArea.value = source = localStorage.source;
isjs.checked = localStorage.isjs == "t"; isjs.checked = localStorage.isjs == "t";
mainbinding.checked = localStorage.mainbinding == "t";
function compile(){ function compile(){
source = sourceArea.value; source = sourceArea.value;
localStorage.source = source; localStorage.source = source;
localStorage.isjs = isjs.checked ? "t" : "f"; localStorage.isjs = isjs.checked ? "t" : "f";
localStorage.mainbinding = mainbinding.checked ? "t" : "f";
stream = new Cola.OutputStream({ beautify : true }); stream = new Cola.OutputStream({ beautify : true });
compressor = new Cola.Compressor({ is_js : isjs.checked }); compressor = new Cola.Compressor({ is_js : isjs.checked });
@ -149,7 +213,7 @@ main();</textarea>
try { try {
// 1. compile // 1. compile
ast = Cola.parse(source, { is_js : isjs.checked }); ast = Cola.parse(source, { is_js : isjs.checked });
if(!isjs.checked) ast = ast.toJavaScript({ main_binding : false }); if(!isjs.checked) ast = ast.toJavaScript({ main_binding : mainbinding.checked });
ast.print(stream); ast.print(stream);
translationArea.value = stream.toString(); translationArea.value = stream.toString();
@ -176,13 +240,9 @@ main();</textarea>
} }
function benchmark(){ function benchmark(){
console.time("Uncompressed"); console.time("ColaScript");
eval(translationArea.result);
console.timeEnd("Uncompressed");
console.time("Compressed");
eval(resultArea.result); eval(resultArea.result);
console.timeEnd("Compressed"); console.timeEnd("ColaScript");
} }
function exec(){ function exec(){

View File

@ -469,7 +469,7 @@ Cola.Tokenizer.prototype.read_string = Cola.Tokenizer.with_eof_error("Unterminat
} else } else
this.S.string.at[this.S.string.level].quote = quote; this.S.string.at[this.S.string.level].quote = quote;
if (this.peek() == '@' || this.peek() == '{' && this.peek(1) == '{') return this.token("string", ""); if (this.peek() == '@' || this.peek() == '{' && this.peek(1) == '{') return this.token("string", ret);
} }
for (;;) { for (;;) {
@ -1432,7 +1432,7 @@ Cola.Parser.prototype.new_ = function() {
var newexp = this.expr_atom(false), args; var newexp = this.expr_atom(false), args;
if (this.is("punc", "(")) { if (this.is("punc", "(")) {
this.next(); this.next();
args = this.expr_list(")"); args = this.expr_list(")", false, false, !this.is_js);
} else { } else {
args = []; args = [];
} }

View File

@ -111,7 +111,7 @@ Cola.$_cola_array_range.i = 7;
Cola.$_cola_array_asplice = function $_cola_array_asplice(_array, _from, _to, _a){ Cola.$_cola_array_asplice = function $_cola_array_asplice(_array, _from, _to, _a){
_to = _to - _from + 1; _to = _to - _from + 1;
return [].splice.apply(_array, [_from, _to + 1].concat(_a)), _a; return [].splice.apply(_array, [_from, _to].concat(_a)), _a;
} }
Cola.$_cola_array_asplice.i = 8; Cola.$_cola_array_asplice.i = 8;