From 6d6a22de1d8bc6a4faff1618e8202c65b9a42c32 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 15 Nov 2010 15:28:25 +0300 Subject: [PATCH] Projections & Initial grammar --- examples/.idea/modules.xml | 1 + examples/src/collections/IIterator.jetl | 6 +- grammar/grammar.iml | 12 ++++ grammar/src/class.grm | 50 +++++++++++++++ grammar/src/class_members.grm | 82 +++++++++++++++++++++++++ grammar/src/expressions.grm | 34 ++++++++++ grammar/src/lexical.grm | 5 ++ grammar/src/other.grm | 15 +++++ grammar/src/types.grm | 29 +++++++++ 9 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 grammar/grammar.iml create mode 100644 grammar/src/class.grm create mode 100644 grammar/src/class_members.grm create mode 100644 grammar/src/expressions.grm create mode 100644 grammar/src/lexical.grm create mode 100644 grammar/src/other.grm create mode 100644 grammar/src/types.grm diff --git a/examples/.idea/modules.xml b/examples/.idea/modules.xml index 4b3b58ae48d..cf95d722bf2 100644 --- a/examples/.idea/modules.xml +++ b/examples/.idea/modules.xml @@ -3,6 +3,7 @@ + diff --git a/examples/src/collections/IIterator.jetl b/examples/src/collections/IIterator.jetl index 31469b269b3..2ec8bc66cae 100644 --- a/examples/src/collections/IIterator.jetl +++ b/examples/src/collections/IIterator.jetl @@ -2,16 +2,16 @@ interface class IIterator { fun next() : T val hasNext : Boolean - fun toArray(buffer : WriteOnlyArray) : Int { // T is still an in-parameter + fun toArray(buffer : MutableArray) : Int { // T is still an in-parameter return fillBuffer(buffer, 0, buffer.size) } - fun toArray(buffer : WriteOnlyArray, from : Int, length : Int) : Int { // T is still an in-parameter + fun toArray(buffer : MutableArray, from : Int, length : Int) : Int { // T is still an in-parameter if (from < 0 || from > buffer.lastIndex || length < 0 || length > buffer.size - from) { throw IndexOutOfBoundsException(); } - if (len == 0) return 0; + if (len == 0) return 0 var count = 0; for (i in [from .. from + length - 1]) { diff --git a/grammar/grammar.iml b/grammar/grammar.iml new file mode 100644 index 00000000000..d5c07432750 --- /dev/null +++ b/grammar/grammar.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/grammar/src/class.grm b/grammar/src/class.grm new file mode 100644 index 00000000000..cde2a46c394 --- /dev/null +++ b/grammar/src/class.grm @@ -0,0 +1,50 @@ +/* + +internal class Example>(protected val x : Foo, y : Some) + : Bar(x), Foo by x, IAbstractSome by y.asAbstract() + where + T : Function +{ + // members +} + +*/ + +class + : classModifier* "class" SimpleName + ("<" typeParameter{","} ">")? + ("(" defaultConstructorParameter{","} ")")? + (":" delegationSpecifier{","})? + ("where" typeConstraint{","})? // Syntax is questionable + ("{" memberDeclaration{","} "}"? + ; + +classModifier + : accessModifier + : "abstract" + : "sealed" + ; + +delegationSpecifier + : constructorInvocation // type and constructor arguments + : explicitDelegation + ; + +explicitDelegation + : userType "by" expression // Syntax is questionable + ; + +typeParameter + : varianceAnnotation? SimpleName (":" userType)? + ; + +typeConstraint + : userType ":" userType + // other constraints, maybe + ; + +defaultConstructorParameter + : accessModifier? ("val" | "var")? parameter + ; + + diff --git a/grammar/src/class_members.grm b/grammar/src/class_members.grm new file mode 100644 index 00000000000..d78cdfdc423 --- /dev/null +++ b/grammar/src/class_members.grm @@ -0,0 +1,82 @@ +class Example(a : Foo, i : Int) : Bar(i), Some { + // constrtuctors: + public this(a : Foo) : this(a, 0) + + public this(a : Foo) : Bar(5), Some(a) { + // code + } + + // functions + abstract fun foo(a : Bar) + + fun foo(a : Bar) = 0 + + fun foo(a : Bar) = { + return 0 + } + + fun foo(a : Bar) { // return type is Unit + + // properties + val x : Int = 5 + var y : Double = 7.0d + var z : String = "SDfsdf" { + get() = $z + "sdfsd" + private set(s : String) { $z = s } // TODO: allow to omit the type here? + } +} + + +// h5. Grammar + +memberDeclaration + : constructor + : method + : property + : class //TODO : static +// : constant ??? + ; + +constructor + : accessModifier? "this" functionParameters (":" initializers) block + ; + +initializers + : "this" functionArguments + : constructorInvocation // type parameters may (must?) be omitted + ; + +super + : "super" "<" name ">" + ; + +method + : methodModifier* "fun" SimpleName functionParameters (":" type)? functionBody? + ; + +functionParameters + : "(" (parameter{","})? ")" + ; + +block + : "{" statements "}" + ; + +functionBody + : block + : "=" expression + ; + +property + : propertyModifier* ("val" | "var") SimpleName (":" type)? ("=" expression)? + "{" getter? setter? "}" + ; + +getter + : methodModifier* "get" "(" ")" functionBody + ; + +setter + : methodModifier* "set" "(" parameter ")" functionBody + ; + diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm new file mode 100644 index 00000000000..d769b947b02 --- /dev/null +++ b/grammar/src/expressions.grm @@ -0,0 +1,34 @@ +expression + : "new" constructorInvocation + : literalConstant + : functionLiteral + : tupleLiteral + : "null" + : binOpExpression + : unOpExpression + : name functionParameters? // ambiguity here + : FieldName + : if +// list comprehension + : jump + ; + +jump + : "throw" expression + : "return" expression + : "continue" SimpleName + : "break" SimpleName +// yield ? + ; + +tupleLiteral + : "(" expression{","} ")" + ; + +functionLiteral + : "{" (parameter | SimpleName)* "=>" expression "}" + ; + +constructorInvocation + : userType "(" expression{","} ")" + ; diff --git a/grammar/src/lexical.grm b/grammar/src/lexical.grm new file mode 100644 index 00000000000..26e8e971526 --- /dev/null +++ b/grammar/src/lexical.grm @@ -0,0 +1,5 @@ + + +SimpleName : /*java identifier*/; +FieldName : "$" SimpleName; +name : /*possibly qualified name*/; diff --git a/grammar/src/other.grm b/grammar/src/other.grm new file mode 100644 index 00000000000..bc4806ee703 --- /dev/null +++ b/grammar/src/other.grm @@ -0,0 +1,15 @@ +accessModifier + : "private" + : "protected" + : "public" + : "internal" + ; + +parameter + : SimpleName ":" type + // TODO: lazy, out, ref ... + ; + +functionArguments + : "(" (expression{","})* ")" + ; diff --git a/grammar/src/types.grm b/grammar/src/types.grm new file mode 100644 index 00000000000..cd01d0768e5 --- /dev/null +++ b/grammar/src/types.grm @@ -0,0 +1,29 @@ +/* + +Foo, T, Object> // user type +{A, Object => Foo} // function type +{ => Foo} // function with no arguments +(A, B, C) // tuple type +() // 0-ary tuple type (Unit) + +*/ + +type + : userType + : functionType + : tupleType + ; + +userType + : name ("<" type{","} ">")? + ; + +functionType + : "{" type{","} "=>" type "}" + ; + +tupleType + : "(" type"{","} ")" + ; + +