如何解析非标准表单函数?

问题描述:

像A * B + A * B'这样的标准表单函数很容易解析(用+分割,然后用*分割)。如果函数没有采用标准形式,如何解析函数? 例如:一个功能可以采取以下形式:如何解析非标准表单函数?

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

任何想法?

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

+0

每隔字母表有一个特殊的字符 – gmhk 2012-03-22 03:34:15

+0

只是一个想法:删除所有你不能或不符号想在解析你的函数 – Leo 2012-03-22 03:39:17

+0

之前解析你想要解析的数学表达式是什么? – Bergi 2012-03-22 03:53:43

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

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

一旦分割字符串A(A+B')C,你将结束与三根弦AA+B的数组, C。并注意在这种方法中,奇数字符串总是在括号内。因此,我们所要做的就是检查奇数字符串的最后一个字符和第一个字符是字母(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

这正是我在解答原始问题“特设”解析时的意思:http://*.com/a/9867303/120163。我认为这不会让你进行严肃的逻辑分析和转换。 – 2012-03-26 19:50:50

+0

好吧,显然我没有看到你的帖子。这是在我发布后,并在另一个线程。但我完全愿意承认,可能会有更优雅或通常有用的方法来解决问题。 我想这一切都取决于艾哈迈德将军的问题集将会如何。如果只有他在帖子中引用的字符串长度,我可能会短暂甜蜜。但是,如果在字符串中可能有数百个术语,并且带有嵌入式引号和疯狂,那么比,是的,更复杂的方法将远远优越。 我想我认为他的例子和他需要的一样复杂。 – theJollySin 2012-03-26 20:06:28

而不是试图用特殊方法来解析(这总是非常结束),你 是关闭

  1. 编写BNF语法为您的表现形式更好,在所有 变种
  2. 代码递归下降解析器(见 https://*.com/a/2336769/120163