JSFiddle - React, Tailwind, and code Playground

by xavierm02

JavaScript

[
        {
            name: 'Digit',
            rules: Or(
                '0',
                '1',
                '2',
                '3',
                '4',
                '5',
                '6',
                '7',
                '8',
                '9'
            )
        },
        {
            name: 'Number',
            rules: Repeat( Rule( 'Digit' ), '+' ).setAction( function( ) {
                return [].slice.call(arguments).join('');
            } )
        },
        {
            name: 'Expression',
            start: true,
            rules: Or(
                Rule( 'AdditiveExpression' )
            )
        },
        {
            name: 'AdditiveExpression',
            rules: Or(
                And(
                    Rule( 'MultiplicativeExpression' ).setLabel( 'left' ),
                    Or(
                        '+',
                        '-'
                    ).setLabel( 'operator' ),
                    Rule( 'AdditiveExpression' ).setLabel( 'right' )
                ).setAction( function ( ) {
                    var left = +this.left;
                    var right = +this.right;
                    var result = ( this.operator === '+' ) ? left + right : left - right;
                    return result + '';
                } ),
                Rule( 'MultiplicativeExpression' )
            )
        },
        {
            name: 'MultiplicativeExpression',
            rules: Or(
                And(
                    Rule( 'UnaryExpression' ).setLabel( 'left' ),
                    Or(
                        '*',
                        '/'
                    ).setLabel( 'operator' ),
                    Rule( 'MultiplicativeExpression' ).setLabel( 'right' )
                ).setAction( function ( ) {
                    var left = +this.left;
                    var right = +this.right;
                    var result = ( this.operator === '*' ) ? left * right : left / right;
                    return...