364 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			364 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
class ##ERROR: syntax error - incomplete defintion of unnamed class for 'class'
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class B ##ERROR: syntax error - incomplete definition of 'B' for 'class'
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class B ( ##ERROR: syntax error - block expression expected as 'class' body
 | 
						|
)
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class B + ##ERROR: syntax error - prohibited binary selector '+'
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class A {
 | 
						|
	var a
 | 
						|
	| j | ##ERROR: syntax error - variable declaration disallowed
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class 10 { ##ERROR: syntax error - invalid class name '10' for 'class'
 | 
						|
	var a
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class class { ##ERROR: syntax error - invalid class name 'class' for 'class'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class super.a { ##ERROR: syntax error - invalid class name 'super.a' for 'class'
 | 
						|
	var a
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class a: 20 { ##ERROR: syntax error - invalid superclass name '20' after ':' for 'class'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class a: class { ##ERROR: syntax error - invalid superclass name 'class' after ':' for 'class'
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class a: #(1 2) { ##ERROR: syntax error - no valid superclass name after ':' for 'class'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
J := 11
 | 
						|
class B {
 | 
						|
	if (== J 10) {
 | 
						|
		fun[#ci] newA() {  ##ERROR: syntax error - function 'newA' defined with 'fun' prohibited in class initialziation context
 | 
						|
			return self
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		fun[#ci] newB() {
 | 
						|
			return self
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
##t2 := (B:newB)
 | 
						|
##t1 := (B:newA) ##error: exception not handled - "unable to send newA to B - 'newA' not found in B"
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class B {
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
J := 11
 | 
						|
if (== J 10) {
 | 
						|
	fun[#ci] B:newA() {
 | 
						|
		return self
 | 
						|
	}
 | 
						|
} else {
 | 
						|
	fun[#ci] B:newB() {
 | 
						|
		return self
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
t2 := (B:newB)
 | 
						|
t1 := (B:newA) ##ERROR: exception not handled - "unable to send newA to B - 'newA' not found in B"
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class B {
 | 
						|
	var x
 | 
						|
	if (x > 0) { ##ERROR: syntax error - prohibited access to instance variable around 'x'
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class B {
 | 
						|
	self.x := 20 ##ERROR: syntax error - unknown class-level variable name 'self.x'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class B {
 | 
						|
	var x y
 | 
						|
};
 | 
						|
 | 
						|
class X: B {
 | 
						|
	var a b
 | 
						|
	fun[#ci] new(t) {
 | 
						|
		| a |
 | 
						|
		set self.a t;
 | 
						|
		set a 100;
 | 
						|
		set self.b (* t 2);
 | 
						|
 | 
						|
		set self.c (fun(b) {  ##ERROR: syntax error - unknown class-level variable name 'self.c'
 | 
						|
			printf "xxxx [%d]\n" b;
 | 
						|
		});
 | 
						|
		return self;
 | 
						|
	};
 | 
						|
 | 
						|
	fun print() {
 | 
						|
		self.c (+ self.a self.b);
 | 
						|
		printf "a=%d b=%d\n" self.a self.b;
 | 
						|
	}
 | 
						|
};
 | 
						|
	
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class X {
 | 
						|
	fun[#ci] xxx() {
 | 
						|
		return X;
 | 
						|
	}
 | 
						|
 | 
						|
	fun[#ci] qqq() {
 | 
						|
		return "hello"
 | 
						|
	}
 | 
						|
 | 
						|
	fun String:length()  { ##ERROR: syntax error - class name 'String' before :'length' prohibited in class initialization context
 | 
						|
		return (core.basicSize self)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
class X {
 | 
						|
	fun[#ci] xxx() {
 | 
						|
		return X;
 | 
						|
	}
 | 
						|
	fun[#ci] qqq() {
 | 
						|
		return "hello"
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
## this triggers a runtime error as J isn't a class name
 | 
						|
fun J:ccc()  { ##ERROR: exception not handled - "J accessed without initialization"
 | 
						|
	return 999
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
X := 20
 | 
						|
 | 
						|
## this also raises a runtime error as X isn't a class name
 | 
						|
fun X:xxx() { ##ERROR: exception not handled - "not class"
 | 
						|
	return self
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## this must not be very useful as Array is an index item
 | 
						|
## and the clase instantiation method can't specify the size
 | 
						|
## you can't place an item in the arrya at all.
 | 
						|
 | 
						|
fun[#ci] Array:boom() {
 | 
						|
	core.basicAtPut self 0 10 ##ERROR: exception not handled - "position(0) out of range - negative or greater than or equal to 0"
 | 
						|
	printf "%O" self
 | 
						|
	return self
 | 
						|
}
 | 
						|
Array:boom
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class X {
 | 
						|
	var a b c
 | 
						|
	fun[#ci] new () {
 | 
						|
		self.a := 20
 | 
						|
		return self
 | 
						|
	}
 | 
						|
 | 
						|
	fun getA() { return self.a }
 | 
						|
}
 | 
						|
 | 
						|
## the instance variables are not accessible in out-of-class method
 | 
						|
## defintionas there isn't a good way to know the class structure
 | 
						|
## as X isn't known in advance and can point to anything
 | 
						|
fun X:get_a() {
 | 
						|
	return self.a ##ERROR: syntax error - not allowed to prefix with self
 | 
						|
}
 | 
						|
 | 
						|
printf "%d\n" ((X:new):get_a)
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class F {
 | 
						|
	var a b c
 | 
						|
}
 | 
						|
 | 
						|
class X {
 | 
						|
	var a b c 
 | 
						|
	fun oh() {
 | 
						|
		fun F:get_a() {
 | 
						|
			return super.a ##ERROR: syntax error - not allowed to prefix with super
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class F {
 | 
						|
}
 | 
						|
 | 
						|
class F { ##ERROR: exception not handled - "prohibited redefintion of F
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class F {
 | 
						|
}
 | 
						|
 | 
						|
F := 30 ##ERROR: exception not handled - "prohibited redefintion of F
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
 | 
						|
class F {
 | 
						|
}
 | 
						|
 | 
						|
F := (class { ##ERROR: exception not handled - "prohibited redefintion of F"
 | 
						|
})
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
F := (class {
 | 
						|
})
 | 
						|
 | 
						|
F := (class F { ##ERROR: exception not handled - "prohibited redefintion of F"
 | 
						|
})
 | 
						|
 | 
						|
##  TDOO: do we need to allow this?
 | 
						|
##F := 30
 | 
						|
##class F { ##E R R O R: exception not handled - "prohibited redefintion of F"
 | 
						|
##}
 | 
						|
 | 
						|
 | 
						|
---
 | 
						|
class a {
 | 
						|
	fun() { ##ERROR: syntax error - unnamed function defined with 'fun' prohibited in class initialziation context
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class X10 {
 | 
						|
	var x
 | 
						|
     fun[#ci] make() { x := 1234; return self; };
 | 
						|
     fun get-x() { return x };
 | 
						|
}
 | 
						|
 | 
						|
X11 := (class:X10 {
 | 
						|
})
 | 
						|
 | 
						|
class X11 { ##ERROR: exception not handled - "prohibited redefintion of X11"
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class String { ##ERROR: exception not handled - "incompatible redefintion of String"
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class[] { ##ERROR: syntax error - empty attribute list on unnamed class for 'class'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class[] Kuduro { ##ERROR: syntax error - empty attribute list on 'Kuduro' for 'class'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class[#byte #limited #char] Kuduro { ##ERROR: syntax error - conflicting or duplicate class attribute name '#char'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
class[#byte #limited #final #limited] Kuduro { ##ERROR: syntax error - conflicting or duplicate class attribute name '#limited'
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
---
 | 
						|
class[#byte #bytes] Kuduro { ##ERROR: syntax error - unrecognized class attribute name '#bytes'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
class Kuduro (a b c) {
 | 
						|
	var d e
 | 
						|
	var a  ##ERROR: syntax error - duplicate instance variable name 'a'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class Kuduro (a (b) c) {
 | 
						|
	var d e
 | 
						|
	var b ##ERROR: syntax error - duplicate instance variable name 'b'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class Kuduro (a (b) c) {
 | 
						|
	var d e
 | 
						|
	var(#class) b ##ERROR: syntax error - duplicate class variable name 'b'
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## TODO: some of these can be detected as an error at the compile time..
 | 
						|
 | 
						|
class[#b] X (a) {
 | 
						|
	fun[#ci] new() {
 | 
						|
		## the instance variable is a byte because the class is a byte-oriented class
 | 
						|
		self.a := -20 ##ERROR: exception not handled - "negative number - -20"
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
X:new
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
class[#b] X (a) {
 | 
						|
	fun[#ci] new() {
 | 
						|
		## the instance variable is a byte because the class is a byte-oriented class
 | 
						|
		self.a := -20 ##ERROR: exception not handled - "negative number - -20"
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
class Y: X { ##ERROR: exception not handled - "incompatible byte superclass X with oop class"
 | 
						|
}
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
## you can't send a binary message to an object the receiver:message syntax.
 | 
						|
## you must omit the colon for the binary message
 | 
						|
## it must be '20 == 40'
 | 
						|
 | 
						|
fun Number:==(b) { return (core.+ self b) }
 | 
						|
20 :== 40  ##ERROR: syntax error - prohibited binary selector '=='
 |