簡體   English   中英

您如何解析非標准形式的函數?

[英]How do you parse non-standard form function?

像A * B + A * B'這樣的標准形式函數很容易解析(用+分割,然后用*分割)。 如果不采用標准形式,該如何解析函數? 示例:一個函數可以采用以下形式:

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

有任何想法嗎?

PS:我想解析Java中的函數。

與其嘗試使用即席方法(總是以糟糕的結局)進行解析,不如嘗試更好的方法

  1. 在所有變體中為您的表達形式編寫BNF語法
  2. 編寫遞歸下降解析器的代碼(請參閱https://stackoverflow.com/a/2336769/120163

像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語句來進行檢查。 而且這並不完全是普遍的,如果您在括號內有括號或在一對括號內有兩個以上術語,則必須添加特殊的邏輯來處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM