インタープリタを作る

#概要

インタープリタを作ってみた。
真理値表をプリントする、インタープリタを作って見た。

#出来ること。

真理値表を表示する。

#文法

コマンドは、make,init,nand,xor,and,orとrunの7個。
コマンドには引数がある。
コマンドと引数はスペース2個で区切る。

#コマンド

##make  3

3個の端子の真理値表を作る。

#init  0  1

０から１の端子を初期化する。

| |0|1|
|:--|:--|:--|
|1|0|0|
|2|1|0|
|3|0|1|
|4|1|1|

#and  0  1  2

端子０と端子１の論理和を端子２に出力する。

#run

真理値表を表示する。

| |0|1|2|
|:--|:--|:--|:--|
|1|0|0|0|
|2|1|0|0|
|3|0|1|0|
|4|1|1|1|

#サンプルコード


```
var src = document.getElementById("src");
var out = document.getElementById("out");
var c0;

class C {
	constructor(n) {
	  this.h = "";
	  this.n = n;
		this.s = [];
		var t = new Array(n);
		for (var i = 0; i < n; i++)
		{
		  t[i] = 0;
		}
		this.s.push(t);
		return this;
	}
	init(a, b) {
	  b = b + 1;
	  for (var i = a; i < b; i++)
		{
		  var t = [];
		  for (var j = 0; j < this.s.length; j++)
		  {
		    var u = this.s[j];
		    u[i] = 0;
		    t.push(u.slice());
		    u[i] = 1;
		    t.push(u);
		  }
		  this.s = t;
		}
	  return this;
	}
	xor(a, b, c) {
	  for (var j = 0; j < this.s.length; j++)
	  {
	    this.s[j][c] = this.s[j][a] ^ this.s[j][b];
	  }
	  return this;
	}
	nand(a, b, c) {
	  for (var j = 0; j < this.s.length; j++)
	  {
	     var s = this.s[j][a] & this.s[j][b];
	     if (s == 0)
	     {
	       this.s[j][c] = 1;
	     }
	     else
	     {
	       this.s[j][c] = 0;
	     }
	  }
	  return this;
	}
	nor(a, b, c) {
	  for (var j = 0; j < this.s.length; j++)
	  {
	     var s = this.s[j][a] | this.s[j][b];
	     if (s == 0)
	     {
	       this.s[j][c] = 1;
	     }
	     else
	     {
	       this.s[j][c] = 0;
	     }
	  }
	  return this;
	}
	not(a, b) {
	  for (var j = 0; j < this.s.length; j++)
	  {
	     var s = !this.s[j][a];
	     if (s == true)
	     {
	       this.s[j][b] = 1;
	     }
	     else
	     {
	       this.s[j][b] = 0;
	     }
	  }
	  return this;
	}
	and(a, b, c) {
	  for (var j = 0; j < this.s.length; j++)
	  {
	    this.s[j][c] = this.s[j][a] & this.s[j][b];
	  }
	  return this;
	}
	or(a, b, c) {
	  for (var j = 0; j < this.s.length; j++)
	  {
	    this.s[j][c] = this.s[j][a] | this.s[j][b];
	  }
	  return this;
	}
	get() {
	  return this.s;
	}
	table() {
    this.h += '<table>';
    for (var row = 0; row < this.s.length + 1; row++)
    {
    	this.h +='<tr>';
    	for (var col = 0; col < this.n + 1; col++)
    	{
    		if (col === 0 && row === 0)
    		{
    			this.h += '<th>&nbsp;<\/th>';
  	  	}
    		else if (col === 0 && row !== 0)
	    	{
		    	this.h += '<th>' + row + '<\/th>';
		    }
	    	else if (row === 0)
	    	{
		    	this.h += '<th>' + (col - 1) + '<\/th>'; 
	     	}
	    	else
	    	{
		    	var v = this.s[row - 1][col- 1];
			    this.h += '<td>' + v + '<\/td>';
		    }
	    }
	    this.h += '<\/tr>';
    }
    this.h += '<\/table>';
    document.getElementById('out').innerHTML = this.h;
	}
}

function isDecimal(operator) {
   var fc = operator.charAt(0);
   if (fc == "-")
   {
     return true;
   }
   else if (fc < '0') return false;
   else if (fc > '9') return false;
   return true;
}

function run() {
  //alert(src.value);
  var str = src.value;
  var code = str.split("  ");
  if (isDecimal(code[0]))
  {
    alert("ok");
  }
  else
  {
    switch (code[0])
    {
    case "new":
      alert("new");
    break;
    case "list":

    break;
    case "run": 
      c0.table();
    break;
    case "make":
      var a = parseInt(code[1]);
      c0 = new C(a);
      out.innerHTML = "ok make";
    break;
    case "init":
      var a = parseInt(code[1]);
      var b = parseInt(code[2]);
      c0.init(a, b);
      out.innerHTML = "ok init";
    break;
    case "nand":  
      var a = parseInt(code[1]);
      var b = parseInt(code[2]);
      var c = parseInt(code[3]);
      c0.nand(a, b, c);
      out.innerHTML = "ok nand";
    break;
    case "xor":  
      var a = parseInt(code[1]);
      var b = parseInt(code[2]);
      var c = parseInt(code[3]);
      c0.xor(a, b, c);
      out.innerHTML = "ok xor";
    break;
    case "and":  
      var a = parseInt(code[1]);
      var b = parseInt(code[2]);
      var c = parseInt(code[3]);
      c0.and(a, b, c);
      out.innerHTML = "ok and";
    break;
    case "or":  
      var a = parseInt(code[1]);
      var b = parseInt(code[2]);
      var c = parseInt(code[3]);
      c0.or(a, b, c);
      out.innerHTML = "ok or";
    break;
    default:
      alert(code[0]);
    break;
    }
  }
  src.value = "";
}




```

#説明

##字句解析部

```
var code = str.split("  ");
```

##コマンド実行部

```

    switch (code[0])
    {
    case "new":
      ...
    break;
    case "list":
      ...
    break;
    case "run": 
      ...
    break;
    }
```
#成果物

https://embed.plnkr.co/plunk/O0HMsy5wya4yHTsy

以上。