¡¶JAVAÓëģʽ¡·µÚ25Ìì¨D½âÊÍÆ÷ģʽ (Ò»)

2014-11-24 08:31:44 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 4

½âÊÍÆ÷ģʽÊÇÀàµÄÐÐΪģʽ¡£¸ø¶¨Ò»¸öÓïÑÔÖ®ºó£¬½âÊÍÆ÷ģʽ¿ÉÒÔ¶¨Òå³öÆäÎÄ·¨µÄÒ»ÖÖ±íʾ£¬²¢Í¬Ê±Ìṩһ¸ö½âÊÍÆ÷¡£¿Í»§¶Ë¿ÉÒÔʹÓÃÕâ¸ö½âÊÍÆ÷À´½âÊÍÕâ¸öÓïÑÔÖеľä×Ó¡£

½âÊÍÆ÷ģʽµÄ½á¹¹

¡¡¡¡ÏÂÃæ¾ÍÒÔÒ»¸öʾÒâÐÔµÄϵͳΪÀý£¬ÌÖÂÛ½âÊÍÆ÷ģʽµÄ½á¹¹¡£ÏµÍ³µÄ½á¹¹Í¼ÈçÏÂËùʾ£º

\

¡¡¡¡Ä£Ê½ËùÉæ¼°µÄ½ÇÉ«ÈçÏÂËùʾ£º

¡¡¡¡£¨1£©³éÏó±í´ïʽ(Expression)½ÇÉ«£ºÉùÃ÷Ò»¸öËùÓеľßÌå±í´ïʽ½ÇÉ«¶¼ÐèҪʵÏֵijéÏó½Ó¿Ú¡£Õâ¸ö½Ó¿ÚÖ÷ÒªÊÇÒ»¸öinterpret()·½·¨£¬³Æ×ö½âÊͲÙ×÷¡£

¡¡¡¡£¨2£©ÖÕ½á·û±í´ïʽ(Terminal Expression)½ÇÉ«£ºÊµÏÖÁ˳éÏó±í´ïʽ½ÇÉ«ËùÒªÇóµÄ½Ó¿Ú£¬Ö÷ÒªÊÇÒ»¸öinterpret()·½·¨£»ÎÄ·¨ÖеÄÿһ¸öÖÕ½á·û¶¼ÓÐÒ»¸ö¾ßÌåÖÕ½á±í´ïʽÓëÖ®Ïà¶ÔÓ¦¡£±ÈÈçÓÐÒ»¸ö¼òµ¥µÄ¹«Ê½R=R1+R2£¬ÔÚÀïÃæR1ºÍR2¾ÍÊÇÖÕ½á·û£¬¶ÔÓ¦µÄ½âÎöR1ºÍR2µÄ½âÊÍÆ÷¾ÍÊÇÖÕ½á·û±í´ïʽ¡£

¡¡¡¡£¨3£©·ÇÖÕ½á·û±í´ïʽ(Nonterminal Expression)½ÇÉ«£ºÎÄ·¨ÖеÄÿһÌõ¹æÔò¶¼ÐèÒªÒ»¸ö¾ßÌåµÄ·ÇÖÕ½á·û±í´ïʽ£¬·ÇÖÕ½á·û±í´ïʽһ°ãÊÇÎÄ·¨ÖеÄÔËËã·û»òÕ߯äËû¹Ø¼ü×Ö£¬±ÈÈ繫ʽR=R1+R2ÖУ¬¡°+"¾ÍÊÇ·ÇÖÕ½á·û£¬½âÎö¡°+¡±µÄ½âÊÍÆ÷¾ÍÊÇÒ»¸ö·ÇÖÕ½á·û±í´ïʽ¡£

¡¡¡¡£¨4£©»·¾³(Context)½ÇÉ«£ºÕâ¸ö½ÇÉ«µÄÈÎÎñÒ»°ãÊÇÓÃÀ´´æ·ÅÎÄ·¨Öи÷¸öÖÕ½á·ûËù¶ÔÓ¦µÄ¾ßÌåÖµ£¬±ÈÈçR=R1+R2£¬ÎÒÃǸøR1¸³Öµ100£¬¸øR2¸³Öµ200¡£ÕâЩÐÅÏ¢ÐèÒª´æ·Åµ½»·¾³½ÇÉ«ÖУ¬ºÜ¶àÇé¿öÏÂÎÒÃÇʹÓÃMapÀ´³äµ±»·¾³½ÇÉ«¾Í×ã¹»ÁË¡£

¡¡¡¡ÎªÁË˵Ã÷½âÊÍÆ÷ģʽµÄʵÏÖ°ì·¨£¬ÕâÀï¸ø³öÒ»¸ö×î¼òµ¥µÄÎÄ·¨ºÍ¶ÔÓ¦µÄ½âÊÍÆ÷ģʽµÄʵÏÖ£¬Õâ¾ÍÊÇÄ£ÄâJavaÓïÑÔÖжԲ¼¶û±í´ïʽ½øÐвÙ×÷ºÍÇóÖµ¡£

