Как вы анализируете нестандартную функцию формы? - PullRequest
0 голосов
/ 22 марта 2012

Стандартные функции формы, такие как 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 голосов
/ 05 октября 2015

Вместо того, чтобы пытаться анализировать с помощью специальных методов (которые всегда плохо заканчиваются), вам лучше

  1. написать грамматику BNF для форм выражения во всех вариантах
  2. код парсера рекурсивного спуска (см. https://stackoverflow.com/a/2336769/120163)
0 голосов
/ 26 марта 2012

Стандартную функцию формы, такую ​​как A * B + A * B ', легко анализировать (деление на + и затем деление на *).

Хорошо.Теперь все, что осталось, это разобраться с этими надоедливыми скобками.Сначала мы удалим их с помощью array.split, а затем добавим необходимую логику для выполнения умножений:

После того, как вы разбили строку A(A+B')C, вы получите массив из трехстроки A, A+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 операторов, чтобы проверить это.И это не совсем обычно, если у вас есть круглые скобки внутри скобок или более двух терминов внутри пары круглых скобок, вам придется добавить специальную логику для решения этой проблемы.

...