你如何解析非标准表格函数?

时间:2012-03-22 03:26:07

标签: java parsing parser-generator

标准格式函数,如A * B + A * B'很容易解析(用+分割然后用*分割)。如果它没有采用标准形式,你如何解析一个函数? 示例:函数可以采用以下形式:

A*B+A(A+B')
A*B+(A+B')A
A*B+A*B(A+B)

有什么想法吗?

P.S:我想用Java解析函数。

2 个答案:

答案 0 :(得分:0)

  

像A * B + A * B'这样的标准格式函数很容易解析(用+分割然后用*分割)。

好。现在,剩下的就是处理那些讨厌的括号。首先,我们将使用array.split删除它们,然后我们将添加必要的逻辑来执行乘法运算:

分割字符串A(A+B')C后,最终会得到一个包含三个字符串AA+BC的数组。请注意,在此方法中,奇数字符串始终是括号内的字符串。所以我们要做的就是检查奇数字符串的最后和第一个字符是字母(A,B,C)还是运算符(*,+)。

String firstString = "A*B+A*B(A+B)+A*B+A*B(A+B)";
String leftOfParenthesis;
String insideParenthesis;
String rightOfParenthesis
String last;
String first;

String[] masterArray;
masterArray = str.split(firstString);

for(int i=0; i<masterArray.length; i+2){
   leftOfParenthesis = masterArray[i];
   insideParenthesis = masterArray[i+1];
   rightParenthesis = masterArray[i+2];

   last = leftOfParenthesis.substring(leftOfParenthesis.length()-1);
   first = rightParenthesis.substring(0,1);

   if(last.isLetter() && first.isLetter()){
      leftOfParenthesis.append("*" + insideParenthesis + "*" +
          last + "+last*" +  insideParenthesis + "*" + first);
      rightOfParenthesis[0] = last;
   }
   else if(last.isLetter()){
      leftOfParenthesis.append("*" + insideParenthesis + "*" + last);
   }
   else if(first.isLetter()){
      leftOfParenthesis.append("+" + first + "*" +
          insideParenthesis + "*" );
   }
}

这是基本逻辑。如果您超出输入字符串的末尾并且没有那么多条款,则rightParenthesis = masterArray[i+2];会出现一些问题。因此,您必须添加一些if语句来检查它。这并不是一般的,如果你在括号内括号或在一对括号内有两个以上的术语,你将不得不添加特殊的逻辑来处理它。

答案 1 :(得分:0)

而不是尝试使用临时方法(总是以糟糕的方式结束)进行解析 好转了

  1. 为你的表达形式写一个BNF语法 变体
  2. 编码一个递归下降解析器(参见 https://stackoverflow.com/a/2336769/120163