1.0.4 • Published 2 years ago

antlr4-formula v1.0.4

Weekly downloads
-
License
ISC
Repository
-
Last release
2 years ago

一个基于antlr4的前端公式校验器

内置提供了一些简单的公式定义,主要用于校验公式是否合法

使用

let inputStream = new antlr4Formula.InputStream(str)
let formulaLexer = new BailSimpleLexer(inputStream);
formulaLexer.removeErrorListeners();
let commonTokenStream = new antlr4Formula.CommonTokenStream(formulaLexer)
let formulaParser = new FormulaParser(commonTokenStream);
let exprContext = formulaParser.expr();
let FormulaParserVisitor = new FormulaParserVisitor();
let visit = formulaCheckVisitorImpl.visit(exprContext);

FormulaParserVisitor对象在执行visit方法时如果公式不合法将自动抛出异常,str为公式字符串 公式语法,参照源码中的FormulaParser.g4文件, 如需自定义实现校验器,则继承类FormulaParserVisitor然后重写内部的公式监听方法。 例如:

export default class MyFormulaCheckVisitorImpl extends FormulaParserVisitor {
    visitNumber(ctx) {
        // 自定义实现
    }
}

并且在使用时候将实现校验器进行替换

        // 替换前-》 let formulaCheckVisitorImpl = new FormulaCheckVisitorImpl();
        // 替换后
let formulaCheckVisitorImpl = new MyFormulaCheckVisitorImpl();
let visit = formulaCheckVisitorImpl.visit(exprContext);

注意:该库内部已经提前定义了一个FormulaCheckVisitorImpl执行器可直接使用, 如果仅仅是为了公式语法的校验,则没有必要实现FormulaParserVisitor或使用库中提前准备的FormulaCheckVisitorImpl, 这些类是当前端需要去执行一个公式才需要使用的!

关于异常处理器

该库提供了简单的异常处理,在使用时只需要捕获formulaCheckVisitorImpl.visit(exprContext); 的异常即可实现异常的监听并做自定义处理。

如需要自定义实现,则继承类FormulaLexer具体操作如下:

export default class MyBailSimpleLexer extends FormulaLexer {
    constructor(token) {
        super(token);
    }

    recover(re) {
        // 自定义实现
    }
}

并在使用时将BailSimpleLexer进行替换为MyBailSimpleLexer 如果在使用中出现了预期外的异常并且实现FormulaLexer无法捕获,则可以尝试下面另外一种方式进行处理 通过实现类FormulaParser进行处理,具体代码如下:

export default class FormulaErrorListener extends FormulaParser {
    constructor(token) {
        super(token);
    }

    notifyErrorListeners(msg, offendingToken, err) {
        // 自定义异常处理
    }
}

在实现上述的类以后还需要在使用时候将原有的对象进行替换以支持自定义异常

 // 替换前-》let formulaParser = new FormulaParser(commonTokenStream);
 // 替换后
let formulaParser = new FormulaErrorListener(commonTokenStream);

关于扩展开发

如果有上述的自定义处理需求可在package.json中devDependencies引入"antlr4": "^4.10.1"

{
  "devDependencies": {
    "antlr4": "^4.10.1"
  }
}

方便开发时候的引用提示

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago