[JS][作品]前缀表达式转函数表达式

简介

[JS][作品]前缀表达式转函数表达式_第1张图片

相比于Eigenmath的函数表达式,我更爱scheme的前缀表达式。于是写个转换器。

算法非常简单。一个状态机,一个一个字符地看,将字符串转换成树,再将树转换回字符串。

复用性还是挺棒的,只是输出的代码很丑。而且,要把转换出的代码拿到Eigenmath上运行,可能要写几个函数包装中缀运算符(plus,minus,pow……)。

源码

<meta charset='utf-8'>
<style type="text/css">
    table, textarea {
        width: 100%;
        height: 100%;
    }
</style>

<table>
    <tr>
        <td>
            <textarea onkeydown='if(event.keyCode==13)enter(this.value, document.getElementById("o"))'>前缀表达式转函数表达式。在这里输入表达式,按回车,结果会出现在右边。21Jau2016</textarea>
        </td>
        <td>
            <textarea id='o' disabled='disabled'></textarea>
        </td>
    </tr>
</table>

<script type="text/javascript">
    function enter(r, o) {
        var root='me';
        function Node(m) {
            this.ma = m;
            this.v = [];
            this.toString = function(){
                var s = this.v.shift();
                s += '(';
                for (var i in this.v) {
                    if (i != 0) s += ',';
                    s += this.v[i].toString();
                }
                s += ')';
                return s;
            };
        }

        var node=new Node(root);
        var s='';
        r=r.split('');

        for (var i in r) {
            switch (r[i]) {
                case '(':
                    var n = new Node(node);
                    node.v.push(n);
                    node = n;
                    break;
                case ')':
                    if (s != '') {
                        node.v.push(s);
                        s = '';
                    }
                    node = node.ma;
                    break;
                case '\n':
                case '\t':
                case ' ':
                    if (s != '') {
                        node.v.push(s);
                        s = '';
                    }
                    break;
                default:
                    s = s + r[i];
            }
        }
        node = node.v[0];

        o.value = node.toString();
    }
</script>

你可能感兴趣的:([JS][作品]前缀表达式转函数表达式)