You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
2.2 KiB
48 lines
2.2 KiB
package com.fr.design.formula; |
|
|
|
import com.fr.design.formula.exception.FormulaExceptionTipsProcessor; |
|
import com.fr.design.i18n.Toolkit; |
|
import com.fr.parser.FRParser; |
|
import com.fr.script.checker.FunctionCheckerDispatcher; |
|
import com.fr.script.checker.result.FormulaCheckResult; |
|
import com.fr.script.checker.result.FormulaCoordinates; |
|
import com.fr.stable.StringUtils; |
|
import com.fr.stable.script.Expression; |
|
import com.fr.stable.script.Node; |
|
import com.fr.third.antlr.TokenStreamRecognitionException; |
|
|
|
import java.io.StringReader; |
|
|
|
/** |
|
* @author Hoky |
|
* @date 2021/9/28 |
|
*/ |
|
public class FormulaChecker { |
|
public static final String VALID_FORMULA = Toolkit.i18nText("Fine-Design_Basic_FormulaD_Valid_Formula"); |
|
public static final String INVALID_FORMULA = Toolkit.i18nText("Fine-Design_Basic_FormulaD_Invalid_Formula"); |
|
private static FormulaExceptionTipsProcessor processor = FormulaExceptionTipsProcessor.getProcessor(); |
|
|
|
public static FormulaCheckResult check(String formulaText) { |
|
if (StringUtils.isEmpty(formulaText) || formulaText.equals(Toolkit.i18nText("Fine-Design_Basic_FormulaPane_Tips"))) { |
|
return new FormulaCheckResult(true, VALID_FORMULA, FormulaCoordinates.INVALID, true); |
|
} |
|
//过滤一些空格等符号 |
|
StringReader in = new StringReader(formulaText); |
|
//此lexer为公式校验定制 |
|
FRFormulaLexer lexer = new FRFormulaLexer(in); |
|
FRParser parser = new FRParser(lexer); |
|
|
|
try { |
|
Expression expression = parser.parse(); |
|
Node node = expression.getConditionalExpression(); |
|
boolean valid = FunctionCheckerDispatcher.getInstance().getFunctionChecker(node).checkFunction(formulaText, node); |
|
return new FormulaCheckResult(valid, valid ? Toolkit.i18nText("Fine-Design_Basic_FormulaD_Valid_Formula") : |
|
Toolkit.i18nText("Fine-Design_Basic_FormulaD_Invalid_Formula"), FormulaCoordinates.INVALID, true); |
|
} catch (Exception e) { |
|
if (e instanceof TokenStreamRecognitionException) { |
|
return processor.getExceptionTips(((TokenStreamRecognitionException) e).recog); |
|
} |
|
return processor.getExceptionTips(e); |
|
} |
|
} |
|
}
|
|
|