如何检查字符串是否是正确的线性函数(数学)?
我使用Jfreechart库,其中需要一个线性函数来绘制图形。 Jfree库有一个Function2D类,我就这样使用它:
package NALIG;
import org.jfree.data.function.Function2D;
import expr.Expr;
import expr.Parser;
import expr.SyntaxException;
import expr.Variable;
/**
* The function.
*/
public class Fx implements Function2D {
private String formula;
public Fx(String f){
formula = f;
}
/* (non-Javadoc)
* @see org.jfree.data.function.Function2D#getValue(double)
*/
public double getValue(double x) {
Expr expr = null;
try {
expr = Parser.parse(formula);
} catch (SyntaxException e) {
System.err.println("formula error syntaxExeption");
System.err.println(e.explain());
}
Variable vx = Variable.make("x");
vx.setValue(x);
return expr.value();
}
}
但问题是syntaxExeption工作不正常(数学上)。 在以下示例中没有使用syntaxExeption(数学上不正确):
f(x)=xd not throw error
f(x)=1+xd not throw error
适合以下工作:
f(x)=; (or starting with any other symbol or alone symbol: !@#$%^&*()_+;'[]{}|\") throw syntaxExeption
f(x)=x+ (or any other symbol in position of "+" like !@#$%^&*()_+;'[]{}|\") throw syntaxExeption
***用于检查的输入字符串是否=
*** SyntaxExeption的源代码是here
提前致谢
答案 0 :(得分:0)
您这样做的方式与确认任何其他输入格式正确的方式相同:尝试解析它。
查找您用于表达功能的语言的正式语法。实现该语言的解析器 - 通过递归下降或使用javacc或旧的lex / yacc对之类的“编译器编译器”工具包之一。如果解析器发现输入偏离可接受的正式语法,则报告错误。根据语言的不同,您可能需要处理构建符号表和跟踪子表达式类型以及进行其他类型的交叉检查;这些操作通常可以由解析器驱动,或者至少数据收集可以由解析器驱动,并通过解析后传递来分析该数据。
根据语言的结构以及您愿意工作的难度,您可能会或可能无法每次尝试报告多个错误。但简单的是/否良好形成检查通常是直截了当的。
我担心,细节会超出Stack Overflow答案的合理范围。