JavaCC条件语句实现给定的语法



所以我对JavaCC很陌生,我在JavaCC中有这个条件语法。我必须以这样一种方式来实现它,即如果我建立的语法中的条件为真,则执行其余的命令(block(((,但如果不是,则跳过这一部分。我该怎么做?

void conditional(): { }
{
< IF > condition()  block()
[<ELSE>  block()]< FI>

}

关于您的项目的信息很少,处理条件问题的方法很大程度上取决于上下文。

例如,如果你的程序正在为目标机器编译代码,比如JVM字节码,你会做这样的事情:

void conditional(): {
ForwardJump jump, savedJump;
} {
<IF> condition() { jump = generateJumpIfFalse(); } block()
[<ELSE> {
savedJump = jump;
jump = generateJump();
fixForwardJump(savedJump);
}  block()] {
fixForwardJump(jump);
} <FI>
}

这假设condition()将生成计算布尔值的代码,然后将该布尔值推送到堆栈。generateJumpIfFalse()生成一个条件跳转,从堆栈中弹出一个布尔值,如果为false,则跳转到一个未知位置,因为后面的块尚未编译。一旦知道了这个位置,就必须更新正向跳跃。;这就是fixForwardJump所做的。

现在,如果你的程序是一个解释器,你希望解析器产生一些结构,然后你的java代码可以执行。

在本例中,您操作两种基本类型的结构:Statements和Expression。它们可能是相同的,但不同之处在于Expression在执行时返回一个值,而Statement则不返回。

在口译员的情况下,你通常希望句法方法返回整个输入程序的一些子结构;所以你会有这样的东西:

Statement conditional(): {
Expression cond;
Statement ifBlock;
Statement elseBlock = null;
} {
<IF> cond=condition() ifBlock=block()
[<ELSE> elseBlock=block()] <FI>
{
return new ConditionalStatement(cond, ifBlock, elseBlock);
}
}

假设StatementExpression是以下类型的接口:

public interface Statement {
public void execute(MachineState state);
}
public interface Expression {
public Object evaluate(MachineState state);
}

ConditionalStatement当然必须实现Statement接口。它看起来是这样的:

public class ConditionalStatement implements Statement {
private final Expression cond;
private final Statement ifStatement;
private final Statement elseStatement;
public ConditionalStatement(Expression cond, Statement ifStatement, Statement elseStatement) {
this.cond = cond;
this.ifStatement = ifStatement;
this.elseStatement = elseStatement;
}
@Override
public void execute(MachineState state) {
Object value = cond.evaluate(state);
if (value == Boolean.TRUE) {
ifBlock.execute(state);
} else if (elseBlock != null) {
elseBlock.execute(state);
}
}
}

当然,它可能会变得更加复杂。

最新更新