GitHub release Build Status Coverage Status
A small tool for calculating first, follow and predict sets for the grammar. Its size is only 390 bytes (minified and gzipped). No dependencies. Size Limit controls the size.
$ npm install first-follow
You can try this tool here.
const firstFollow = require('first-follow'); const rules = [ // S -> a b A { left: 'S', right: ['a', 'b', 'A'] }, // A -> b c { left: 'A', right: ['b', 'c'] }, // A -> ε { left: 'A', right: [null] } ]; const { firstSets, followSets, predictSets } = firstFollow(rules); console.log(firstSets); /* * // S: a * // A: b, ε * * { * S: ['a'], * A: ['b', null] * } */ console.log(followSets); /* * // S: ┤ * // A: ┤ * * { * S: ['\u0000'], * A: ['\u0000'] * } */ console.log(predictSets); /* * // 1: a * // 2: b * // 3: ┤ * * { * '1': ['a'], * '2': ['b'], * '3': ['\u0000'] * } */
The grammar is represented by array of objects. Each object describes the only one rule. The rule's object contains two required fields:
left— specifies the left part of the rule. A single nonterminal:A,B,Program,Expression, etc.right— specifies the right part of the rule. It contains terminals and nonterminals or empty chain (epsilon):A + B,d * A,ε, etc.
- The
firstSetsobject's keys are nonterminals and values are first sets for these nonterminals. - The
followSetsobject's keys are nonterminals and values are follow sets for these nonterminals. - The
predictSetsobject's keys are rules numbers (starting from1) and values are predict sets for these rules.
- An empty chain (
ε) is represented bynull. - An end mark (
┤) is represented by\u0000.