X++

X++ has just a bool and a stream to store values. X++ was invented in April 2008 by User:Feuermonster.
=== Instructions ===
(* may be 1 or 0)
(? may be a number from 0 to stream.len)
*Xor * 
:*bool = bool xor *
*Or * 
:*bool = bool or *
*And * 
:*bool = bool and *
*Not 
:*bool = not bool
*Addr 
:*adds the bool to the stream which is actually a string. stream = stream + (string)bool
*Addl 
:*adds the bool to the stream which is actually a string. stream = (string)bool + stream 
*Outc 
:*converts the stream to a number using binary representation. Then it prints the number as a character. (65=a)
*Outn 
:*converts the stream to a number using binary representation. Then it prints the number in decimal.
*Clear 
:*clears the stream
*Clear ?
:*removes stream[?] from the stream
*Get ? 
:*bool = stream[?]
*Set ? 
:*stream[?] = bool
*XGet ?1:?2
:*bool = stream[bintodec(stream[?1:?1+?2])]
*XSet ?1:?2
:*stream[bintodec(stream[?1:?1+?2])] = bool
*XClear ?1:?2
:*removes stream[bintodec(stream[?1:?1+?2])] from the stream
*In 
:*Input. (0 or 1) bool = (bool)input()
stream[?1:?1+?2] means the following:
Clear
Or 1
Addl
XClear 0:8
//This would convert stream[0] + stream[1] ... + stream[7] to a number using binary representation 
//In this case, it would remove the 128th element from the stream.
=== Loops ===
*[...] while(bool=0) { ... }
*(...) while(bool!=0) { ... }
*{...} while(stream.Length < 8) { ... }
=== Examples ===
Or 1
Addr
And 0
Addr
Or 1
Addr
Outn
This will print 101 as decimal -> 5.
Or 1
Set 1
And 0
Set 1
Set 2
Set 3
Set 4
Set 5
Or 1
Set 6
Outc
this will print 00100001 as character -> A
=== Implementation ===
Java implementation by User:Mafi with stream readers (use a for bit 0 in the stream, b=1, c=2 ... h=7). [now all loop types]
Note: You can't use Addl in this implementation!
import java.io.*;
class XppInterpreter {
 private static boolean actbool = false;
 private static boolean[] stream = new boolean[8];
 private static int streamlength = 0;
 
 private static final String CMD_XOR = "XOR _b_",
 CMD_OR = "OR _b_",
 CMD_AND = "AND _b_",
 CMD_NOT = "NOT",
 CMD_ADDR = "ADDR",
 CMD_OUTC = "OUTC",
 CMD_OUTN = "OUTN",
 CMD_CLEAR = "CLEAR",
 CMD_GET = "GET _i_",
 CMD_SET = "SET _i_",
 CMD_IN = "IN";
 private static final String[] varnames = {
 "A","B","C","D","E","F","G","H"
 };
 
 private static void initStream(){
 for(int i=0; i<=7; i++){
 stream[i] = false;
 }
 streamlength = 0;
 }
 
 private static void pushOnStream(boolean newb){
 for(int i=1; i<=7; i++){
 stream[i-1] = stream[i];
 }
 stream[7] = newb;
 streamlength++;
 if(streamlength>8)
 streamlength=8;
 }
 
 private static int streamToInt(){
 int t = 128, r = 0;
 for(int i=0; i<=7; i++){
 if(stream[i] == true){
 r += t;
 }
 t /= 2;
 }
 return(r);
 }
 
 private static String goBack(String code, String oldcode){
 return(oldcode.substring(oldcode.length()-code.length()-1));
 }
 
