(5,1)+(5,1)
((10,0),(2,0))
((5,1),7)+(5,1)
(((10,0),(1,0)),((8,0),(0,0)))
((5,1),7)*(5,1)
(((18,0),(5,0)),((40,0),(1,0)))
  <script>
  
  var pi = 3.14159265358979323846264338327950288419716939937510 ;
  var n = 10;
  var a = new Array (100);
  var k = 0;
  var i = 0;
  var lexj = 0;
  var lexi = 0;
  var j;
  
  
  var p = "5*x+2";
  p = "sin(2*pi*1*x)+1/2*sin(2*pi*x*3*pi/4)";
  p = "(5,1)+(5,1)";
  
  function Complex (re, im) {
    this.re = re;
    this.im = im;
  }
  
  
  function cmult (p, q) {    
    var a = p.re;
    var b = p.im
    var c = q.re;
    var d = q.im;
    var a2;
    var b2;
    var c2;
    var d2;
    
    
    if ((typeof (a) == 'number') && (typeof (b) == 'number') && (typeof (c) == 'number') && (typeof (d) == 'number')) 
        return new Complex (a*c-b*d, a*d + b*c);
    if (((typeof (a) == 'number')))
        a2 = new Complex (a, 0);
    else
        a2 = a;
    if (((typeof (b) == 'number')))
        b2 = new Complex (b, 0);
    else 
        b2 = b;
    if (((typeof (c) == 'number')))
        c2 = new Complex (c, 0);
    else 
        c2 = c;
    if (((typeof (d) == 'number'))) 
        d2 = new Complex (d, 0);
    else
        d2 = d;
        
    return new Complex(csub (cmult (a2, c2), cmult (b2, d2)), cadd (cmult (a2, d2), cmult (b2, c2)));
  }
  
  function cadd (p, q) {
    var a = p.re;
    var b = p.im
    var c = q.re;
    var d = q.im;
    var a2;
    var b2;
    var c2;
    var d2;
    
    if ((typeof (a) == 'number') && (typeof (b) == 'number') && (typeof (c) == 'number') && (typeof (d) == 'number'))  
        return new Complex (a + c, b + d);
    if (((typeof (a) == 'number')))
        a2 = new Complex (a, 0);
    else
        a2 = a;
    if (((typeof (b) == 'number')))
        b2 = new Complex (b, 0);
    else 
        b2 = b;
    if (((typeof (c) == 'number')))
        c2 = new Complex (c, 0);
    else 
        c2 = c;
    if (((typeof (d) == 'number')))
        d2 = new Complex (d, 0);
    else
        d2 = d;
    return new Complex (cadd (a2, c2), cadd (b2, d2));
  }

  function csub (p, q) {
    var a = p.re;
    var b = p.im
    var c = q.re;
    var d = q.im;
    var a2;
    var b2;
    var c2;
    var d2;

    if ((typeof (a) == 'number') && (typeof (b) == 'number') && (typeof (c) == 'number') && (typeof (d) == 'number')) 
        return new Complex (a - c, b - d);
    if (((typeof (a) == 'number')))
        a2 = new Complex (a, 0);
    else
        a2 = a;
    if (((typeof (b) == 'number')))
        b2 = new Complex (b, 0);
    else 
        b2 = b;
    if (((typeof (c) == 'number')))
        c2 = new Complex (c, 0);
    else 
        c2 = c;
    if (((typeof (d) == 'number')))
        d2 = new Complex (d, 0);
    else
        d2 = d;
    return new Complex (csub (a2, c2), csub (b2, d2));
  }


  function cdiv (p, q) {
    var a = p.re;
    var b = p.im
    var c = q.re;
    var d = q.im;
    var a2;
    var b2;
    var c2;
    var d2;

    if ((typeof (a) == 'number') && (typeof (b) == 'number') && (typeof (c) == 'number') && (typeof (d) == 'number')) 
        return new Complex ((a*c+b*d)/(c*c+d*d), (b*c-a*d)/(c*c+d*d));
    if (((typeof (a) == 'number')))
        a2 = new Complex (a, 0);
    else
        a2 = a;
    if (((typeof (b) == 'number')))
        b2 = new Complex (b, 0);
    else 
        b2 = b;
    if (((typeof (c) == 'number')))
        c2 = new Complex (c, 0);
    else 
        c2 = c;
    if (((typeof (d) == 'number')))
        d2 = new Complex (d, 0);
    else
        d2 = d;
    return new Complex (cdiv(cadd (cmult(a2, c2), cmult(b2, d2)), cadd(cmult(c2, c2), cmult (d2, d2))), cdiv (csub(cmult(b2, c2), cmult (a2, d2)), cadd(cmult (c2, c2), cmult (d2, d2))));
  }

  
  
  
  a = expr ();
    
    window.document.write (p + "
");
    output (a);
    
    lexj = 0;
    p = "((5,1),7)+(5,1)";
    window.document.write ("
" + p + "
");
    a = expr ();
    output (a);

    
    
        lexj = 0;
    p = "((5,1),7)*(5,1)";
    window.document.write ("
" + p + "
");
    a = expr ();
    output (a);

 function output (a) {
    window.document.write ('(');
    if (typeof (a.re) == 'number')
        window.document.write (a.re);
    else
        output (a.re)
    window.document.write (',');
    if (typeof (a.im) == 'number')
        window.document.write (a.im);
    else
        output (a.im);
    window.document.write (')');
 }
    
  
  var lexj;
  
  function expr () {
    var x;
    var y;
    x = term ();
    y = expr2 ();
    return cadd(x,y);
  }
  
  function expr2 () {
    var x;
    var y;
    
    if(p.charAt(lexj) == '+') {
        lexj++;
        x = term ();
        y = expr2 ();
        return cadd(x, y);
    }
    else if(p.charAt(lexj) == '-') {
        lexj++;
        x = term ();
        y = expr2 ();
        return csub(x, y);
    }
    else  
        return new Complex (0, 0);

  }

  
  function term () {
    var x;
    var y;
  
    x = factor ();
    y = term2 ();
    
    return cmult (x, y);

  }
  
  function term2 () {
    var x;
    var y;

    if(p.charAt(lexj) == '*') {
        lexj++;
        x = factor ();
        y = term2 ();
        return cmult(x, y);
    }
    else if(p.charAt(lexj) == '/') {
        lexj++;
        x = factor ();
        y = term2 ();
        return cdiv(y, x);
    }
    else {
        return new Complex (1, 0);
    }
  }

  
  function factor () {
     var z;
     var x;
     var y;
          
     if(p.charAt(lexj) == '(') {
        lexj++;
        x = expr ();
        if(p.charAt(lexj) == ')')
           lexj++;
        else if (p.charAt (lexj) == ',') {
            lexj++;
            y = expr ();
            if (p.charAt (lexj) == ')') {
                lexj++;
                return new Complex (x, y);
            }
            else
                parser_error ();
        }
        else
           parser_error();
        return x;
     }
     
    else if((p.charAt(lexj) == 's') && (p.charAt(lexj+1) == 'i') && (p.charAt(lexj+2) == 'n') && (p.charAt(lexj+3) == '(')) {
            lexj+=4;
            x = expr ();

            y = new Complex (Math.sin (x.re)*Math.cosh (x.im), Math.cos (x.re)*Math.sinh (x.im));
            if(p.charAt(lexj) == ')')
                lexj++;
            else
                parser_error();
            return y;
    }
    else if((p.charAt(lexj) == 'c') && (p.charAt(lexj+1) == 'o') && (p.charAt(lexj+2) == 's') && (p.charAt(lexj+3) == '(')) {
            lexj+=4;
            x = expr ();
            y = new Complex (Math.cos (x.re)*Math.cosh (x.im), Math.sin (x.re)*Math.sinh (x.im));
            if(p.charAt(lexj) == ')')
                lexj++;
            else
                parser_error();
            return y;
    }
    else if((p.charAt(lexj) >= 0) && (p.charAt(lexj) <= 9)) {
        x = new Complex (p.charCodeAt(lexj)-48, 0);
        lexj ++;
        return x;
    }
    /*else if (p.charAt (lexj) == 'x') {
        lexj++;
        x = new Complex (Math.cos (1/2*pi), Math.sin (1/2*pi));
        return x;
    }*/
    else if((p.charAt(lexj) == 'p') && (p.charAt(lexj+1) == 'i')) {
            lexj+=2;
            return new Complex (pi, 0);
    }
    else
        parser_error();
  }
  
  function parser_error() {
    alert("Parser Error");
    exit ();
}
 
   var x = document.getElementById ("myscript");
  var content = myscript.innerHTML;
  content = content.replace ("<", "<");
  content = content.replace (">", ">");
  content = content.replace(/(?:\r\n|\r|\n)/g, '
');
  content = content.replace(/ /g, " "); 
  window.document.write (content);
  (5,1)+(5,1)
((10,0),(2,0))
((5,1),7)+(5,1)
(((10,0),(1,0)),((8,0),(0,0)))
((5,1),7)*(5,1)
(((18,0),(5,0)),((40,0),(1,0)))