sheva

0.0.3 • Public • Published

Sheva

Sheva is a Parser combinator library in JS.

Installation

npm install sheva

Example

  • Calculator
var parser = require("sheva")();

(function(){
	var And = parser.And.bind(parser)
	var Or = parser.Or.bind(parser)
	var MoreThan = parser.MoreThan.bind(parser)
	var Optional = parser.Optional.bind(parser)
	var Is = parser.Is.bind(parser)
	var Digit = parser.Digit.bind(parser)
	var $ = parser.$.bind(parser)
	
	parser.token({
		"LB": Is("("),
		"RB": Is(")"),
		"PLUS": Is("+"),
		"MINUS": Is("-"),
		"MUL": Is("*"),
		"DIV": Is("/"),
		"NUM": (function () {	
			var digits = MoreThan(0, Digit)
			var sign = Or(Is("-"), Is("+"))
			var dot = Is(".")
			return And(Optional(sign), digits, Optional(And(dot, digits)))
		})()
	})

  parser.grammar({
    "Expr": And($("Term"), Optional(MoreThan(0, $("MoreExpr")))),
    "MoreExpr": And($("TermOp"), $("Term")),
    "Term": And($("Factor"), Optional(MoreThan(0, $("MoreTerm")))),
    "MoreTerm": And($("FactorOp"), $("Factor")),
    "TermOp": Or(Is("PLUS"), Is("MINUS")),
    "Factor": Or($("P-Expr"), Is("NUM")),
    "P-Expr": And(Is("LB"), $("Expr"), Is("RB")),
    "FactorOp": Or(Is("MUL"), Is("DIV"))
  })

  parser.action({
    "NUM": function(n) { n.extra = parseFloat(n.value) },
    "Factor": function(n) { n.extra = n.children[0].extra },
    "MoreTerm": function (n) { n.extra = n.children[1].extra },
    "MoreExpr": function (n) { n.extra = n.children[1].extra },
    "P-Expr": function(n) { n.extra = n.children[1].extra },
    "Term": function(n) {
      n.extra = n.children[0].extra
      var child = n.children[1]
      for (var i = 0; child && i < child.children.length; i+=2) {
        var FactorOp = child.children[i]
        var Factor = child.children[i+1]

        switch (FactorOp.value) {
          case "*": n.extra *= Factor.extra;break;
          case "/": n.extra /= Factor.extra;break;
        }
      }
    },
    "Expr": function(n) {
      n.extra = n.children[0].extra
      var child = n.children[1]
      for (var i = 0; child && i < child.children.length; i+=2) {
        var TermOp = child.children[i]
        var Term = child.children[i+1]
        
        switch (TermOp.value) {
          case "+": n.extra += Term.extra;break;
          case "-": n.extra -= Term.extra;break;
        }
      }
    },
  })
    
  console.log(parser.parse("Expr", "(1+2)*(3+4+5)"))
})()

Author

miaoever

License

MIT

Readme

Keywords

none

Package Sidebar

Install

npm i sheva

Weekly Downloads

0

Version

0.0.3

License

MIT

Last publish

Collaborators

  • miaoever