¡¡¡¡ÔÚÕâ¸öÓïÑÔÖÐÖÕ½á·ûÊDz¼¶û±äÁ¿£¬Ò²¾ÍÊdz£Á¿trueºÍfalse¡£·ÇÖÕ½á·û±í´ïʽ°üº¬ÔËËã·ûand£¬orºÍnotµÈ²¼¶û±í´ïʽ¡£Õâ¸ö¼òµ¥µÄÎÄ·¨ÈçÏ£º

¡¡¡¡¡¡¡¡Expression ::= Constant | Variable | Or | And | Not

¡¡¡¡¡¡¡¡And ¡¡¡¡¡¡¡¡::= Expression 'AND' Expression

¡¡¡¡¡¡¡¡Or¡¡¡¡¡¡¡¡¡¡::= Expression 'OR' Expression

¡¡¡¡¡¡¡¡Not¡¡¡¡¡¡¡¡ ::= 'NOT' Expression

¡¡¡¡¡¡¡¡Variable¡¡¡¡ ::= Èκαêʶ·û

¡¡¡¡¡¡¡¡Constant ::= 'true' | 'false'

¡¡¡¡½âÊÍÆ÷ģʽµÄ½á¹¹Í¼ÈçÏÂËùʾ£º

\

¡¡¡¡Ô´´úÂë
¡¡¡¡³éÏó±í´ïʽ½ÇÉ«

[java]
package com.bankht.Interpreter;

/**
* @author: ÌØÖÖ±ø¡ªAK47
* @´´½¨Ê±¼ä£º2012-7-3 ÏÂÎç03:08:58
*
* @Àà˵Ã÷ £º³éÏó±í´ïʽ½ÇÉ«
*/
public abstract class Expression {
/**
* ÒÔ»·¾³Îª×¼£¬±¾·½·¨½âÊ͸ø¶¨µÄÈκÎÒ»¸ö±í´ïʽ
*/
public abstract boolean interpret(Context ctx);

/**
* ¼ìÑéÁ½¸ö±í´ïʽÔڽṹÉÏÊÇ·ñÏàͬ
*/
public abstract boolean equals(Object obj);

/**
* ·µ»Ø±í´ïʽµÄhash code
*/
public abstract int hashCode();

/**
* ½«±í´ïʽת»»³É×Ö·û´®
*/
public abstract String toString();
}
package com.bankht.Interpreter;

/**
* @author: ÌØÖÖ±ø¡ªAK47
* @´´½¨Ê±¼ä£º2012-7-3 ÏÂÎç03:08:58
*
* @Àà˵Ã÷ £º³éÏó±í´ïʽ½ÇÉ«
*/
public abstract class Expression {
/**
* ÒÔ»·¾³Îª×¼£¬±¾·½·¨½âÊ͸ø¶¨µÄÈκÎÒ»¸ö±í´ïʽ
*/
public abstract boolean interpret(Context ctx);

/**
* ¼ìÑéÁ½¸ö±í´ïʽÔڽṹÉÏÊÇ·ñÏàͬ
*/
public abstract boolean equals(Object obj);

/**
* ·µ»Ø±í´ïʽµÄhash code
*/
public abstract int hashCode();

/**
* ½«±í´ïʽת»»³É×Ö·û´®
*/
public abstract String toString();
}

¡¡¡¡Ò»¸öConstant¶ÔÏó´ú±íÒ»¸ö²¼¶û³£Á¿

[java]
package com.bankht.Interpreter;

/**
* @author: ÌØÖÖ±ø¡ªAK47
* @´´½¨Ê±¼ä£º2012-7-3 ÏÂÎç03:09:35
*
* @Àà˵Ã÷ £ºÒ»¸öConstant¶ÔÏó´ú±íÒ»¸ö²¼¶û³£Á¿
*/
public class Constant extends Expression {

private boolean value;

public Constant(boolean value) {
this.value = value;
}

@Override
public boolean equals(Object obj) {

if (obj != null && obj instanceof Constant) {
return this.value == ((Constant) obj).value;
}
return false;
}

@Override
public int hashCode() {
return this.toString().hashCode();
}

@Override
public boolean interpret(Context ctx) {

return value;
}

@Override
public String toString() {
return new Boolean(value).toString();
}

}
package com.bankht.Interpreter;

/**
* @author: ÌØÖÖ±ø¡ªAK47
* @´´½¨Ê±¼ä£º2012-7-3 ÏÂÎç03:09:35
*
* @Àà˵Ã÷ £ºÒ»¸öConstant¶ÔÏó´ú±íÒ»¸ö²¼¶û³£Á¿
*/
public class Constant extends Expression {

private boolean value;

public Constant(boolean value) {
this.value = value;
}

@Override
public boolean equals(Object obj) {

if (obj != null && obj instanceof Constant) {
return this.value == ((Constant) obj).value;
}
return false;
}

@Override
public int hashCode() {
return this.toString().hashCode();
}

@Override
public boolean interpret(Context ctx) {

return value;
}

@Override
public S