mr-parser

parses mathematical expressions and outputs an AST that represents the expression

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
mr-parser
600.2.19 years ago9 years agoMinified + gzip package size for mr-parser in KB

Readme

mr-parser
!Build Statustravis-imagetravis-url !npmnpm-imagenpm-url !Coverage Statuscoveralls-imagecoveralls-url !Stabilitystability-image
js-standard-style
Parses mathematical expressions and outputs an AST


- why? - Grammar - Parser = require('mr-parser').Parser
- [`Parser.parse(expression)`](#parserparseexpression)

Description

mr-parser is a lightweight mathematical parser inspired by math.js expression parsermath-js, unlike math.js expression parsermath-js the AST nodes contain no info on how to compile a node which makes the parser modular

why?

I felt that I had to make another parser because:
  • math-parser is too simple for me, it just operates on numbers and has the following operators +, -, *, / and ^ and doesn't have variable substitution
  • math.js expression parsermath-js is perfect but it's not modularized yet, to use it one would have to include all the source code of math.js
  • math.js expression parsermath-js AST nodes have info about how to compile a node, I think it's better to let another module do that

Grammar

program          : block (; block)*

block            : assignment

assignment       : ternary
                 | symbol `=` assignment

ternary          : logicalOR
                 | logicalOR `?` ternary `:` ternary

logicalOR        : logicalXOR
                 | logicalXOR (`||`,`or`) logicalOR

logicalXOR       : logicalAND
                 : logicalAND `xor` logicalXOR

logicalAND       : bitwiseOR
                 | bitwiseOR (`&&`,`and`) logicalAND

bitwiseOR        : bitwiseXOR
                 | bitwiseXOR `|` bitwiseOR

bitwiseXOR       : bitwiseAND
                 | bitwiseAND `^|` bitwiseXOR

bitwiseAND       : relational
                 | relational `&` bitwiseAND

relational       : shift
                 | shift (`!=` | `==` | `>` | '<' | '<=' |'>=') shift)

shift            : additive
                 | additive (`>>` | `<<` | `>>>`) shift

additive         : multiplicative
                 | multiplicative (`+` | `-`) additive

multiplicative   : unary
                 | unary (`*` | `/` | `%`) multiplicative
                 | unary symbol

unary            : pow
                 | (`-` | `+` | `~`) unary

pow              : factorial
                 | factorial (`^`, '**') unary

factorial        : symbol
                 | symbol (`!`)

symbol           : symbolToken
                 | symbolToken functionCall
                 | string

functionCall     : `(` `)`
                 | `(` ternary (, ternary)* `)`

string           : `'` (character)* `'`
                 : `"` (character)* `"`
                 | array

array            : `[` `]`
                 | `[` assignment (, assignment)* `]`
                 | number

number           : number-token
                 | parentheses

parentheses      : `(` assignment `)`
                 : end

end              : null-token

Install

$ npm install --save mr-parser

Usage

var Parser = require('mr-parser').Parser;
Parser.parse('1 * (2 + 3) * 4')

// returns
{
  blocks:[{
    op: '*',
    args: [{
      value: '1',
      valueType: 'number'
    }, {
      op: '*',
      args: [{
        op: '+',
        args: [
          { value: '2', valueType: 'number' },
          { value: '3', valueType: 'number' }
        ]
      }, {
        value: '4',
        valueType: 'number'
      }]
    }]
  }]
} 

Parser.parse('2x')

// returns
{
  blocks: [{
    op: '*',
    args: [
      { value: '2', valueType: 'number' },
      { name: 'x' }
    ]
  }]
}

API

Parser = require('mr-parser').Parser

Parser.parse(expression)

params
  • expression {string} the expression to be parsed

returns
  • Returns an array of possibly nested nodes which is the AST that represents the expression

2015 MIT © Mauricio Poppe()