[BL1160]=([BL2010]+[BL7111]*4+[BL7211]*16+[BL7310]*64+[BL4010]*63+[BL2510]*252+[BL6010]*1008)/([BL2000]+[BL7110]*4+[BL7210]*16+[BL7300]*64+[BL4000]*63+[BL2500]*252+[BL6000]*1008)*100[BL1160] 是一个指标,根据其他的指标经过运算(目前主要是=-×/和小括号)得来的。
怎么定义这个算法?求算法和主要java api 函数。
怎么定义这个算法?求算法和主要java api 函数。
set JAVACC_HOME=...
set JAVA_HOME=..
----------MyCC.jj------
options {
STATIC = false;
}PARSER_BEGIN(Grammar) /*解析代码的入口*/import java.util.HashMap;public class Grammar {
public static final int PlusOP = 1;
public static final int MinusOP = 2;
public static final int TimersOP= 3;
public static final int OverOP = 4; private HashMap map = new HashMap();
public static void main(String args[]) throws ParseException {
Grammar parser = new Grammar(System.in);
parser.map.put("[a]", new Double(1.23));
parser.map.put("[b]", new Double(2.31));
parser.map.put("[c]", new Double(3.12));
parser.Expression();
System.out.println(parser.map.get("[F]"));
}
}
PARSER_END(Grammar)SKIP : /* 不处理的字符*/
{
" " | "\t"
}TOKEN : /*生成token的字符定义*/
{
< ID: "[" ( ["a"-"z","A"-"Z","_","0"-"9"] )* "]" >
| < NUM: ( ["0"-"9"] )+ >
| < PLUS: "+" >
| < MINUS: "-" >
| < TIMERS: "*" >
| < OVER: "/" >
| < LBRACKET: "(" >
| < RBRACKET: ")" >
| <NEWLINE: ("\r\n"|"\n"|"\r")>
}void Expression() :
/*完成 Expression ::=( ( <NEWLINE> )* Simple_Expression <NEWLINE> )* <EOF> 的配陪*/
{
double value = 0; /* 这个{}中是Expression()的定义的局部变量*/
Token t = null;
}
{
t = <ID>
<EQ: "=">
value = Simple_Expression() <NEWLINE> /*在换行之前Simple_Expression()解析表达式 ,输入换行后,一个预算解析完成*/
{
map.put(t.image, new Double(value));
}
}double Simple_Expression() :
/*完成Simple_Expression ::=bnf Term ( addop Term )*配陪 */
{
/* 这个{}中是Simple_Expression()的定义的局部变量*/
double value;
double tValue;
int op;
}
{
value = Term (){} /*配陪Term 相*/
(
op = addop()
tValue = Term()
{
switch(op)
{
case PlusOP:
value = value + tValue;
break;
case MinusOP:
value = value - tValue;
break;
}
}
)* /*匹配 ( addop Term )* */
{ return value; }
}int addop() : {}
{
<PLUS> { return PlusOP; }
| <MINUS> { return MinusOP; }
}double Term() :
{
double value;
double tValue;
int op;
}
{
value = Factor(){}
(
op = mulop()
tValue = Factor()
{
switch(op)
{
case TimersOP:
value = value * tValue;
break;
case OverOP:
value = value / tValue;
break;
}
}
)*
{
return value;
}
}int mulop() :{}
{
<TIMERS> { return TimersOP; }
| <OVER> { return OverOP; }
}double Factor() :
{
double value = 0;
Token t;
}
{
t = <ID> /*获得<ID>的解析的值*/
{
Double tValue = (Double)map.get(t.image);
value = tValue == null ? Double.NaN : tValue.doubleValue();
return value;
}
| t = <NUM> {
value = Double.parseDouble(t.image);
return value;
}
| t = <MINUS> {
value = 0 - Factor();
return value;
}
| t = <PLUS> {
value = Factor();
return value;
}
| <LBRACKET> value = Simple_Expression() <RBRACKET> {
return value;
}
}
----------End MyCC.jj------然后运行 javacc MyCC.jj,它会生成一些Java文件的
上面已经完成了你需要的功能(为测试代码)
输入[F]=1+[a]*3 等等这样就可以了。至于真正的代码你需要将/*获得<ID>的解析的值*/这里改动一下,put进去的地方也需要改
set JAVACC_HOME=...
set JAVA_HOME=..然后将我上面------------中间的东西保存在MyExpr.jj文件
然后运行 JAVACC_HOME\bin\javacc MyExpr.jj,它会生成N个Java文件,这样就是已经可以完成了。你编译并运行它就可以输入并得到结果