 public static void interpret(String code){
 initStream();
 actbool = false;
 
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
 code = code.toUpperCase();
 String oldcode = code;
 boolean noelse = false; //continue
 
 while(code.length() > 0){
 noelse = false;
 //simple Befehle / simple Commands
 //not
 if(code.startsWith(CMD_NOT)){
 actbool = !actbool;
 code = code.substring(CMD_NOT.length());
 noelse = true;
 }
 //addr
 if(code.startsWith(CMD_ADDR)){
 pushOnStream(actbool);
 code = code.substring(CMD_ADDR.length());
 noelse = true;
 }
 //outc
 if(code.startsWith(CMD_OUTC)){
 System.out.print((char) streamToInt());
 code = code.substring(CMD_OUTC.length());
 noelse = true;
 }
 //outn
 if(code.startsWith(CMD_OUTN)){
 System.out.print(streamToInt());
 code = code.substring(CMD_OUTN.length());
 noelse = true;
 }
 //clear
 if(code.startsWith(CMD_CLEAR)){
 initStream();
 code = code.substring(CMD_CLEAR.length());
 noelse = true;
 }
 //in
 if(code.startsWith(CMD_IN)){
 try{
 actbool = ((char)br.read() == ' ');
 }catch(Exception ex){
 actbool = false;
 }
 code = code.substring(CMD_IN.length());
 noelse = true;
 }
 //Bool-Funktionen / bool functions
 for(int i=0; i<=9; i++){
 //true or false
 if(i <= 1) {
 //xor
 if( code.startsWith(CMD_XOR.replace("_b_",""+i)) ){
 actbool = actbool ^ (1 == i);
 code = code.substring(CMD_XOR.length()-2);
 noelse = true;
 }
 //or
 if( code.startsWith(CMD_OR.replace("_b_",""+i)) ){
 actbool = actbool | (1 == i);
 code = code.substring(CMD_OR.length()-2);
 noelse = true;
 }
 //and
 if( code.startsWith(CMD_AND.replace("_b_",""+i)) ){
 actbool = actbool & (1 == i);
 code = code.substring(CMD_AND.length()-2);
 noelse = true;
 }
 }else{ //stream readers
 String var = varnames[i-2];
 //xor
 if( code.startsWith(CMD_XOR.replace("_b_",var)) ){
 actbool = actbool ^ stream[i-2];
 code = code.substring(CMD_XOR.length()-2);
 noelse = true;
 }
 //or
 if( code.startsWith(CMD_OR.replace("_b_",var)) ){
 actbool = actbool | stream[i-2];
 code = code.substring(CMD_OR.length()-2);
 noelse = true;
 }
 //and
 if( code.startsWith(CMD_AND.replace("_b_",var)) ){
 actbool = actbool & stream[i-2];
 code = code.substring(CMD_AND.length()-2);
 noelse = true;
 }
 }
 }
 //Index-Funktionen / index functions
 for(int i=0; i<=7; i++){
 //get
 if( code.startsWith(CMD_GET.replace("_i_",""+i)) ){
 actbool = stream[i];
 code = code.substring(CMD_GET.length()-2);
 noelse = true;
 }
 //set
 if( code.startsWith(CMD_SET.replace("_i_",""+i)) ){
 stream[i] = actbool;
 code = code.substring(CMD_SET.length()-2);
 noelse = true;
 }
 }
 //Schelife/loop
 //[...]
 if(code.startsWith("[") && actbool == false){
 int inside = 1;
 while(inside >= 1){
 code = code.substring(1);
 if(code.startsWith("[")) inside++;
 if(code.startsWith("]")) inside--;
 }
 }
 if(code.startsWith("]") && actbool == true){
 int inside = 1;
 while(inside >= 1){
 code = goBack(code,oldcode);
 if(code.startsWith("[")) inside--;
 if(code.startsWith("]")) inside++;
 }
 }
 //(...)
 if(code.startsWith("(") && actbool == true){
 int inside = 1;
 while(inside >= 1){
 code = code.substring(1);
 if(code.startsWith("(")) inside++;
 if(code.startsWith(")")) inside--;
 }
 }
 if(code.startsWith(")") && actbool == false){
 int inside = 1;
 while(inside >= 1){
 code = goBack(code,oldcode);
 if(code.startsWith("(")) inside--;
 if(code.startsWith(")")) inside++;
 }
 }
 //{...}
 if(code.startsWith("{") && streamlength >= 8){
 int inside = 1;
 while(inside >= 1){
 code = code.substring(1);
 if(code.startsWith("{")) inside++;
 if(code.startsWith("}")) inside--;
 }
 }
 if(code.startsWith("}") && streamlength < 8){
 int inside = 1;
 while(inside >= 1){
 code = goBack(code,oldcode);
 if(code.startsWith("{")) inside--;
 if(code.startsWith("}")) inside++;
 }
 }
 //sonst... / else...
 if(noelse==false)
 code = code.substring(1); //...ein Zeichen wegmachen / ...remove one char
 }
 }
 
 public static void main(String[] args){
 interpret("or 1 [addr xor a ] outn"); //255
 }
}
Category:Implemented 
Category:Languages
Category:2008