【问题标题】:How do you parse non-standard form function?你如何解析非标准表单函数?
【发布时间】:2012-03-22 03:26:07
【问题描述】:

像 A*B+A*B' 这样的标准形式的函数很容易解析(用 + 分割,然后用 * 分割)。如果函数不采用标准形式,你如何解析它? 示例:函数可以采用以下形式:

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

有什么想法吗?

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

【问题讨论】:

  • 每个交替的字母都有一个特殊字符
  • 只是一个想法:在解析函数之前删除所有不能或不想解析的符号
  • 你想解析什么数学表达式?
  • @AhmedSalah 请不要重复您自己的问题。

标签: java parsing parser-generator


【解决方案1】:

像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 语句来检查。这并不完全是普遍的,如果括号内有括号或一对括号内有两个以上的术语,则必须添加特殊逻辑来处理。

【讨论】:

  • 这正是我在回答原始问题时所说的“临时”解析:stackoverflow.com/a/9867303/120163。我认为这不会让您在认真的逻辑分析和转换方面走得太远。
  • 好吧,显然我没有看到你的帖子。这是在我发布之后,并且在不同的线程上。但我完全愿意承认可能有一种更优雅或更有用的方法来解决问题。我想这一切都取决于艾哈迈德的问题集有多普遍。如果只有他在帖子中引用的长度的字符串,我可能会简短而甜蜜。但是,如果字符串中可能有数百个术语,带有嵌入的引号和疯狂,那么,是的,更复杂的方法会好得多。我想我认为他的例子和他需要的一样复杂。
【解决方案2】:

与其尝试使用特殊方法(总是以糟糕的方式结束)进行解析,不如 比较好

  1. 为您的表达形式编写 BNF 语法,总之 变体
  2. 编写递归下降解析器(参见 https://stackoverflow.com/a/2336769/120163)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2021-08-29
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多