private Expression dynamic(Data data) throws TemplateException {
	// Die Implementation weicht ein wenig von der Grammatik ab,
	// aber nicht in der Logik sondern rein wie es umgesetzt wurde.

	// get First Element of the Variable
	Position line = data.srcCode.getPosition();
	Identifier id = identifier(data, false, true);
	if (id == null) {
	    if (!data.srcCode.forwardIfCurrent('(')) return null;

	    comments(data);
	    Expression expr = assignOp(data);

	    if (!data.srcCode.forwardIfCurrent(')')) throw new TemplateException(data.srcCode, "Invalid Syntax Closing [)] not found");
	    comments(data);
	    return expr;// subDynamic(expr);

	}

	Variable var;
	comments(data);

	// Boolean constant
	if (id.getString().equalsIgnoreCase("TRUE")) {// || name.equals("YES")) {
	    comments(data);
	    return id.getFactory().createLitBoolean(true, line, data.srcCode.getPosition());
	}
	else if (id.getString().equalsIgnoreCase("FALSE")) {// || name.equals("NO")) {
	    comments(data);
	    return id.getFactory().createLitBoolean(false, line, data.srcCode.getPosition());
	}
	else if (id.getString().equalsIgnoreCase("NULL") && !data.srcCode.isCurrent('.') && !data.srcCode.isCurrent('[')) {
	    comments(data);
	    return id.getFactory().createNullConstant(line, data.srcCode.getPosition());
	}

	// Extract Scope from the Variable
	var = startElement(data, id, line);
	var.setStart(line);
	var.setEnd(data.srcCode.getPosition());
	return var;
    }
private Expression dynamic ( Data data ) throws TemplateException { Position line = data . srcCode . getPosition ( ) ; Identifier id = identifier ( data , false , true ) ; if ( id == null ) { if ( ! data . srcCode . forwardIfCurrent ( '(' ) ) return null ; comments ( data ) ; Expression expr = assignOp ( data ) ; if ( ! data . srcCode . forwardIfCurrent ( ')' ) ) throw new TemplateException ( data . srcCode , "Invalid Syntax Closing [)] not found" ) ; comments ( data ) ; return expr ; } Variable var ; comments ( data ) ; if ( id . getString ( ) . equalsIgnoreCase ( "TRUE" ) ) { comments ( data ) ; return id . getFactory ( ) . createLitBoolean ( true , line , data . srcCode . getPosition ( ) ) ; } else if ( id . getString ( ) . equalsIgnoreCase ( "FALSE" ) ) { comments ( data ) ; return id . getFactory ( ) . createLitBoolean ( false , line , data . srcCode . getPosition ( ) ) ; } else if ( id . getString ( ) . equalsIgnoreCase ( "NULL" ) && ! data . srcCode . isCurrent ( '.' ) && ! data . srcCode . isCurrent ( '[' ) ) { comments ( data ) ; return id . getFactory ( ) . createNullConstant ( line , data . srcCode . getPosition ( ) ) ; } var = startElement ( data , id , line ) ; var . setStart ( line ) ; var . setEnd ( data . srcCode . getPosition ( ) ) ; return var ; }
Liest den folgenden idetifier ein und prueft ob dieser ein boolscher Wert ist. Im Gegensatz zu
CFMX wird auch "yes" und "no" als bolscher <wert akzeptiert, was bei CFMX nur beim Umwandeln
einer Zeichenkette zu einem boolschen Wert der Fall ist.<br />
Wenn es sich um keinen bolschen Wert handelt wird der folgende Wert eingelesen mit seiner ganzen
Hirarchie. <br />
EBNF:<br />
<code>"true" | "false" | "yes" | "no" | startElement {("." identifier | "[" structElement "]" )[function] };</code>

@return CFXD Element
@throws TemplateException