0.2.1 • Published 1 year ago

@cjting/logic-parser v0.2.1

Weekly downloads
-
License
ISC
Repository
github
Last release
1 year ago

Logic Parser

A simple library to parse logic expression to AST.

Install && Use

The package is on NPM and in CJS format: npm install @cjting/logic-parser

import LogicParser from '@cjting/logic-parser'

// @param unitRegexp: a regexp to define what unit is like
const parser = new LogicParser(/\d+/)

// return AST if input is valid, throw error otherwise
parser.parse('1 && 2 || !3')

// `left` and `right` are either object or simple strings captured by `unitRegexp`
/*
{
  type: 'or',
  left: {
    type: 'and',
    left: '1',
    right: '2',
  },
  right: {
    type: 'not',
    op: '3',
  },
}
*/

Grammar

Formal definition:

# _ means arbitrary amount of whitespace
expr -> expr _ "||" _ term | term
term -> term _ "&&" _ not | not
not -> "!" _ not | factor
factor -> unit | "(" _ expr _ ")"

unit is user defined token, it can be anything defined by a regexp.

Based on the grammar, we can know that

  • operator precedence: ! > && > ||
  • both && and || are left associative

Examples (suppose unit=\d+):

  • 1
  • 1 && !2
  • 1 && 2 && 3
  • 1 && 2 || 3
  • 1 && (2 || !3)
  • !!1
  • 1 && !(2 || 3 && 4 || 5)

Dev

  • Write grammar in lib/logic.ne
  • pnpm run gen generates grammar file
  • Copy lib/logic.js into lib/logic.modified.js and then modify it to support passing of unit regexp
0.2.1

1 year ago

0.2.0

1 year ago

0.1.1

3 years ago

0.1.0

3 years ago