Java 划分IF-ELSE-ENDIF循环的逻辑

Java 划分IF-ELSE-ENDIF循环的逻辑,java,algorithm,logic,Java,Algorithm,Logic,这是我的第一个问题,如果有什么问题,请纠正我。 我在一个文档系统中有一些旧的规则,我正试图将它们转换成新的文档系统。 我有很多IF-ENDIF和IF-ELSE-ENDIF嵌套在一起,如下所示。需要一些将下面的输入转换为相应输出的逻辑。 需要algo的帮助。谢谢 INPUT: IF (Cond 1) IF(Cond 2) ENDIF IF(Cond3) ELSE ENDIF ELSE IF(Cond4) E

这是我的第一个问题,如果有什么问题,请纠正我。 我在一个文档系统中有一些旧的规则,我正试图将它们转换成新的文档系统。 我有很多IF-ENDIF和IF-ELSE-ENDIF嵌套在一起,如下所示。需要一些将下面的输入转换为相应输出的逻辑。 需要algo的帮助。谢谢

INPUT:  
IF (Cond 1)  
    IF(Cond 2)  
    ENDIF  
    IF(Cond3)  
    ELSE  
    ENDIF  
ELSE  
    IF(Cond4)  
    ELSE  
        IF(Cond5)  
        ELSE  
        ENDIF  
    ENDIF  
    IF(Cond6)  
    ENDIF  
ENDIF  
所需输出:

    IF(Cond1) AND (Cond2)  
    IF(Cond1) AND (Cond3)  
    IF(Cond1) AND !(Cond3)  
    IF!(Cond1) AND (Cond4)  
    IF!(Cond1) AND !(Cond4)  AND (Cond5)  
    IF!(Cond1) AND !(Cond4) AND !(Cond5)  
    IF!(Cond1) AND (Cond6)  

假设您将输入读取并解析到一个树状数据结构中,其中每个节点表示一个“if-else”语句,子节点是嵌套的if-else语句,下面是一些粗略的伪代码,可以让您大致了解:

process(tree,output)
  if tree == null
    write output to file
    return
  for each child in body of if
     process(child,output + "AND <condition of root node in tree>")
  for each child in body of else
     process(child,output + "AND !<condition of root node in tree>")

我将假设您首先拥有可以解析文件的逻辑。如果是这样,那么您应该得到一个抽象语法树,其中每个节点看起来如下:

If
  |
  +--- Condition
  |
  +--- Positive statement
  |
  +--- Negative statement
If
  |
  +--- Cond1
  |
  +--- Sequence
  |      |
  |      +--- If
  |      |      |
  |      |      +--- Cond2
  |      |      |
  |      |      +--- Terminal
  |      |      |
  |      |      +--- (null)
  |      |
  |      +--- If
  |             |
  |             +--- Cond3
  |             |
  |             +--- Terminal
  |             |
  |             +--- Terminal
  |
  +--- If
       ...

其中,Terminal表示一个具体的语句。它们隐含在原始输入文件中。例如,IFCOND2 ENDIF将表示为:

If
  |
  +--- Cond2
  |
  +--- Terminal
  |
  +--- (null)
在您的情况下,实际的树将如下所示:

If
  |
  +--- Condition
  |
  +--- Positive statement
  |
  +--- Negative statement
If
  |
  +--- Cond1
  |
  +--- Sequence
  |      |
  |      +--- If
  |      |      |
  |      |      +--- Cond2
  |      |      |
  |      |      +--- Terminal
  |      |      |
  |      |      +--- (null)
  |      |
  |      +--- If
  |             |
  |             +--- Cond3
  |             |
  |             +--- Terminal
  |             |
  |             +--- Terminal
  |
  +--- If
       ...
要生成输出,您只需递归地遍历树,沿途构建一个条件堆栈,然后当您到达一个语句时,输出整个条件堆栈,其中包含AND。下面是一些伪代码:

void treeWalk(root):
    treeWalk(root, []);

void treeWalk(root, conditions):
    case root of:
        If(cond, positive, negative):
            if (positive is not null):
                treeWalk(positive, conditions + cond)
            if (negative is not null):
                treeWalk(negative, conditions + !cond)
        Sequence(statements):
            for each statement in statements:
                treeWalk(statements, conditions)
        Terminal:
            print "IF "
            for each condition in conditions:
                if (condition is not the last condition):
                    print " AND "
                print condition
在这里,我使用+表示将一个项目附加到列表中。假设是这样的!cond会导致一个条件,即使用!在前面


我希望这有帮助

你是如何得出结果的?在代码中应用相同的逻辑…我键入了output manuallySo,您需要解析输入并根据解析的内容生成输出?是的,我最初尝试用not删除else!if条件的组合,然后组合if条件,但并不适用于所有情况。