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

¡¡¡¡Ä£Ê½ËùÉæ¼°µÄ½ÇÉ«ÈçÏÂËùʾ£º
¡¡¡¡£¨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