×¢²á | µÇ¼ Íü¼ÇÃÜÂ룿 51ctoÊ×Ò³ | ²©¿Í | ÂÛ̳ | ÕÐÆ¸
ÈȵãÎÄÕ ÔÞËѹ·Îå±Ê£¬Í´Âî MSN É¥..
¡¡°ïÖú

JAVA±à³ÌÒÕÊõ


2007-10-24 21:35:15
¡¡±êÇ©£ºJAVA±à³ÌÒÕÊõ¡¡¡¡¡¡[ÍÆË͵½¼¼ÊõȦ]

µÚÒ»²¿·Ö Java ¾« Ëè
1991Ä꣬Sun Microsystems¹«Ë¾¿ªÊ¼Ñо¿Ò»ÖÖеļÆËã»úÓïÑÔ£¬ÕâÖÖÓïÑÔ×îºóº³¶¯ÁË´«Í³±à³ÌµÄ»ù´¡¡£Æð³õ£¬ÕâÖÖÓïÑÔ±»ÃüÃûΪOak£¬µ½1995ÄêÕýʽÃüÃûΪJava¡£JavaÔÚÁ½¸ö·½Ãæ¸Ä±äÁ˱à³ÌµÄ¹ý³Ì¡£µÚÒ»£¬Java¼¯³ÉÁËÓÐÀûÓÚ±àÖÆInternet³ÌÐòµÄÌØÐÔ¡£µÚ¶þ£¬Java·¢Õ¹Á˼ÆËã»úÓïÑԵľ«Ëè¡£Òò´Ë£¬JavaµÄÖØÒªÐÔÌåÏÖÔÚÁ½µã£º¶ÔInternetµÄÄÚǶ֧³ÖºÍ¶Ô¼ÆËã»úÓïÑÔ·¢Õ¹µÄÍÆ¶¯¡£ÕâÁ½µãÖеÄÈκÎÒ»µã¶¼×ãÒÔʹJava³ÉΪһÖÖ³öÉ«µÄÓïÑÔ£»µ«ÊÇÖ»Óн«ÕâÁ½µã³É¹¦µØ½áºÏÆðÀ´£¬Java²ÅÄܳÉΪһÖÖΰ´óµÄÓïÑÔ£¬²ÅÄÜÈ·¶¨ËüÔÚ¼ÆËã»úÀúÊ·ÖеĵØÎ»¡£
  
¼òµ¥Êý¾ÝÀàÐͺͶÔÏó£ºÍêÃÀµÄƽºâ
Éè¼ÆÒ»ÖÖÃæÏò¶ÔÏóÓïÑÔËùÃæÁÙµÄ×î´óÌôÕ½£¬¾ÍÊÇÈçºÎƽºâ¶ÔÏóºÍ¼òµ¥Êý¾ÝÀàÐÍÖ®¼äµÄ¾ñÔñ¡£´Ó´¿ÀíÂ۵Ĺ۵ãÀ´¿´£¬Ã¿ÖÖÊý¾ÝÀàÐͶ¼Ó¦¸ÃÊÇÒ»¸ö¶ÔÏ󣬲¢ÇÒ¶¼Ó¦¸Ã´ÓÒ»¸ö¹²Í¬µÄ¸¸¶ÔÏóÅÉÉú¶øÀ´¡£Õâ¾ÍʹµÃËùÓÐÊý¾ÝÀàÐÍÒÔÏàͬµÄ»ù±¾Ä£Ê½ÔË×÷£¬¹²ÏíÒ»¸ö¹«¹²µÄ»ùÀàÊôÐÔ¼¯ºÏ¡£ÏÖÔÚµÄÎÊÌâÔÚÓÚ£¬Èç¹û½«¼òµ¥Êý¾ÝÀàÐÍ(ÈçintºÍdouble)×÷Ϊ¶ÔÏó´¦Àí£¬ÄÇô¶ÔÏó»úÖÆËùÒýÆðµÄ¶îÍ⿪Ïú»áµ¼ÖÂÐÔÄÜ(performace)µÄϽµ¡£ÓÉÓÚ¼òµ¥Êý¾ÝÀàÐÍͨ³£ÓÃÓÚÑ­»·¿ØÖƺÍÌõ¼þÓï¾ä£¬ËùÒÔÕâЩ¶îÍ⿪Ïú½«´øÀ´¹ã·ºµÄ¸ºÃæÓ°Ïì¡£¾÷ÇϾÍÊÇÈçºÎÔÚ¡°Ò»Çж¼ÊǶÔÏó¡±µÄÀíÏëºÍ¡°ÐÔÄܺâÁ¿¡±µÄÏÖʵ֮¼äÕÒµ½ÕýÈ·µÄƽºâµã¡£
¡¡¡¡Java·Ç³£ÇÉÃîµØ½â¾öÁ˶ÔÏóÓë¼òµ¥Êý¾ÝÀàÐÍÖ®¼äµÄÎÊÌâ¡£Ê×ÏÈ£¬Java¶¨ÒåÁË8ÖÖ¼òµ¥ÀàÐÍ£ºbyte¡¢short¡¢int¡¢long¡¢char¡¢float¡¢doubleºÍboolean¡£ÕâЩÀàÐÍÄܹ»Ö±½Óת»»Îª¶þ½øÖÆ´úÂë¡£Òò´Ë£¬CPU¿ÉÒÔÖ±½Ó´¦ÀíintÀàÐ͵ıäÁ¿£¬¶øÎÞÐèÈκζîÍ⿪Ïú¡£ÔÚJavaÖУ¬´¦Àí¼òµ¥Êý¾ÝÀàÐÍºÍÆäËûÓïÑÔÒ»Ñù¿ìËÙ¸ßЧ¡£Òò´Ë£¬ÓÉintÐͱäÁ¿Ëù¿ØÖƵÄforÑ­»·¿ÉÒÔ¸ßËÙÔËÐУ¬¶ø²»ÊÜÈκζÔÏó»¯Ëù´øÀ´µÄ¸ºÃæÓ°Ïì¡£
¡¡¡¡³ýÁËÕâЩ¼òµ¥Êý¾ÝÀàÐÍ£¬JavaÖÐµÄÆäËûÊý¾ÝÀàÐͶ¼´ÓÒ»¸ö¹²Í¬³¬Àà(ObjectÀà)ÅÉÉú¶øÀ´¡£Òò´Ë£¬ËùÓÐÕâЩÊý¾ÝÀàÐͶ¼¹²Ïí´Ó¸¸Àà¼Ì³Ð¶øÀ´µÄ·½·¨ºÍÊôÐÔ¼¯¡£ÀýÈ磬ËùÓжÔÏó¶¼ÓÐtoString()·½·¨£¬ÒòΪtoString()ÊǸ¸ÀàObjectÖж¨ÒåµÄ·½·¨¡£
¡¡¡¡ÓÉÓÚ¼òµ¥Êý¾ÝÀàÐͲ»ÊǶÔÏó£¬Òò´ËJava¿É×ÔÓɵØÒÔÂÔÓв»Í¬µÄ·½Ê½´¦Àí¶ÔÏóºÍ·Ç¶ÔÏó¡£Õâ¾ÍÊÇJavaµÄÕæÕý¾«ËèËùÔÚ¡£ÔÚJavaÖУ¬ËùÓжÔÏó¶¼Í¨¹ýÒýÓ÷ÃÎÊ£¬¶ø·ÇÖ±½Ó·ÃÎÊ£»Ö»Óмòµ¥Êý¾ÝÀàÐͲſÉÒÔÖ±½Ó·ÃÎÊ¡£Òò´Ë£¬Java³ÌÐò¾ø¶Ô²»»áÖ±½Ó²Ù×÷Ò»¸ö¶ÔÏó¡£ÕâÖÖ²ßÂÔ¿ÉÒÔ´øÀ´ºÜ¶àºÃ´¦£¬×îÖ±½ÓµÄºÃ´¦¾ÍÊÇÄܹ»¸ßЧµØÊµÏÖÀ¬»ø»ØÊÕ¡£ÒòΪËùÓжÔÏó¶¼Í¨¹ýÒýÓ÷ÃÎÊ£ºµ±Ò»¸ö¶ÔÏóûÓб»ÒýÓÃʱ£¬Ëü½«±»»ØÊÕ¡£ÁíÒ»¸öºÃ´¦ÊÇ£¬Ã¿¸öObjectÀàÐ͵ÄÖ¸Õë¿ÉÒÔÒýÓÃϵͳÖеÄÈκζÔÏó¡£
¡¡¡¡µ±È»£¬Í¨¹ýÒýÓ÷ÃÎʶÔÏ󽫲úÉú¶îÍ⿪Ïú¡£ÒòΪһ¸öÒýÓÃʵ¼ÊÉÏÊÇÒ»¸öµØÖ·(¼´Ö¸Õë)¡£ÓÚÊǶÔÿ¸ö¶ÔÏóµÄ·ÃÎʲ»ÊÇÖ±½Ó½øÐе쬶øÊÇͨ¹ýµØÖ·¼ä½ÓÍê³ÉµÄ¡£¾¡¹ÜÏÖ´úCPU¿ÉÒÔ¸ßЧµØ´¦Àí¼ä½Ó·ÃÎÊ£¬µ«ÊǼä½Ó·ÃÎÊ×ÜÊDz»ÈçÖ±½Ó´¦ÀíÊý¾Ý±¾Éí¿ì£¬¼òµ¥Êý¾ÝÀàÐͼ´ÊÇͨ¹ýÖ±½Ó·½Ê½½øÐеġ£
¡¡¡¡¾¡¹Ü¼òµ¥Êý¾ÝÀàÐ͵Ĵ¦Àí·Ç³£¸ßЧ£¬µ«ÊÇÓÐЩʱºòÈÔÈ»ÐèҪʹÓøúij¸ö¼òµ¥ÀàÐ͵ȼ۵ĶÔÏó¡£ÀýÈçÔÚÔËÐÐʱ´´½¨Ò»¸öÕûÐÍÁ´±í£¬²¢ÔÚ²»ÔÙʹÓÃʱ½«Æä»ØÊÕ(À¬»ø»ØÊÕ)¡£ÎªÁË´¦Àí´ËÀàÇé¿ö£¬JavaΪ¼òµ¥ÀàÐÍ(ÈçIntegerºÍDouble)¶¨ÒåÁ˰ü×°Æ÷(wrapper)¡£°ü×°Æ÷ʹµÃ¼òµ¥ÀàÐÍÔÚ±ØÒªÊ±¿É²ÎÓëµ½¶ÔÏó²ã´ÎµÄ²Ù×÷ÖÐÀ´¡£Java¹ØÓÚ¶ÔÏóºÍ¼òµ¥Êý¾ÝÀàÐÍµÄÆ½ºâÎÊÌâ¡£ËüÖ§³Ö±àд¸ßЧ³ÌÐò£¬Í¬Ê±ÓÖÍêÃÀµØ½â¾öÁËÔÊÐíʵÏÖ¶ÔÏóÄ£ÐÍ£¬¶ø²»Óõ£ÐĶԼòµ¥Êý¾ÝÀàÐ͵ÄÐÔÄÜ»á²úÉú¸ºÃæÓ°Ïì¡£
    ͨ¹ýÀ¬»ø»ØÊÕʵÏÖÄÚ´æ¹ÜÀí
  
À¬»ø»ØÊÕ×÷ΪһÖÖÄÚ´æ¹ÜÀí¼¼ÊõÒѾ­´æÔÚÁ˺ܳ¤Ê±¼ä£¬µ«ÊÇJavaʹËü»À·¢³öոеĻîÁ¦¡£ÔÚC++µÈÓïÑÔÖУ¬ÄÚ´æ±ØÐëÈ˹¤¹ÜÀí£¬³ÌÐòÔ±±ØÐëÏÔʽµØÊͷŲ»ÔÙʹÓõĶÔÏó¡£ÕâÊÇÎÊÌâ²úÉúµÄ¸ùÔ´£¬ÒòΪÍü¼ÇÊͷŲ»ÔÙʹÓõÄ×ÊÔ´£¬»òÕßÊÍ·ÅÁËÕýÔÚʹÓõÄ×ÊÔ´¶¼ÊǺܳ£¼ûµÄÊÂÇé¡£Java´úÌæ³ÌÐòÔ±Íê³ÉÁËÕâЩ¹¤×÷£¬´Ó¶ø·ÀÖ¹ÁË´ËÀàÎÊÌâµÄ·¢Éú¡£ÔÚJavaÖУ¬ËùÓеĶÔÏó¶¼ÊÇͨ¹ýÒýÓ÷ÃÎʵģ¬ÕâÑù£¬µ±À¬»ø»ØÊÕÆ÷·¢ÏÖÒ»¸öûÓÐÒýÓõĶÔÏóʱ£¬¾ÍÖªµÀ¸Ã¶ÔÏóÒѾ­²»±»Ê¹Ó㬲¢ÇÒ¿ÉÒÔ»ØÊÕÁË¡£Èç¹ûJavaÔÊÐí¶ÔÏóµÄÖ±½Ó·ÃÎÊ(Óë¼òµ¥Êý¾ÝÀàÐ͵ķÃÎÊ·½Ê½ÀàËÆ)£¬ÄÇôÕâÖÖÓÐЧµÄÀ¬»ø»ØÊÕ·½·¨½«ÎÞ·¨ÊµÏÖ¡£
¡¡¡¡JavaµÄÀ¬»ø»ØÊÕ²ßÂÔÔÚÆÕ±éÒâÒåÉÏ·´Ó³ÁËJavaµÄÀíÄî¡£JavaÉè¼ÆÈËÔ±»¨·ÑÁË´óÁ¿µÄ¾«Á¦£¬À´·ÀÖ¹ÆäËû±à³ÌÓïÑÔ¾­³£³öÏֵĵäÐÍÎÊÌ⣬ÀýÈç³ÌÐòÔ±¾­³£Íü¼ÇÊÍ·Å×ÊÔ´£¬»òÕß´íÎóµØÊÍ·ÅÕýÔÚʹÓõÄ×ÊÔ´¡£Òò´Ë£¬Ê¹ÓÃÀ¬»ø»ØÊÕ²ßÂÔÓÐЧµØ±ÜÃâÁË´ËÀàÎÊÌâµÄ·¢Éú¡£
    
      ÍêÃÀµÄ¼òµ¥¶àÏß³ÌÄ£ÐÍ

JavaµÄÉè¼ÆÕßËùÌṩµÄ±à³ÌÌØÐÔ£¬°üÀ¨¶Ô¶àÏ̶߳àÈÎÎñµÄÓïÑÔ¼¶Ö§³Ö¡£¶àÈÎÎñ¾ßÓÐÁ½ÖÖÀàÐÍ£º»ùÓÚ½ø³ÌµÄ¶àÈÎÎñºÍ»ùÓÚÏ̵߳ĶàÈÎÎñ¡£ÔÚ»ùÓÚ½ø³ÌµÄ¶àÈÎÎñÖУ¬×îСµÄ¿Éµ÷¶Èµ¥ÔªÊǽø³Ì¡£½ø³Ìʵ¼ÊÉϾÍÊÇÕýÔÚÖ´ÐеÄÒ»¸ö³ÌÐò¡£Òò´Ë£¬»ùÓÚ½ø³ÌµÄ¶àÈÎÎñ¾ÍÊÇÔÊÐí¼ÆËã»úͬʱÔËÐÐÁ½¸ö»ò¶à¸ö³ÌÐòµÄÌØÐÔ¡£ÔÚ»ùÓÚÏ̵߳ĶàÈÎÎñÖУ¬×îСµÄ¿Éµ÷¶Èµ¥ÔªÊÇÏ̡߳£Ï̶߳¨ÒåÁËÒ»¸ö³ÌÐòÄÚµÄijÌõÖ´Ðз¾¶¡£Òò´Ë£¬Ò»¸ö½ø³Ì¿ÉÒÔ°üº¬ÓÐÁ½¸ö»ò¸ü¶àµÄÖ´ÐÐỊ̈߳¬¶ø¶àÏ̳߳ÌÐò¿ÉÒÔÓÐÁ½¸ö»ò¸ü¶à¸ö¿ÉÒÔ²¢·¢Ö´ÐеIJ¿·Ö¡£
¡¡¡¡¾¡¹Ü»ùÓÚ½ø³ÌµÄ¶àÈÎÎñͨ³£ÊDzÙ×÷ϵͳÌṩµÄ¹¦ÄÜ£¬»ùÓÚÏ̵߳ĶàÈÎÎñÈ´¿ÉÒÔ¼«´óµØÊÜÒæÓÚ³ÌÐòÉè¼ÆÓïÑÔ¼¶±ðµÄÖ§³Ö¡£ÀýÈ磬C++ûÓжԶàÏ̱߳à³ÌÌṩÄÚÖÃÖ§³Ö£¬ÓÚÊǾͱØÐëÒÀÀµÓÚ²Ù×÷ϵͳÀ´´¦Àí¶àÏß³ÌÈÎÎñ¡£Õâ¾ÍÒâζ×Å´´½¨¡¢Æô¶¯¡¢Í¬²½ºÍ½áÊøÏ̶߳¼±ØÐëͨ¹ý¶Ô²Ù×÷ϵͳµÄ¶à´Îµ÷ÓÃÀ´ÊµÏÖ¡£Òò´ËC++ÖеĶàÏ̴߳úÂëÊDz»¿ÉÒÆÖ²µÄ¡£ÕâҲʹµÃC++±à³ÌÖеĶàÏß³ÌûÓеÃÒԹ㷺ӦÓá£
¡¡¡¡ÓÉÓÚJavaÄÚÖÃÁ˶ԶàÏ̵߳ÄÖ§³Ö£¬ÄÄЩÔÚÆäËûÓïÑÔÖбØÐëÓÉÊÖ¹¤Íê³ÉµÄ¹¤×÷£¬ÏÖÔÚ¶¼¿ÉÒÔÓÉJava×Ô¶¯´¦Àí¡£Java¶àÏß³ÌÄ£ÐÍÖÐ×îÓÐÌØÉ«µÄ²¿·ÖÖ®Ò»£¬¾ÍÊÇÆäʵÏÖͬ²½µÄ·½Ê½¡£Í¬²½½¨Á¢ÔÚÁ½ÖÖ´´ÐµÄÌØÐÔÖ®ÉÏ¡£Ê×ÏÈ£¬ÔÚJavaÖУ¬ËùÓеĶÔÏó¶¼Óг䵱»¥³âËøµÄÄÚÖÃÕìÌýÆ÷¡£ÔÚ¸ø¶¨µÄʱ¿Ì£¬ÈκÎÕìÌýÆ÷Ö»ÄÜÓÉÒ»¸öÏß³ÌÓµÓС£Í¨¹ýʹÓÃsynchronized¹Ø¼ü×Ö¶Ô·½·¨½øÐÐÐÞÊΣ¬¿ÉÒÔÆôÓÃËø¶¨ÌØÐÔ¡£ÔÚµ÷ÓÃͬ²½·½·¨Ê±£¬¸Ã¶ÔÏó¾Í±»Ëø¶¨£¬¶øÊÔͼ·ÃÎʸöÔÏóµÄÆäËûÏ߳̾ÍÖ»Äܵȴý¡£Æä´Î£¬Java¶Ôͬ²½µÄÖ§³ÖÒ²¿ÉÒÔ´ÓËùÓÐÀàµÄ¹²Í¬³¬ÀàObjectÖÐÌåÏÖ¡£ObjectÉùÃ÷ÁËÏÂÃæÈý¸öͬ²½·½·¨£ºwait()¡¢notify()ºÍnotifyAll()¡£ÕâЩ·½·¨Ö§³ÖÏ̼߳äͨÐÅ¡£Òò´Ë£¬ËùÓеĶÔÏó¶¼¶ÔÏ̼߳äͨÐÅÓÐÄÚÖõÄÖ§³Ö¡£Í¨¹ýºÍͬ²½·½·¨½áºÏʹÓã¬ÕâЩ·½·¨¿ÉÒÔΪÏ̵߳Ļ¥²Ù×÷Ìṩ¸ß¼¶±ðµÄ¿ØÖÆ¡£
¡¡¡¡Í¨¹ý½«¶àÏß³Ì×÷ΪÓïÑÔµÄÒ»¸öÒ×ÓÚʹÓõÄÄÚÖÃÌØÐÔ£¬Java¸Ä±äÁËÈËÃǹØÓÚ³ÌÐò»ù±¾Ìåϵ½á¹¹µÄ¹ÛÄî¡£ÔÚJava³öÏÖ֮ǰ£¬´ó²¿·Ö³ÌÐòÔ±½«³ÌÐò¿´³ÉÊÇ£¬Ö»ÓÐÒ»ÌõÖ´Ðз¾¶µÄµ¥¿é½á¹¹¡£ÔÚJava³öÏÖÖ®ºó£¬³ÌÐòÑݱäΪ¶à¸ö¿É»¥²Ù×÷µÄ²¢·¢ÈÎÎñµÄ¼¯ºÏ¡£ÕâÖÖ²¢·¢»úÖÆµÄ¸Ä±ä¶ÔÓÚ¼ÆËã²úÉúÁËÉîÔ¶µÄÓ°Ï죬µ«ÊÇÆä×îÖØ´óµÄÓ°Ïì¿ÉÄÜÊÇʹµÃÈí¼þ×é¼þµÄʹÓøüΪ±ã½Ý¡£
ÍêÈ«¼¯³ÉµÄÒì³£»úÖÆ
    Òì³£(exception)µÄ¸ÅÄîÐÔ¿ò¼Ü³öÏÖÔÚJava²úÉú֮ǰ¡£Òò´Ë£¬ÔÚJava³öÏÖ֮ǰ£¬ÆäËû±à³ÌÓïÑÔ¾ÍÒѾ­Ìá³öÁËÒì³£µÄ¸ÅÄî¡£ÀýÈçC++Ìá³öÒì³£¸ÅÄîµÄʱ¼ä£¬¾Í±ÈJavaµ®ÉúµÄʱ¼äÔçÁËÐí¶àÄê¡£Òì³£ÔÚJavaµÄ×î³õÉè¼ÆÖоÍÒѾ­ÒýÈëÁË£¬¶ø²»ÊÇÔÚJava²úÉúÖ®ºó²Å¼ÓÈëµÄ£¬Òò´ËJava¶ÔÓÚÒì³£»úÖÆµÄʵÏÖ¾ÍÏԵ÷dz£ÖØÒª¡£Òì³£»úÖÆÊÇÔÚJavaÓïÑÔÖÐÍêÈ«¼¯³ÉµÄ£¬ÊÇJavaµÄ»ù±¾ÌØÕ÷Ö®Ò»¡£
¡¡¡¡JavaÒì³£»úÖÆµÄ¹Ø¼üÔÚÓÚÒì³£ÊDZØÐëʹÓõ쬶ø²»ÊÇ¿ÉÑ¡µÄ¡£Í¨¹ýÒì³£´¦Àí´íÎóÊÇJavaÓïÑԵĹæÔò£¬ÕâÓëC++ÊÇÓÐÇø±ðµÄ¡£ÀýÈ磬C++ͬÑùÖ§³ÖÒì³£»úÖÆ£¬µ«ÊÇÕâÖÖ»úÖÆ²¢Î´ÍêÈ«¼¯³Éµ½Õû¸ö±à³Ì»·¾³ÖС£¿¼ÂÇ´ò¿ª»òÕß¶Áȡһ¸öÎļþµÄ²Ù×÷¡£ÔÚJavaÖУ¬Èç¹ûij¸ö²Ù×÷·¢Éú´íÎ󣬽«Å׳öÒ»¸öÒì³£¡£¶øÔÚC++ÖУ¬´ò¿ª»òÕß¶ÁÈ¡ÎļþµÄ·½·¨»á·µ»ØÒ»¸öרÓôíÎó´úÂ룬±¨¸æ²Ù×÷Öз¢ÉúµÄ´íÎó¡£ÒòΪC++¿âÈÔÈ»ÒÀÀµÓÚ´íÎ󷵻شúÂë¶ø²»ÊÇÒì³££¬ËùÒÔ´Ó±¾ÖÊÉÏÀ´Ëµ£¬C++²¢²»Ö§³ÖÒì³££¬³ÌÐò±ØÐë²»¶ÏµØ½øÐÐÈ˹¤¼ì²é£¬ÒÔ±ÜÃâ¿ÉÄܳöÏֵĴíÎó¡£µ«ÊÇÔÚJavaÖУ¬³ÌÐòÔ±Ö»ÐèÒª¼òµ¥µØÊ¹ÓÃÒ»¸ötry/catch´úÂë¿é£¬¾Í¿ÉÒÔ×Ô¶¯²¶×½µ½ÈκδíÎó¡£

¶Ô¶à̬ÐÔÖ§³ÖµÄ¸Ä½ø
¶à̬ÐÔ(polymorphism)ÊÇÃæÏò¶ÔÏó±à³ÌµÄÊôÐÔ£¬ËüÔÊÐí¶à¸ö·½·¨Ê¹ÓÃͬһ¸ö½Ó¿Ú¡£Java´Ó¶à¸ö·½ÃæÖ§³Ö¶à̬ÐÔ£¬ÆäÖÐÁ½¸ö·½Ãæ×îΪͻ³ö¡£µÚÒ»¸öÊÇÿ¸ö·½·¨(±ê¼ÇΪ finalµÄ·½·¨³ýÍâ)¶¼¿ÉÒÔ±»×ÓÀàÖØÐ´£»µÚ¶þ¸öÊÇÉèÁ¢interface¹Ø¼ü×Ö¡£ÏÂÃæ½«¸ø³öÕâÁ½·½ÃæµÄÏêϸ½éÉÜ¡£
¡¡¡¡ÓÉÓÚ³¬ÀàÖеķ½·¨¿ÉÒÔÔÚÅÉÉúÀàÖÐÖØÐ´£¬Òò´Ë´´½¨ÀàµÄ²ã´Î½á¹¹·Ç³£¼òµ¥¡£ÔÚÀàµÄ²ã´Î½á¹¹ÖУ¬Ã¿¸ö×ÓÀà¶¼½«ËüµÄ³¬ÀàÌØ»¯(specialization)¡£´ó¼ÒÖªµÀ£¬³¬ÀàµÄÒ»¸öÒýÓÿÉÒÔÒýÓÃËüµÄÈκÎÒ»¸ö×ÓÀ࣬¶øÇÒͨ¹ý³¬ÀàµÄÒýÓõ÷ÓÃij×ÓÀà¶ÔÏóµÄÒ»¸ö·½·¨Ê±£¬»á×Ô¶¯Ö´ÐÐÓɸÃ×ÓÀàÖØÐ´ºóµÄ°æ±¾¡£Òò´Ë£¬¿ÉÒÔÓó¬ÀàÀ´¶¨Òå¶ÔÏóµÄÐÎʽ²¢Ìṩ¶ÔÏóµÄĬÈÏʵÏÖ£¬¶ø×ÓÀà¸ù¾ÝÕâÖÖĬÈÏʵÏÖ½øÐÐÐ޸ģ¬ÒÔ¸üºÃµØÊÊÓ¦¾ßÌåÇé¿öµÄÒªÇó¡£Òò´Ë£¬ÔÚ³¬ÀàÖж¨ÒåµÄÒ»¸ö½Ó¿Ú¿ÉÒÔ×÷Ϊ¶à¸ö²»Í¬ÊµÏֵĻù´¡¡£
¡¡¡¡µ±È»£¬Java½øÒ»²½²ÉÈ¡ÁË¡°Ò»¸ö½Ó¿Ú£¬¶à¸ö·½·¨¡±µÄ¸ÅÄî¡£Ëü¶¨ÒåÁËinterface¹Ø¼ü×Ö£¬ÕâÑù¾Í¿ÉÒÔ½«ÀàµÄ·½·¨ºÍÀàµÄʵÏÖÍêÈ«·ÖÀë¡£¾¡¹Ü½Ó¿ÚÊdzéÏóµÄ£¬µ«ÊÇÈÔÈ»¿ÉÒÔÉùÃ÷½Ó¿ÚÀàÐ͵ÄÒýÓá£Õâ¸ö¸ÅÄî·Ç³£ÖØÒª£¬ÒòΪËü¿ÉÒԸĽø¶à̬ÐÔµÄÓ¦Óá£Ö»ÒªÄ³¸öÀàʵÏÖÒ»¸ö½Ó¿Ú£¬²¢ÇҸýӿÚÌṩÁËijÖÖ¹¦ÄÜ£¬ÄÇôÈκÎÐèÒªÕâÖÖ¹¦ÄܵĴúÂë¶¼¿ÉÒÔʹÓÃÕâ¸öÀàµÄ¶ÔÏó¡£ÀýÈ磬¼ÙÉèij¸ö½Ó¿ÚµÄÃû³ÆÎªMyIF£¬¿¼ÂÇÏÂÃæµÄ·½·¨£º
¡¡¡¡void myMeth(MyIF ob) {
¡¡¡¡// ...
¡¡¡¡}
¡¡¡¡ÈκÎʵÏÖÁËMyIF½Ó¿ÚµÄ¶ÔÏ󶼿ÉÒÔ´«µÝ¸ømyMeth()·½·¨¡£¸Ã¶ÔÏóµÄÆäËû¹¦ÄÜÎÞÐ迼ÂÇ¡£myMeth()·½·¨¿ÉÒÔ¶ÔÈκÎʵÏÖÁËMyIF½Ó¿ÚµÄ¶ÔÏó½øÐвÙ×÷¡£
   ͨ¹ý×Ö½ÚÂë±£Ö¤¿ÉÒÆÖ²ÐԺͰ²È«ÐÔ
ͨ¹ý×Ö½ÚÂë±£Ö¤¿ÉÒÆÖ²ÐԺͰ²È«ÐÔ
¡¡¡¡¾¡¹ÜJavaÓÐÐí¶à¹¦ÄÜÇ¿´óµÄÌØÐÔ£¬µ«ÊÇÈç¹ûûÓÐ×Ö½ÚÂë(byte code)ÕâÒ»ÌØÕ÷£¬ÄÇôJavaÖ»²»¹ýÊDZà³Ì¼¼Êõ·¢Õ¹½ø³ÌÖеÄÒ»¸ö×ãÓ¡¡£×Ö½ÚÂëÊÇJavaÓïÑÔµÄÒ»¸öÖØÒª×é³É²¿·Ö£¬Ëü¶Ô³ÌÐòÔ±¶øÑÔ£¬¼¸ºõÊÇ͸Ã÷µÄ¡£ËùÓеÄJava³ÌÐòÔ±¶¼ÖªµÀ£¬Java±àÒëÆ÷µÄÊä³ö²»ÊÇÄܹ»Ö±½ÓÓÉCPUÖ´ÐеĻúÆ÷Ö¸Á¶øÊÇÒ»ÖÖ¾­¹ý¸ß¶ÈÓÅ»¯µÄ¿ÉÒÆÖ²µÄÖ¸ÁºÏ£¬ÕâÖÖÖ¸ÁºÏ³ÆÎª×Ö½ÚÂ룬ËüÖ»ÄÜÓÉJavaÐéÄâ»ú(Java Virtual Machine£¬JVM)Ö´ÐС£×î³õ£¬JVMÖ»ÊÇÒ»¸ö¼òµ¥µÄ×Ö½ÚÂë½âÊÍÆ÷£¬ÏÖÔÚ£¬JVMÒ²½«×Ö½ÚÂëµÄon-the-fly±àÒë¼¼ÊõÓ¦Óõ½¿ÉÖ´ÐдúÂëÖС£ÎÞÂÛ×Ö½ÚÂëµÄÖ´ÐвÉÓúÎÖÖ·½Ê½£¬ËüµÄÓÅÊÆ¶ÔÓÚJavaµÄ³É¹¦¶¼ÊÇÖÁ¹ØÖØÒªµÄ¡£
¡¡¡¡×Ö½ÚÂëµÄµÚÒ»¸öÓÅÊÆÊÇ¿ÉÒÆÖ²ÐÔ¡£ÎÞÂÛ¼ÆËã»úʹÓúÎÖÖÀàÐ͵ÄCPU(»ò²Ù×÷ϵͳ)£¬Ö»Òª¾ßÓÐJVM£¬ÄÇôÓÉJava³ÌÐò±àÒë¶ø³ÉµÄ×Ö½ÚÂë¾Í¿ÉÒÔÔÚÆäÖÐÖ´ÐС£»»¶øÑÔÖ®£¬Ö»ÒªÎªÄ³¸öÌØ¶¨»·¾³ÊµÏÖÁËJVM£¬ÄÇôÿ¸öJava³ÌÐò¶¼¿ÉÒÔÔڸû·¾³ÔËÐС£Ã»ÓбØÒªÎªÃ¿¸ö²»Í¬µÄ»·¾³´´½¨¶¼µ¥¶ÀÖ´ÐдúÂ룬ÒòΪͬһÖÖ×Ö½ÚÂë¿ÉÒÔÔÚËùÓл·¾³ÖÐÔËÐС£Òò´Ëͨ¹ýʹÓÃ×Ö½ÚÂ룬JavaΪ³ÌÐòÔ±ÌṩÁË¡°Ò»´Î±àд£¬Ëæ´¦ÔËÐС±µÄÄÜÁ¦¡£
¡¡¡¡×Ö½ÚÂëµÄµÚ¶þ¸öÓÅÊÆÊǰ²È«ÐÔ¡£ÓÉÓÚ×Ö½ÚÂëÔÚJVMµÄ¿ØÖÆÏÂÖ´ÐУ¬Òò´ËJVM¿ÉÒÔ·ÀÖ¹Ö´ÐжñÒâ²Ù×÷µÄJava³ÌÐò¡£±£Ö¤Ö÷»ú°²È«µÄÄÜÁ¦¶ÔÓÚJavaµÄ³É¹¦ÊÇÖÁ¹ØÖØÒªµÄ£¬ÒòΪËüÔÊÐí´´½¨Applet¡£ÓÉÓÚAppletÊÇ¿ÉÒÔͨ¹ýInternet¶¯Ì¬ÏÂÔØµÄС³ÌÐò£¬Òò´Ë±ÜÃâAppletÆÆ»µÖ÷»úµÄ»úÖÆÊǷdz£±ØÒªµÄ¡£×Ö½ÚÂëºÍJVMµÄ½áºÏ£¬»¹±£Ö¤ÁËAppletµÄ°²È«ÏÂÔØ¡£¿ÉÒÔ˵£¬Èç¹ûûÓÐ×Ö½ÚÂ룬ÄÇôWeb¿ÉÄܸù±¾ÎÞ·¨´ïµ½½ñÌìµÄµØÎ»ºÍÓ°Ïì¡£
·á¸»µÄJava API
¡¡¡¡´Ó¸ÅÄîÉÏÀ´½²£¬¼ÆËã»úÓïÑÔÓÉÁ½²¿·Ö×é³É¡£Ò»ÊÇÓïÑÔ±¾Éí£¬Óɹؼü×ÖºÍÓï·¨¶¨Ò壻¶þÊDZê×¼¿â£¬°üº¬Ò»×éÃæÏò³ÌÐòÔ±µÄÀà¡¢½Ó¿ÚºÍ·½·¨¡£¾¡¹ÜÏÖÔÚËùÓеÄÖ÷Á÷±à³ÌÓïÑÔ¶¼ÌṩÁË´óÁ¿µÄ¿â£¬µ«ÊÇJava¶¨ÒåµÄ¿âÓÉÓÚ¸üΪ·á¸»ºÍ¶àÑùÏԵ÷dz£Í»³ö¡£ÈËÃÇÔÚ×î³õ´´½¨Javaʱ£¬ËüµÄ¿â°üÀ¨Ò»×éºËÐijÌÐò°ü£¬ÀýÈçjava.lang¡¢java.ioºÍjava.net¡£Ëæ×ÅJava²»¶Ï·¢²¼Ðµİ汾£¬ÐµÄÀàºÍ³ÌÐò°üÒ²±»²»¶Ï¼ÓÈë¡£Èç½ñµÄJavaÒѾ­Îª³ÌÐòÔ±ÌṩÁ˹¦Äܼ«ÆäÇ¿´óµÄ¿âº¯Êý¡£
¡¡¡¡´ÓJava´´½¨Ö®³õ£¬Javaº¯Êý¿â¾ÍÓëÆäËûÓïÑԵĺ¯Êý¿âÓÐËù²»Í¬£¬ÆäÖÐÒ»¸ö¹Ø¼ü²»Í¬Ö®´¦£¬ÔÚÓÚJava¿â¶ÔÍøÂçµÄÖ§³Ö¡£ÔÚ¿ª·¢JavaµÄʱºò£¬ÆäËûÓïÑÔ(ÀýÈçC++)²¢Ã»ÓÐÌṩ(ÏÖÔÚÈÔȻûÓÐÌṩ)´¦ÀíÍøÂçµÄ±ê×¼º¯Êý¡£Javaͨ¹ýÌṩÏàÓ¦µÄÀ࣬ʹµÃÁ¬½ÓºÍʹÓÃInternetµÄ´¦Àí·Ç³£·½±ã£¬´Ó¶øÓÐÁ¦µØÍƶ¯ÁËInternet¸ïÃüµÄ½ø³Ì¡£JavaÏòËùÓеijÌÐòÔ±¿ª·ÅÁËInternet£¬¶ø²»½ö½ö¾ÖÏÞÓÚ¾«Í¨ÍøÂç±à³ÌµÄÄDz¿·ÖÈË¡£java.netµÄ¹¦ÄܸıäÁ˼ÆËãµÄÐÎʽ¡£
¡¡¡¡JavaºËÐÄ¿âÖеÄÁíÍâÒ»¸ö¹Ø¼üµÄ³ÌÐò°üÊÇjava.awt£¬ËüÖ§³Ö³éÏó´°¿Ú¹¤¾ß¼¯(Abstract Window Toolkit£¬AWT)¡£³ÌÐòÔ±¿ÉÒÔÓÃAWT´´½¨¿ÉÒÆÖ²µÄ¡¢»ùÓÚGUIµÄ´úÂë¡£Ò²¾ÍÊÇ˵£¬³ÌÐòÔ±ÓÃAWTÀà¿ÉÒÔ´´½¨Ò»¸ö»ùÓÚÊÓ´°µÄÓ¦ÓóÌÐò£¬²¢ÔÚ³ÌÐòÖÐʹÓø÷ÖÖ±ê×¼µÄGUIÔªËØ£¬ÀýÈç¹ö¶¯Ìõ¡¢¸´Ñ¡¿òºÍµ¥Ñ¡¿òµÈ¡£ÓÉÓÚAWTµÄ´æÔÚ£¬³ÌÐòÔ±´´½¨µÄGUIÓ¦ÓóÌÐò¿ÉÒÔÔËÐÐÔÚÈκÎÖ§³ÖJavaÐéÄâ»úµÄ»·¾³ÖС£¶øÕâÖÖ²ã´ÎÉϵÄGUIÒÆÖ²ÐÔ£¬ÔÚJava֮ǰÊÇ´ÓÀ´Ã»ÓйýµÄ¡£
¡¡¡¡ÔÚJavaÖмÓÈëAWT³¹µ×¸Ä±äÁ˳ÌÐòԱ˼¿¼Ó¦ÓóÌÐò»·¾³µÄ·½Ê½¡£ÔÚJavaǰʱ´ú£¬»ùÓÚGUIµÄ³ÌÐò±ØÐëÃ÷È·Ö¸³öÆäÖ´Ðл·¾³¡£ÕâÒâζ×ÅÈκÎWindows³ÌÐòÐèÒªÖØÐ±àÒë²ÅÄܹ»ÔÚһ̨Apple»úÉÏÔËÐС£Javaͨ¹ýÒ»¸ö¿ÉÒÆÖ²µÄGUIÌṩͳһµÄ±à³Ì»·¾³¡£
¡¡¡¡ºóÀ´Java£ºSwingÒ²±»¼ÓÈëJavaÖУ¬ÕâÊÇAWTµÄÒ»¸öÇáÐÍʵÏÖ¡£Swing×é¼þ°üº¬ÔÚjavax.swing¼°Æä×Ó³ÌÐò°üÖС£SwingΪ³ÌÐòÔ±ÌṩÁËÒ»×é·á¸»µÄGUI×é¼þ¡£ÓëAWTÏà±È£¬ËüÃǵĿÉÒÆÖ²ÐÔ¸ü¸ß¡£±¾Ê齫ͨ¹ýÐí¶àÀý×ÓÀ´ÑÝʾAWTºÍSwingÈçºÎΪ³ÌÐòÔ±Ìṩº¯Êý£¬Ê¹ËûÃǾßÓбàд¸ßЧ¡¢¿ÉÒÆÖ²µÄGUIÓ¦ÓóÌÐòµÄÄÜÁ¦¡£
¡¡¡¡Èç½ñ£¬Java¿âÒѾ­»ùÓÚ×î³õµÄºËÐÄ¿âµÃµ½Á˼«´ó·¢Õ¹¡£JavaµÄÿ¸öа汾¶¼»áÌṩһЩеĿ⡣еijÌÐò°ü²»¶ÏÔö¼Ó£¬ÐµĹ¦ÄÜÒ²²»¶Ï¼ÓÈëÒÑÓеijÌÐò°üÖС£Java¿âµÄ·¢Õ¹¹ý³Ì´¦ÓÚÒ»¸öÁ¬ÐøµÄ״̬£¬ÒòΪJava±ØÐëÄܹ»ÊÊÓ¦¿ìËÙÑݱäµÄ¼ÆËã»·¾³¡£ÕâÖÖÔÚ¶ÌÆÚÄÚÊÊÓ¦ºÍ±ä»¯µÄÄÜÁ¦Ò²ÊÇJavaµÄ¾«ËèÖ®Ò»¡£
Applet
¡¡¡¡AppletÊÇJava×î¾ßÓиïÃüÒâÒåµÄÌØÕ÷Ö®Ò»£¬ÒòΪËüÄܹ»´´½¨¿ÉÒÆÖ²µÄ¡¢¿É¶¯Ì¬ÏÂÔØµÄ¡¢Äܹ»ÔÚä¯ÀÀÆ÷µÄÏÞ¶¨Ï°²È«Ö´ÐеijÌÐò¡£ÈËÃÇÈç½ñÒѾ­ÆÕ±é½ÓÊÜÕâÒ»¹Ûµã£¬µ«ÊÇÔÚJavaǰʱ´ú£¬ÕâÖÖ¿ÉÖ´ÐÐÄÚÈÝ(executable content)Êܵ½¹ã·ºÖÃÒÉ£ºÒ»¸öÒÉÎÊÊÇ£¬¶ñÒâ³ÌÐòÊÇ·ñ»á¶Ô¿Í»§»úÔì³ÉÉ˺¦£»ÁíÍâÒ»¸öÒÉÎÊÊÇ£ºÎªÄ³ÖÖÀàÐ͵ÄCPUºÍ²Ù×÷ϵͳ±àÒëµÄ´úÂëÔÚÁíÒ»ÖÖϵͳÉÏ¿ÉÄÜÎÞ·¨Õý³£ÔËÐС£ÓÉÓÚÁ¬½Óµ½InternetµÄCPUºÍ²Ù×÷ϵͳÖÖÀà·±¶à£¬ÄÇô¶ÔÓÚij¸ö³ÌÐò£¬ÎªÃ¿Ò»ÀàÐ͵Ļ·¾³¶¼´´½¨Ò»¸ö¶ÀÁ¢µÄÔËÐа汾ÊDz»ÇÐʵ¼ÊµÄ¡£Java AppletΪÒÔÉÏÁ½¸öÎÊÌâÌṩÁËÒ»Ì׺ܺõĽâ¾ö·½°¸¡£Í¨¹ýʹÓÃApplet£¬Web³ÌÐòÔ±¿ÉÒÔ·½±ãµØÔÚ¾²Ì¬µÄHTMLÒ³ÃæÖÐÌí¼Ó¶¯Ì¬µÄÄÚÈÝ¡£Java AppletÊ¹ÍøÒ³±äµÃÉú¶¯ÆðÀ´£¬´Ó´Ë¸æ±ðÁ˾²Ì¬ÍøÒ³µÄÄê´ú¡£
¡¡¡¡³ýÁ˸ıäÈËÃǶÔÓÚWebÄÚÈݵÄ˼ά·½Ê½Ö®Í⣬Applet»¹ÓÐÒ»¸öÖØÒªµÄÓ°Ï졪¡ªËüÍÆ¶¯ÁË×é¼þÈí¼þ¿ª·¢µÄ·¢Õ¹(Ò²¿ÉÄÜÊÇÒ»¸ö¸±×÷ÓÃ)¡£ÓÉÓÚAppletÊÇС³ÌÐò£¬Òò´ËËüÃÇͨ³£´ú±íºÜСµÄ¹¦Äܵ¥Ôª£»¶øÈí¼þ×é¼þÕýÊÇ»ùÓÚÕâÖÖ˼Ïë¡£Ö»Òª°´ÕÕAppletµÄ˼ά¿¼ÂÇÎÊÌ⣬ÄÇô¾ÍÏòBeansµÄ˼ÏëÂõ³öÁËһС²½£¬ÉõÖÁ¸ü¶à¡£ÔÚÃæÏò×é¼þµÄÌåϵ½á¹¹ÖУ¬Ò»¸öÓ¦ÓóÌÐòÓÉһЩ»¥Ïà×÷ÓõÄ×é¼þ¹¹³É¡£Èç½ñÕâÖÖÌåϵ½á¹¹ÒѾ­´óÁ¿È¡´úÁËÒÔÍù±à³ÌģʽÖг£¼ûµÄͳһģÐÍ¡£
¼ÌÐø±ä¸ï
JavaµÄ¾«Ë軹ÌåÏÖÔÚÁíÍâÒ»¸ö·½Ã棬¾¡¹ÜËüʵ¼ÊÉϲ¢²»ÊôÓÚJavaÓïÑÔµÄÒ»²¿·Ö¡£JavaÒýÈëÁËÒ»ÖÖÀÖÓÚ½ÓÊÜÐÂ˼ÏëµÄ´´ÐÂÎÄ»¯£¬ÒÔ¼°Ò»¸öÄܹ»Ñ¸ËÙÎüÊÕÕâЩÐÂ˼ÏëµÄ¹ý³Ì¡£ËäÈ»ºÜ¶à¼ÆËã»úÓïÑԱ仯»ºÂý£¬µ«ÊÇJavaÈ´´¦ÓÚ²»Í£µØ·¢Õ¹ºÍÊÊÓ¦µÄ¹ý³ÌÖ®ÖС£Í¬Ê±£¬Õâ¸ö¹ý³Ìͨ¹ýJavaÉçÍÅ(JCP)ÏòÕû¸öJavaÍÅÌ幫¿ª¡£JCPÌṩÁËÒ»ÖÖ»úÖÆ£¬JavaÓû§¿ÉÒÔͨ¹ý¸Ã»úÖÆÐ­Öú¾ö¶¨JavaÓïÑÔ¡¢¹¤¾ßºÍÏà¹Ø¼¼ÊõµÄδÀ´·¢Õ¹·½Ïò¡£Òò´Ë£¬Êµ¼ÊʹÓÃJavaÓïÑÔµÄÈËÃÇ¿ÉÒÔ²ÎÓëµ½ËüµÄ·¢Õ¹ÖÐÀ´¡£
¡¡¡¡´Óµ®ÉúÖ®³õ¿ªÊ¼£¬Java¾ÍΪ±à³ÌÁìÓò´øÀ´Á˱ä¸ï¡ª¡ª ²¢ÇÒÕâ¸ö±ä¸ïÈÔȻûÓÐÍ£Ö¹¡£JavaÈÔÈ»´¦ÓÚ¼ÆËã»úÓïÑÔ·¢Õ¹µÄÇ°ÑØ£¬ËüÔÚ¼ÆË㷢չʷÉÏÒÑÕ¼ÓÐÁËÓÀºãµÄµØÎ»¡£
µÚ¶þ²¿·Ö µÝ¹éϽµµÄ±í´ïʽ½âÎöÆ÷
ÈçºÎ±àдһ¸ö³ÌÐò£¬Ê¹Ö®½ÓÊÕ°üº¬Êý×Ö±í´ïʽµÄ×Ö·û´®(Èç(10-5)*3 )×÷ΪÊäÈ룬²¢Í¨¹ý¼ÆËãµÃµ½ÕýÈ·µÄÊä³ö½á¹ûÄØ£¿Ò²ÐíÖ»ÓÐÉÙÊýµÄ¡°´óʦ¼¶¡±³ÌÐòÔ±²ÅÄܹ»×öµ½ÕâÒ»µã¡£±í´ïʽ½âÎö¹ý³Ì½«ËãÊõ±í´ïʽת»¯Îª¼ÆËã»ú¿ÉÒÔʶ±ðµÄÐÎʽ¡£ËüÒ²ÊÇËùÓÐÐèÒª½øÐбí´ïʽת»»µÄÈí¼þµÄºËÐÄ£¬ÕâЩÈí¼þ°üÀ¨ÓïÑÔ±àÒëÆ÷ºÍ½âÊÍÆ÷¡¢µç×ÓÖÆ±íÈí¼þµÈµÈ¡£
±í´ïʽ
ÓÉÓÚ½âÎöÆ÷´¦ÀíµÄ¶ÔÏóÊDZí´ïʽ£¬Òò´ËÓбØÒª½éÉܱí´ïʽµÄ×é³É¡£ËäÈ»±í´ïʽµÄÀàÐͶàÖÖ¶àÑù£¬µ«±¾ÕÂÖ»´¦ÀíÒ»ÖÖÀàÐÍ£ºÊýÖµ±í´ïʽ¡£ÊýÖµ±í´ïʽÓÉÏÂÁÐÔªËØ×é³É£º
¡¡¡¡¡ñ Êý×Ö
¡¡¡¡¡ñ ÔËËã·û+¡¢¨C¡¢/¡¢*¡¢^¡¢%¡¢=
¡¡¡¡¡ñ Ô²À¨ºÅ
¡¡¡¡¡ñ ±äÁ¿
¡¡¡¡ÆäÖУ¬^ÔËËã·û±íʾÇóÃÝÔËËã(²»ÊÇJavaÖй涨µÄXORÔËËã)£¬£½ÊǸ³ÖµÔËËã·û¡£ÕâÐ©ÔªËØ°´ÕÕ´úÊýѧµÄ¹æÔò×éºÏ³É±í´ïʽ¡£ÀýÈ磺
¡¡¡¡ 10 ¨C 8
¡¡¡¡ (100 ¨C 5) * 14/6
¡¡¡¡ a + b ¨C c
¡¡¡¡ 10^5
¡¡¡¡ a = 10 ¨C b
¡¡¡¡Ã¿¸öÔËËã·ûµÄÓÅÏȼ¶Èç±í2-1ËùÁУº
¡¡¡¡±í2-1 ÔËËã·ûÓÅÏȼ¶
¡¡¡¡×î¸ßÓÅÏȼ¶×îµÍÓÅÏȼ¶ + - (Õý¸ººÅ)
¡¡¡¡ ^
¡¡¡¡ * / %
¡¡¡¡ + -
¡¡¡¡ =¡¡¡¡
¡¡¡¡ÓÅÏȼ¶ÏàµÈµÄÔËËã·û°´ÕÕ´Ó×óµ½ÓÒµÄ˳Ðò¼ÆËã¡£
¡¡¡¡±¾Õ½éÉܵĽâÎöÆ÷±ØÐëÂú×ãÒÔÏÂÒ»Ð©Ô¼ÊøÌõ¼þ£ºµÚÒ»£¬ËùÓбäÁ¿¶¼Êǵ¥¸ö×Öĸ(´ÓAµ½ZµÄ26¸ö±äÁ¿)£¬×Öĸ²»Çø·Ö´óСд(°ÑaºÍAÊÓΪͬһ¸ö±äÁ¿)¡£µÚ¶þ£¬¼Ù¶¨ËùÓеÄÊý×Ö¶¼ÊÇdoubleÀàÐÍ£¬¿ÉÒÔ·½±ãµØÐ޸ĽâÎöÆ÷´Ó¶ø´¦ÀíÆäËûÀàÐ͵ÄÖµ¡£×îºó£¬Îª±£Ö¤Âß¼­ÇåÎúºÍÀí½â·½±ã£¬½âÎöÆ÷Ö»½øÐлù±¾µÄ´íÎó¼ì²é¡£
½âÎö±í´ïʽ
ûÓжԱí´ïʽ½âÎö½øÐÐÈ«ÃæË¼¿¼µÄÈË£¬»áÈÏΪÕâ¸öÎÊÌâ·Ç³£¼òµ¥£¬µ«Êµ¼ÊÉϲ¢·ÇÈç´Ë¡£ÎªÁ˸üºÃÀí½âÕâÒ»µã£¬¼ÆËãÏÂÃæµÄ¼òµ¥±í´ïʽ£º
¡¡¡¡ 10¨C2*3
¡¡¡¡ÖÚËùÖÜÖª£¬Õâ¸ö±í´ïʽµÄ½á¹ûµÈÓÚ4¡£±àдһ¸ö³ÌÐò¼ÆËãij¸öÌØ¶¨µÄ±í´ïʽ·Ç³£ÈÝÒ×£¬µ«ÎÊÌâÔÚÓÚÈçºÎ´´½¨Ò»¸ö³ÌÐò£¬À´ÎªÈÎÒâµÄ±í´ïʽ¸ø³öÕýÈ·µÄ´ð°¸¡£Ê×ÏÈ¿¼ÂÇÏÂÃæµÄÔËËã·¨Ôò£º
¡¡¡¡a = get first operand
¡¡¡¡while(operands present) {
¡¡¡¡op = get operator
¡¡¡¡b = get second operand
¡¡¡¡a = a op b
¡¡¡¡}
¡¡¡¡¸Ã·½·¨ÒÀ´Î»ñµÃµÚÒ»¸ö²Ù×÷Êý¡¢ÔËËã·ûºÍµÚ¶þ¸ö²Ù×÷ÊýÒÔÖ´ÐеÚÒ»¸ö²Ù×÷£»È»ºó»ñµÃÏÂÒ»¸öÔËËã·ûºÍ²Ù×÷ÊýÒÔÖ´ÐÐÏÂÒ»¸ö²Ù×÷£¬ÒÀ´ËÀàÍÆ¡£È»¶ø£¬Èç¹û²ÉÓÃÕâÖÖ»ù±¾·½Ê½¼ÆËãÉÏÃæµÄ±í´ïʽ£¬ÄÇô10 ¨C 2 * 3µÄ½á¹û½«ÊÇ24(Ò²¾ÍÊÇ8*3)¶ø²»ÊÇ4¡£ÕâÊÇÒòΪÉÏÊö¹ý³ÌºöÂÔÁËÔËËã·ûµÄÓÅÏȼ¶¡£ÏñÕâÑù´Ó×óµ½ÓÒÒÀ´Î»ñÈ¡²Ù×÷ÊýºÍÔËËã·ûµÄ·½·¨ÊÇÐв»Í¨µÄ£¬ÒòΪ´úÊýѧ¹æ¶¨³Ë·¨ÔËËã±ØÐëÏÈÓÚ¼õ·¨ÔËËãÍê³É¡£Ò²ÐíÓÐЩ³õѧÕßÈÏΪ½â¾öÕâ¸öÎÊÌâºÜÈÝÒ×£¬¶øÇÒʵ¼ÊÉÏÔÚijЩÓÐÏÞµÄÌõ¼þÏÂȷʵÈç´Ë¡£µ«Êǵ±±í´ïʽÖÐÔö¼ÓÁËÔ²À¨ºÅ¡¢ÇóÃÝÔËËã¡¢±äÁ¿¡¢Ò»ÔªÔËËã·ûµÈÔªËØÖ®ºó£¬ÎÊÌâÖ»»á±äµÃ¸üΪ¸´ÔÓ¡£
¡¡¡¡¾¡¹Ü±àд´¦Àí±í´ïʽµÄ´úÂëÓкܶàÖÖ·½Ê½£¬µ«ÊDZ¾Õ½éÉܵÄÒ»ÖÖ×îÈÝÒ×ÓɸöÈË¿ª·¢Íê³É£¬³ÆÖ®ÎªµÝ¹éÏòϵĽâÎöÆ÷¡£ÔÚÔĶÁ±¾ÕµĹý³ÌÖУ¬¶ÁÕß»áÃ÷°×ÕâÑùÃüÃûµÄÔ­Òò(ÆäËûһЩ½âÎöÆ÷µÄ±àд·½·¨Ê¹ÓÃÁËһЩ¸´Ôӵıí¸ñ£¬ÕâЩ±í¸ñͨ³£ÓÉÁíһЩ¼ÆËã»ú³ÌÐòÉú³É¡£ÕâЩ½âÎöÆ÷ÓÐʱҲ³ÆÎª±í¸ñÇý¶¯(table-driven)µÄ½âÎöÆ÷)¡£

±í´ïʽµÄ½âÎö
½âÎöºÍ¼ÆËã±í´ïʽµÄ·½Ê½ÓкܶàÖÖ¡£ÔÚʹÓõݹéϽµµÄ½âÎöÆ÷ʱ£¬±í´ïʽ±»ÊÓΪµÝ¹éµÄÊý¾Ý½á¹¹¡ª¡ª ±í´ïʽÓÉÆä±¾ÉíÀ´¶¨Òå¡£¼Ù¶¨±í´ïʽֻÄÜʹÓÃ+¡¢-¡¢*¡¢/ºÍÔ²À¨ºÅ£¬ÄÇôËùÓеıí´ïʽ¿ÉÒÔÓÃÏÂÃæµÄ¹æÔòÀ´¶¨Ò壺
¡¡¡¡ ±í´ïʽ ¨¤Ïî [+Ïî] [¨CÏî]
¡¡¡¡ ÏÒòÊý[*ÒòÊý] [/ÒòÊý]
¡¡¡¡ ÒòÊý¨¤±äÁ¿¡¢Êý×Ö»òÕß(±í´ïʽ)
¡¡¡¡·½À¨ºÅÀïÃæ±íʾ¿ÉÑ¡ÔªËØ£¬¶ø¼ýÍ·¨¤±íʾ¼ýÍ·Ç°ÃæµÄÔªËØÓɼýÍ·ºóÃæµÄÔªËØ¶¨Òå²úÉú¡£Êµ¼ÊÉÏ£¬¸Ã¹æÔòͨ³£±»³ÆÎª±í´ïʽµÄÉú³É¹æÔò¡£Òò´Ë£¬¶ÔÓÚÏîµÄ¶¨Òå¿ÉÒÔÕâÑù±íÊö£º¡°ÏîÓÉÒòÊý³ËÒÔÒòÊý»òÕßÒòÊý³ýÒÔÒòÊý²úÉú¡£¡±ÐèҪעÒâµÄÊÇ£¬ÔËËã·ûµÄÓÅÏȼ¶ÒѾ­Òþº¬ÔÚ±í´ïʽµÄ¶¨ÒåÖС£
¡¡¡¡ÏÂÃæ¾ÙÀý˵Ã÷±í´ïʽµÄ½âÎö¹ý³Ì¡£±í´ïʽ
¡¡¡¡ 10 + 5 * B
¡¡¡¡ÓÐÁ½¸öÏ10ºÍ5*B£¬µÚ¶þÏî°üÀ¨Á½¸öÒòÊý£º5ºÍB£¬·Ö±ðÊÇÒ»¸öÊý×ÖºÍÒ»¸ö±äÁ¿¡£
¡¡¡¡ÏÂÃæ¿´ÁíÍâÒ»¸öÀý×Ó¡£±í´ïʽ
¡¡¡¡ 14 * (7 ¨C C)
¡¡¡¡ÓÐÁ½¸öÒòÊý£º14ºÍ(7-C)£¬·Ö±ðÊÇÒ»¸öÊý×ÖºÍÒ»¸öÔ²À¨ºÅ±í´ïʽ¡£Ô²À¨ºÅ±í´ïʽ°üÀ¨Á½¸öÏһ¸öÊý×ÖºÍÒ»¸ö±äÁ¿¡£
¡¡¡¡ÉÏÊö¹ý³ÌÐγÉÁ˵ݹéϽµ½âÎöÆ÷µÄ»ù´¡¡£µÝ¹éϽµ½âÎöÆ÷ÊÇÒ»×黥ÏàµÝ¹éµÄ·½·¨£¬ÕâЩ·½·¨ÒÔÒ»ÖÖÁ´Ê½·½Ê½ÊµÏÖÉú³É¹æÔò¡£ÔÚÿ¸öÊʵ±µÄ²½ÖèÉÏ£¬½âÎöÆ÷ÒÔ´úÊýѧ¹æ¶¨µÄÕýȷ˳ÐòÖ´ÐÐÖ¸¶¨µÄ²Ù×÷¡£ÎªÁ˽âÊÍÈçºÎʹÓÃÉú³É¹æÔòÀ´½âÎö±í´ïʽ£¬²ÉÓÃÏÂÃæµÄ±í´ïʽÀ´¸ú×Ù½âÎö¹ý³Ì£º
¡¡¡¡ 9/3 ¨C (100 + 56)
¡¡¡¡Õû¸ö½âÎö¹ý³ÌÈçÏ£º
¡¡¡¡(1) »ñµÃµÚÒ»Ïî9/3£»
¡¡¡¡(2) »ñµÃµÚÒ»ÏîµÄÁ½¸öÒòÊý²¢Íê³É³ý·¨ÔËË㣬µÃµ½½á¹û3£»
¡¡¡¡(3) »ñµÃµÚ¶þÏî(100+56)¡£ÔÚÕâÒ»²½Æô¶¯µÝ¹é·ÖÎö¹ý³Ì´¦ÀíÀ¨ºÅÄÚµÄ×Ó±í´ïʽ£»
¡¡¡¡(4) »ñµÃÆäÖеÄÁ½Ïî²¢Íê³É¼Ó·¨ÔËË㣬µÃµ½½á¹û156£»
¡¡¡¡(5) ´ÓµÚ¶þÏîµÄµÝ¹é¼ÆËã¹ý³ÌÖзµ»Ø£»
¡¡¡¡(6) 3¼õÈ¥156£¬´ð°¸ÊÇ-153¡£
¡¡¡¡Èç¹û¶ÁÕß¶ÔÓڵݹéµÄÀí½âÓÐЩÀ§ÄÑ£¬²»Òª¾ÚÉ¥¡£µÝ¹éÊÇÒ»¸öÏ൱¸´ÔӵĸÅÄÐèÒªÂýÂýÀ´Ï°¹ß¡£¶ÔÓÚ±í´ïʽµÄÕâÖֵݹé¹ý³Ì£¬Çë¼ÇסÁ½¸ö»ù±¾¸ÅÄµÚÒ»£¬ÔËËã·ûµÄÓÅÏȼ¶Òþº¬ÔÚÉú³É¹æÔòµÄ¶¨Ò巽ʽÖУ»µÚ¶þ£¬ÕâÖֵݹé½âÎöºÍ¼ÆËã±í´ïʽµÄ·½Ê½¸úÈËÃǼÆËãÊýѧ±í´ïʽµÄ·½Ê½·Ç³£ÏàËÆ¡£
¡¡¡¡±¾Õ½ÓÏÂÀ´½«½éÉÜÁ½¸ö½âÎöÆ÷£ºµÚÒ»¸öÄܹ»½âÎöºÍ¼ÆËã½öÓɳ£Á¿Êý¾Ý×é³ÉµÄdoubleÀàÐ͸¡µã±í´ïʽ£¬¸Ã½âÎöÆ÷˵Ã÷µÝ¹éϽµ½âÎö·½·¨µÄ»ù±¾Ô­Àí£»µÚ¶þ¸öÔòÔö¼ÓÁ˶ԱäÁ¿µÄ´¦Àí¡£
±í´ïʽµÄ·Ö½â
ΪÁ˼ÆËã±í´ïʽµÄÖµ£¬½âÎöÆ÷ÐèÒª·Ö½â³ö±í´ïʽµÄ¶ÀÁ¢ÔªËØ¡£ÀýÈç±í´ïʽ£º
¡¡¡¡ A * B ¨C (W + 10)
¡¡¡¡°üÀ¨ÏÂÃæÕâЩ¶ÀÁ¢ÔªËØ£ºA¡¢*¡¢B¡¢¨C¡¢(¡¢W¡¢+¡¢10ºÍ)¡£ÔÚ½âÎöÊõÓïÖУ¬ÕâÑùµÄ±í´ïÊ½ÔªËØ±»³ÆÎª±êʶ·û(token)£¬±íʾ±í´ïʽÖÐÒ»¸ö²»¿ÉÔٷֵĶÀÁ¢µ¥Ôª¡£ÔÚÏêϸ½éÉܽâÎöÆ÷֮ǰ£¬ÏÈ¿´¿´±í´ïʽµÄ±êʶ·½·¨£¬ÒòΪËüÊǽâÎöµÄ»ù´¡¡£
¡¡¡¡ÎªÁ˽«±í´ïʽ·ÖÀëΪµ¥¸ö±êʶ·û£¬ÐèÒªÉè¼ÆÒ»¸ö¹ý³Ì£¬´ÓÍ·µ½Î²µØÉ¨Ãè±í´ïʽ£¬²¢Ë³ÐòµØ·µ»Ø±í´ïʽµÄÿ¸ö±êʶ·û¡£¸Ã·½·¨±ØÐëÈ·¶¨Ã¿¸ö±êʶ·ûµÄÀàÐÍ£¬¶øÇÒ±ØÐëʶ±ð±í´ïʽµÄ½áβ¡£ÔÚ±¾½Ú½éÉܵĽâÎöÆ÷ÖУ¬ÊµÏÖÕâЩ¹¦Äܵķ½·¨ÃûΪgetToken()¡£
¡¡¡¡±¾Õ½éÉܵÄÁ½¸ö½âÎöÆ÷¶¼·â×°ÔÚParserÀàÖС£¾¡¹ÜÏÂÎĶÔÕâ¸öÀà½øÐÐÁËÏêϸÃèÊö£¬µ«ÊÇÏÖÔÚ±ØÐëÌáǰ˵Ã÷ËüµÄµÚÒ»²¿·Ö£¬ÒÔ±ã¶ÁÕßÀí½âgetToken()·½·¨µÄ¹¤×÷¹ý³Ì¡£ParserÀàÊ×Ïȶ¨ÒåÁËһЩfinal±äÁ¿ºÍÓò£¬ÈçÏ£º
¡¡¡¡class Parser {
¡¡¡¡// These are the token types.
¡¡¡¡final int NONE = 0;
¡¡¡¡final int DELIMITER = 1;
¡¡¡¡final int VARIABLE = 2;
¡¡¡¡final int NUMBER = 3;¡¡¡¡
¡¡¡¡// These are the types of syntax errors.
¡¡¡¡final int SYNTAX = 0;
¡¡¡¡final int UNBALPARENS = 1;
¡¡¡¡final int NOEXP = 2;
¡¡¡¡final int DIVBYZERO = 3;
¡¡¡¡
¡¡¡¡// This token indicates end-of-expression.
¡¡¡¡final String EOE = "\0";
¡¡¡¡
¡¡¡¡private String exp; // refers to expression string
¡¡¡¡private int expIdx; // current index into the expression
¡¡¡¡private String token; // holds current token
¡¡¡¡private int tokType; // holds token's type
¡¡¡¡ÔÚ±í´ïʽ½âÎöµÄ¹ý³ÌÖУ¬Ã¿¸ö±êʶ·û±ØÐëÓÐÒ»¸öÓëÖ®Ïà¹ØµÄÀàÐÍ¡£Òò´ËParserÀàÊ×Ïȶ¨ÒåÁ˼¸¸ö³£Êý£¬±íÃ÷±êʶ·ûµÄ¸÷¸ö²»Í¬ÀàÐÍ¡£±¾ÕÂÖÐËù½éÉܵĽâÎöÆ÷Ö»Óõ½3ÖÖÀàÐÍ£º±äÁ¿¡¢ÊýÖµºÍ·Ö¸ô·û£¬ËüÃÇ·Ö±ðÓɳ£Á¿VARIABLE¡¢NUMBERºÍDELIMITER±íʾ¡£DELIMITER¼È¿ÉÒÔÊÇÔËËã·û£¬Ò²¿ÉÒÔÊÇÀ¨ºÅ¡£´ËÍ⣬NONEÀàÐͽö½ö×÷Ϊ䶨Òå±êʶ·ûµÄÒ»¸öռλ·û¡£
¡¡¡¡½ÓÏÂÀ´£¬Parser¶¨ÒåÁËÁíÍ⼸¸ö´íÎó³£Á¿£¬ËüÃÇ´ú±í½âÎöºÍ¼ÆËã±í´ïʽµÄ¹ý³ÌÖпÉÄÜ·¢ÉúµÄ²»Í¬ÀàÐ͵ĴíÎó¡£SYNTAX´ú±íËùÓе¼Ö·ÇÕýÔò±í´ïʽµÄ´íÎó£»UNBALPARENS±íʾÀ¨ºÅ²»¶Ô³ÆµÄ´íÎó£»Èç¹û½âÎöÆ÷Ö´ÐÐʱûÓбí´ïʽ±»Ìá½»£¬¾Í»á±¨¸æÒ»¸öNOEXP´íÎó£»DIVBYZEROÔò±íʾ³ýÊýΪÁãµÄ´íÎó¡£
¡¡¡¡final±äÁ¿EOE±êÖ¾½âÎöÆ÷ÒÑ´ïµ½±í´ïʽµÄ½áβ¡£
¡¡¡¡±»½âÎöµÄ±í´ïʽ±£´æÔÚÒ»¸ö×Ö·û´®ÖУ¬exp±äÁ¿Ôò´æ´¢¶Ô¸Ã×Ö·û´®µÄÒ»¸öÒýÓá£ÕâÑù£¬exp¾Í¿ÉÒÔÖ¸ÏòÒ»¸öÐÎÈç¡°10+4¡±µÄ×Ö·û´®¡£¶ø´Ë×Ö·û´®ÖеÄÏÂÒ»¸ö±êʶ·ûµÄË÷Òý±£´æÔÚexpIdx±äÁ¿ÖУ¬³õʼË÷ÒýֵΪ0¡£µ±Ç°»ñµÃµÄ±êʶ·û´æ´¢ÔÚtoken±äÁ¿ÖУ¬ÆäÀàÐÍÔò´æ´¢ÔÚtokType±äÁ¿ÖС£ÕâЩÓòµÄÊôÐÔ¶¼ÊÇprivateÀàÐÍ£¬ÒòΪËüÃÇÖ»ÔÊÐíÓɽâÎöÆ÷ʹÓò¢ÇÒ²»Äܱ»Íⲿ´úÂëÐ޸ġ£
ÏÂÃæ¸ø³ögetToken()·½·¨µÄÍêÕû´úÂë¡£Õâ¸ö·½·¨Ã¿´Îµ÷ÓûñµÃ±í´ïʽÖеÄÏÂÒ»¸ö±êʶ·û¡£expÖ¸Ïò°üº¬Õâ¸ö±í´ïʽµÄ×Ö·û´®£¬ÆäË÷ÒýÓÉexpIdx±íʾ¡£Ò²¾ÍÊÇ˵£¬Ã¿´Îµ÷ÓÃgetToken()¶¼½«»ñµÃexp[expIdx]±íʾµÄÏÂÒ»¸ö±êʶ·û¡£È»ºógetToken()½«Õâ¸ö±êʶ·û´æÈëtokenÓò£¬½«±êʶ·ûÀàÐÍ´æÈëtokTypeÓòÖС£getToken()·½·¨µ÷ÓÃisDelim()·½·¨£¬Æä´úÂëÈçÏ£º
¡¡¡¡// Obtain the next token.
¡¡¡¡private void getToken()
¡¡¡¡{
¡¡¡¡tokType = NONE;
¡¡¡¡token = "";
¡¡¡¡
¡¡¡¡// Check for end of expression.
¡¡¡¡if(expIdx == exp.length()) {
¡¡¡¡token = EOE;
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡
¡¡¡¡// Skip over white space.
¡¡¡¡while(expIdx < exp.length() &&
¡¡¡¡Character.isWhitespace(exp.charAt(expIdx))) ++expIdx;
¡¡¡¡
¡¡¡¡// Trailing whitespace ends expression.
¡¡¡¡if(expIdx == exp.length()) {
¡¡¡¡token = EOE;
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡
¡¡¡¡if(isDelim(exp.charAt(expIdx))) { // is operator
¡¡¡¡token += exp.charAt(expIdx);
¡¡¡¡expIdx++;
¡¡¡¡tokType = DELIMITER;
¡¡¡¡}
¡¡¡¡else if(Character.isLetter(exp.charAt(expIdx))) { // is variable
¡¡¡¡while(!isDelim(exp.charAt(expIdx))) {
¡¡¡¡token += exp.charAt(expIdx);
¡¡¡¡expIdx++;
¡¡¡¡if(expIdx >= exp.length()) break;
¡¡¡¡}
¡¡¡¡tokType = VARIABLE;
¡¡¡¡}
¡¡¡¡else if(Character.isDigit(exp.charAt(expIdx))) { // is number
¡¡¡¡while(!isDelim(exp.charAt(expIdx))) {
¡¡¡¡token += exp.charAt(expIdx);
¡¡¡¡expIdx++;
¡¡¡¡if(expIdx >= exp.length()) break;
¡¡¡¡}
¡¡¡¡tokType = NUMBER;
¡¡¡¡}
¡¡¡¡else { // unknown character terminates expression
¡¡¡¡token = EOE;
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡
¡¡¡¡// Return true if c is a delimiter.
¡¡¡¡private boolean isDelim(char c)
¡¡¡¡{
¡¡¡¡if((" +-/*%^=()".indexOf(c) != -1))
¡¡¡¡return true;
¡¡¡¡return false;
¡¡¡¡}
¡¡¡¡ÏÂÃæÏêϸ·ÖÎögetToken()·½·¨¡£getToken()Ê×ÏÈÖ´ÐÐһЩ±ØÒªµÄ³õʼ»¯¹¤×÷£¬È»ºó²é¿´expIdxÊÇ·ñµÈÓÚexp.length()£¬ÒÔ´ËÅжÏÊÇ·ñÒѵ½´ï±í´ïʽµÄ½áβ¡£ÓÉÓÚexpIdxÊDZí´ïʽÖеÄÒ»¸öË÷Òý£¬Òò´Ë£¬Èç¹û¸ÃË÷ÒýµÈÓڸñí´ïʽ×Ö·û´®µÄ³¤¶È£¬Ôò±íÃ÷Õû¸ö±í´ïʽÒѾ­½âÎöÍê±Ï¡£
¡¡¡¡Èç¹û±í´ïʽÖл¹ÄÜÕÒµ½Î´±»´¦Àí¹ýµÄ±êʶ·û£¬ÄÇôgetToken()·½·¨½«¼ÌÐø´¦Àí±êʶ·ûµÄ¹ý³Ì¡£Ê×ÏÈÌø¹ýÏÂÒ»¸ö±êʶ·û֮ǰµÄÈ«²¿¿Õ¸ñ¡£Èç¹û±í´ïʽÒÔ¿Õ¸ñ½á⣬ÄÇÃ´Ìø¹ýÕâЩ¿Õ¸ñÖ®ºó±ØÐë·µ»ØÒ»¸öEOE±êÖ¾¡£·ñÔò£¬ÔÚÌø¹ý¿Õ¸ñÖ®ºó£¬exp[expIdx]¿ÉÄÜÊÇÒÔÏÂÈýÖÖ×Ö·ûÖеÄÒ»ÖÖ£ºÊý×Ö¡¢±äÁ¿»òÕßÔËËã·û¡£¸ù¾Ýexp[expIdx]Ö®ºó×Ö·ûÀàÐ͵IJ»Í¬£¬getToken()·½·¨¶Ôµ±Ç°±êʶ·ûµÄ´¦ÀíÓÐËù²»Í¬¡£Èç¹û¸Ã×Ö·ûÖ®ºóµÄÒ»¸ö×Ö·ûÊÇÔËËã·û£¬ÄÇô¾Í½«µ±Ç°±êʶ·û±£´æÔÚtoken±äÁ¿ÖÐ×÷Ϊ×Ö·û´®·µ»Ø£¬Í¬Ê±½«tokTypeÖÃΪDELIMITER¡£Èç¹û½ÓÏÂÀ´µÄ×Ö·ûÊÇÒ»¸ö×Öĸ£¬ÄÇô¾Í½«Ëü×÷Ϊһ¸ö±äÁ¿´¦Àí£¬°ÑËü±£´æÔÚtokenÖÐ×÷Ϊһ¸ö×Ö·û´®·µ»Ø£¬Í¬Ê±½«tokTypeÖÃΪVARIABLE¡£Èç¹û½ÓÏÂÀ´µÄ×Ö·ûÊÇÒ»¸ö°¢À­²®Êý×Ö£¬ÄÇôҪ¶Á³öÕû¸öÊý×Ö£¬²¢½«ËüÒÔ×Ö·û´®µÄÐÎʽ±£´æÔÚtokenÖУ¬Í¬Ê±½«tokTypeÉèÖÃΪNUMBER¡£×îºó£¬Èç¹ûÏÂÒ»¸ö×Ö·û²»ÊÇÒÔÉÏÈýÖÖÖеÄÈκÎÒ»ÖÖ£¬ÄÇôtoken½«±»ÖÃΪEOE¡£
¡¡¡¡ÎªÁ˸üÇå³þµØ·ÖÎögetToken()ÖеĴúÂ룬ÔÚÕâÀïÊ¡ÂÔÁ˴󲿷ֵĴíÎó¼ì²é´úÂ룬²¢×÷³öһЩ¼ÙÉè¡£ÀýÈ磬¶ÔÓÚÈκÎÉÐδȷÈϵÄ×Ö·û£¬Ö»ÒªÔÚËü֮ǰÓÐÒ»¸ö¿Õ¸ñ£¬¼´¿É×÷Ϊ±í´ïʽµÄ½áÊø×Ö·û¡£Í¬Ê±£¬ÔÚÕâ¸ö°æ±¾ÖУ¬ËäÈ»±äÁ¿µÄ³¤¶È¿ÉÒÔÊÇÈÎÒâµÄ£¬µ«ÊÇÖ»ÓеÚÒ»¸ö×ÖĸÓÐÒâÒå¡£µ±È»£¬¶ÔÓÚÌØ¶¨µÄÐèÇó£¬Ó¦ÓóÌÐò¿ÉÒÔÔö¼Ó¸ü¶àµÄ´íÎó¼ì²é»òÕ߯äËûһЩϸ½Ú¡£
¡¡¡¡ÎªÁ˸üºÃµØÀí½â±êʶ·ûµÄ·ÖÎö¹ý³Ì£¬Ê×ÏÈ¿´¿´ÏÂÁбí´ïʽ·µ»ØµÄÿ¸ö±êʶ·û¼°ÆäÀàÐÍ(¼û±í2-2)£º
¡¡¡¡A + 100 ¨C (B * C) /2
¡¡¡¡±í2-2 ±êʶ·ûµÄÀàÐÍ
¡¡

¡¡¡¡Çë¼Çס£¬±êʶ·û×ÜÊÇÒÔ×Ö·û´®µÄÐÎʽ±£´æ£¬¼´Ê¹µ±Ëü½ö°üº¬µ¥¸ö×ÖĸʱҲÊÇÈç´Ë¡£
¡¡¡¡×îºóÌáÐÑÒ»µã£ºJava°üº¬ÁËһЩ·Ç³£ÓÐÓõÄÄÚǶµÄ±êʶ·û´¦Àí¹¦ÄÜ£¬ÀýÈçÓÉStringTokenizerÀàËùÖ§³ÖµÄ¶àÖÖ¹¦ÄÜ¡£µ«ÊǶÔÓÚ½âÎöÆ÷¶øÑÔ£¬×îºÃʹÓÃgetToken()µÈרÃŵıêʶ·û´¦Àí·½·¨À´Íê³É±êʶ·û´¦Àí¹¤×÷¡£
Ò»¸ö¼òµ¥µÄ±í´ïʽ½âÎöÆ÷
ÏÂÃæÊǽâÎöÆ÷µÄµÚÒ»¸ö°æ±¾¡£Õâ¸ö½âÎöÆ÷¿ÉÒÔ¼ÆËã½öÓÉÊý×Ö¡¢ÔËËã·ûºÍÀ¨ºÅ×é³ÉµÄ±í´ïʽ¡£¾¡¹ÜgetToken()·½·¨¿ÉÒÔ´¦Àí±äÁ¿£¬µ«ÊÇÕâ¸ö°æ±¾²¢²»¶Ô±äÁ¿×öÈκδ¦Àí¡£ÔÚ¶ÁÕßÃ÷°×Õâ¸ö¼òµ¥½âÎöÆ÷µÄ¹¤×÷Ô­ÀíÖ®ºó£¬ÔÙÔö¼Ó´¦Àí±äÁ¿µÄ¹¦ÄÜ¡£
¡¡¡¡/*
¡¡¡¡ This module contains the recursive descent
¡¡¡¡ parser that does not use variables.
¡¡¡¡*/¡¡¡¡
¡¡¡¡// Exception class for parser errors.
¡¡¡¡class ParserException extends Exception {
¡¡¡¡ String errStr; // describes the error¡¡¡¡
¡¡¡¡ public ParserException(String str) {
¡¡¡¡ errStr = str;
¡¡¡¡ }¡¡¡¡
¡¡¡¡ public String toString() {
¡¡¡¡ return errStr;
¡¡¡¡ }
¡¡¡¡}¡¡¡¡
¡¡¡¡class Parser {
¡¡¡¡ // These are the token types.
¡¡¡¡ final int NONE = 0;
¡¡¡¡ final int DELIMITER = 1;
¡¡¡¡ final int VARIABLE = 2;
¡¡¡¡ final int NUMBER = 3;¡¡¡¡
¡¡¡¡ // These are the types of syntax errors.
¡¡¡¡ final int SYNTAX = 0;
¡¡¡¡ final int UNBALPARENS = 1;
¡¡¡¡ final int NOEXP = 2;
¡¡¡¡ final int DIVBYZERO = 3;
¡¡¡¡ // This token indicates end-of-expression.
¡¡¡¡ final String EOE = "\0";¡¡¡¡
¡¡¡¡ private String exp; // refers to expression string
¡¡¡¡ private int expIdx; // current index into the expression
¡¡¡¡ private String token; // holds current token
¡¡¡¡ private int tokType; // holds token's type¡¡¡¡
¡¡¡¡ // Parser entry point.
¡¡¡¡ public double evaluate(String expstr) throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;
¡¡¡¡ exp = expstr;
¡¡¡¡ expIdx = 0;¡¡¡¡
¡¡¡¡ getToken();
¡¡¡¡ if(token.equals(EOE))
¡¡¡¡ handleErr(NOEXP); // no expression present¡¡¡¡
¡¡¡¡ // Parse and evaluate the expression.
¡¡¡¡ result = evalExp2(); ¡¡¡¡
¡¡¡¡ if(!token.equals(EOE)) // last token must be EOE
¡¡¡¡ handleErr(SYNTAX);¡¡¡¡
¡¡¡¡ return result;
¡¡¡¡ }¡¡¡¡
¡¡¡¡ // Add or subtract two terms.
¡¡¡¡ private double evalExp2() throws ParserException
¡¡¡¡ {
¡¡¡¡ char op;
¡¡¡¡ double result;
¡¡¡¡ double partialResult;¡¡¡¡
¡¡¡¡ result = evalExp3();¡¡¡¡
¡¡¡¡ while((op = token.charAt(0)) == '+' || op == '-') {
¡¡¡¡ getToken();
¡¡¡¡ partialResult = evalExp3();
¡¡¡¡ switch(op) {
¡¡¡¡ case '-':
¡¡¡¡ result = result - partialResult;
¡¡¡¡ break;
¡¡¡¡ case '+':
¡¡¡¡ result = result + partialResult;
¡¡¡¡ break;
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡ }
// Multiply or divide two factors.
¡¡¡¡ private double evalExp3() throws ParserException
¡¡¡¡ {
¡¡¡¡ char op;
¡¡¡¡ double result;
¡¡¡¡ double partialResult;¡¡¡¡
¡¡¡¡ result = evalExp4();¡¡¡¡
¡¡¡¡ while((op = token.charAt(0)) == '*' ||
¡¡¡¡ op == '/' || op == '%') {
¡¡¡¡ getToken();
¡¡¡¡ partialResult = evalExp4();
¡¡¡¡ switch(op) {
¡¡¡¡ case '*':
¡¡¡¡ result = result * partialResult;
¡¡¡¡ break;
¡¡¡¡ case '/':
¡¡¡¡ if(partialResult == 0.0)
¡¡¡¡ handleErr(DIVBYZERO);
¡¡¡¡ result = result / partialResult;
¡¡¡¡ break;
¡¡¡¡ case '%':
¡¡¡¡ if(partialResult == 0.0)
¡¡¡¡ handleErr(DIVBYZERO);
¡¡¡¡ result = result % partialResult;
¡¡¡¡ break;
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡ }¡¡¡¡
¡¡¡¡ // Process an exponent.
¡¡¡¡ private double evalExp4() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;
¡¡¡¡ double partialResult;
¡¡¡¡ double ex;
¡¡¡¡ int t; ¡¡¡¡
¡¡¡¡ result = evalExp5(); ¡¡¡¡
¡¡¡¡ if(token.equals("^")) {
¡¡¡¡ getToken();
¡¡¡¡ partialResult = evalExp4();
¡¡¡¡ ex = result;
¡¡¡¡ if(partialResult == 0.0) {
¡¡¡¡ result = 1.0;
¡¡¡¡ } else
¡¡¡¡ for(t=(int)partialResult-1; t > 0; t--)
¡¡¡¡ result = result * ex;
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡ }
¡¡ // Evaluate a unary + or -.
¡¡¡¡ private double evalExp5() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;
¡¡¡¡ String op;
¡¡¡¡ op = "";
¡¡¡¡ if((tokType == DELIMITER) &&
¡¡¡¡ token.equals("+") || token.equals("-")) {
¡¡¡¡ op = token;
¡¡¡¡ getToken(); ¡¡¡¡
¡¡¡¡ }
¡¡¡¡ result = evalExp6(); ¡¡¡¡
¡¡¡¡ if(op.equals("-")) result = -result;¡¡¡¡
¡¡¡¡ return result;
¡¡¡¡ }
// Process a parenthesized expression.
¡¡¡¡ private double evalExp6() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;¡¡¡¡
¡¡¡¡ if(token.equals("(")) {
¡¡¡¡ getToken();
¡¡¡¡ result = evalExp2();
¡¡¡¡ if(!token.equals(")"))
¡¡¡¡ handleErr(UNBALPARENS);
¡¡¡¡ getToken();
¡¡¡¡ }
¡¡¡¡ else result = atom(); ¡¡¡¡
¡¡¡¡ return result;
¡¡¡¡ } ¡¡¡¡
¡¡¡¡ // Get the value of a number.
¡¡¡¡ private double atom() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result = 0.0;¡¡¡¡
¡¡¡¡ switch(tokType) {
¡¡¡¡ case NUMBER:
¡¡¡¡ try {
¡¡¡¡ result = Double.parseDouble(token);
¡¡¡¡ } catch (NumberFormatException exc) {
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ }
¡¡¡¡ getToken();
¡¡¡¡ break;
¡¡¡¡ default:
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ break;
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡ } ¡¡¡¡
¡¡¡¡ // Handle an error.
¡¡¡¡ private void handleErr(int error) throws ParserException
¡¡¡¡ {
¡¡¡¡ String[] err = {
¡¡¡¡ "Syntax Error",
¡¡¡¡ "Unbalanced Parentheses",
¡¡¡¡ "No Expression Present",
¡¡¡¡ "Division by Zero"
¡¡¡¡ }; ¡¡¡¡
¡¡¡¡ throw new ParserException(err[error]);
¡¡¡¡ } ¡¡¡¡
¡¡¡¡ // Obtain the next token.
¡¡¡¡ private void getToken()
¡¡¡¡ {
¡¡¡¡ tokType = NONE;
¡¡¡¡ token = ""; ¡¡¡¡
¡¡¡¡ // Check for end of expression.
¡¡¡¡ if(expIdx == exp.length()) {
¡¡¡¡ token = EOE;
¡¡¡¡ return;
¡¡¡¡ }¡¡¡¡
¡¡¡¡ // Skip over white space.
¡¡¡¡ while(expIdx < exp.length() &&
¡¡¡¡ Character.isWhitespace(exp.charAt(expIdx))) ++expIdx; ¡¡¡¡
¡¡¡¡ // Trailing whitespace ends expression.
¡¡¡¡ if(expIdx == exp.length()) {
¡¡¡¡ token = EOE;
¡¡¡¡ return;
¡¡¡¡ }¡¡¡¡
¡¡¡¡ if(isDelim(exp.charAt(expIdx))) { // is operator
¡¡¡¡ token += exp.charAt(expIdx);
¡¡¡¡ expIdx++;
¡¡¡¡ tokType = DELIMITER;
¡¡¡¡ }
¡¡¡¡ else if(Character.isLetter(exp.charAt(expIdx))) { // is variable
¡¡¡¡ while(!isDelim(exp.charAt(expIdx))) {
¡¡¡¡ token += exp.charAt(expIdx);
¡¡¡¡ expIdx++;
¡¡¡¡ if(expIdx >= exp.length()) break;
¡¡¡¡ }
¡¡¡¡ tokType = VARIABLE;
¡¡¡¡ }
¡¡¡¡ else if(Character.isDigit(exp.charAt(expIdx))) { // is number
¡¡¡¡ while(!isDelim(exp.charAt(expIdx))) {
¡¡¡¡ token += exp.charAt(expIdx);
¡¡¡¡ expIdx++;
¡¡¡¡ if(expIdx >= exp.length()) break;
¡¡¡¡ }
¡¡¡¡ tokType = NUMBER;
¡¡¡¡ }
¡¡¡¡ else { // unknown character terminates expression
¡¡¡¡ token = EOE;
¡¡¡¡ return;
¡¡¡¡ }
¡¡¡¡ } ¡¡¡¡
¡¡¡¡ // Return true if c is a delimiter.
¡¡¡¡ private boolean isDelim(char c)
¡¡¡¡ {
¡¡¡¡ if((" +-/*%^=()".indexOf(c) != -1))
¡¡¡¡ return true;
¡¡¡¡ return false;
¡¡¡¡ }
¡¡¡¡}
ÔÚ´úÂëµÄ¿ªÊ¼²¿·Ö£¬½âÎöÆ÷ÉùÃ÷ÁËÒ»¸öParserExceptionÀà¡£ÕâÊÇÒ»¸öÒì³£À࣬µ±½âÎöÆ÷ÔÚ½âÎö±í´ïʽµÄ¹ý³ÌÖÐÓöµ½´íÎóʱ¾Í»áÅ׳öÒì³£¡£´ËÒì³£ÐèÒªÓÉʹÓøýâÎöÆ÷µÄ´úÂë½øÐд¦Àí¡£
¡¡¡¡ÒÔÉÏ´úÂëÖеĽâÎöÆ÷Äܹ»´¦ÀíÏÂÁÐÔËËã·û£º+¡¢¨C¡¢*¡¢/ºÍ%¡£ÁíÍ⣬Ëü»¹Äܹ»´¦ÀíÕûÊýÇóÃÝÔËËã^ºÍһԪȡ·´ÔËË㣬²¢Äܹ»ÕýÈ·´¦ÀíÔ²À¨ºÅ¡£
¡¡¡¡Ê¹ÓýâÎöÆ÷µÄ·½·¨ÊÇÕâÑùµÄ£ºÊ×ÏȱØÐë´´½¨Ò»¸öParserÀàÐ͵ĶÔÏó£¬È»ºóµ÷ÓøöÔÏóµÄevaluate()·½·¨£¬Í¬Ê±½«ÐèÒª¼ÆËãµÄ±í´ïʽ×Ö·û´®×÷Ϊ²ÎÊý´«µÝ¸ø¸Ã·½·¨£¬×îºó·µ»Ø½á¹û¡£ÓÉÓÚParserÀàÔÚ³ö´íʱÅ׳öParserExceptionÒì³££¬Òò´ËÖ÷Ó¦ÓóÌÐò±ØÐë´¦Àí¸ÃÒì³£¡£ÏÂÃæµÄÀý×Ó˵Ã÷Á˽âÎöÆ÷µÄʹÓ÷½·¨£º
¡¡¡¡// Demonstrate the parser.
¡¡¡¡import java.io.*;¡¡¡¡
¡¡¡¡class PDemo {
¡¡¡¡ public static void main(String args[])
¡¡¡¡ throws IOException
¡¡¡¡ {
¡¡¡¡ String expr;¡¡¡¡
¡¡¡¡ BufferedReader br = new
¡¡¡¡ BufferedReader(new InputStreamReader(System.in));
¡¡¡¡ Parser p = new Parser(); ¡¡¡¡
¡¡¡¡ System.out.println("Enter an empty expression to stop.");
¡¡¡¡ for(;;) {
¡¡¡¡ System.out.print("Enter expression: ");
¡¡¡¡ expr = br.readLine();
¡¡¡¡ if(expr.equals("")) break;
¡¡¡¡ try {
¡¡¡¡ System.out.println("Result: " + p.evaluate(expr));
¡¡¡¡ System.out.println();
¡¡¡¡ } catch (ParserException exc) {
¡¡¡¡ System.out.println(exc);
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡}
¡¡¡¡ÏÂÃæÊǼ¸¸öÀý×ÓµÄÔËÐÐÇé¿ö£º
¡¡¡¡Enter an empty expression to stop.
¡¡¡¡Enter expression: 10-2*3
¡¡¡¡Result: 4.0
¡¡¡¡Enter expression: (10-2)*3
¡¡¡¡Result: 24.0¡¡¡¡
¡¡¡¡Enter expression: 10/3.5
¡¡¡¡Result: 2.857142857142857
¡¡¡¡ÉîÈëÀí½âParserÀà
¡¡¡¡ÏÂÃæÏêϸ½éÉÜParserÀà¡£ÈçǰËùÊö£¬expÖ¸ÏòÒ»¸ö×Ö·û´®£¬Õâ¸ö×Ö·û´®°üº¬ÁËÐèÒª¼ÆËãµÄ±í´ïʽ¡£Ã¿´Îµ÷ÓÃevaluate()¶¼½«ÖØÐÂÉèÖÃexpÓò¡£ÇëÀμǣº½âÎöÆ÷Ëù¼ÆËãµÄ±í´ïʽ°üº¬ÔÚ±ê×¼µÄJava×Ö·û´®Ö®ÖС£ÀýÈ磬ÏÂÁÐ×Ö·û´®°üº¬Á˽âÎöÆ÷¿É¼ÆËãµÄ±í´ïʽ£º
¡¡¡¡ "10 ¨C 5"
¡¡¡¡ "2 * 3.3 / (3.1416 * 3.3)"
¡¡¡¡expµÄµ±Ç°Ë÷Òý±£´æÔÚexpIdxÖС£µ±½âÎöÆ÷¿ªÊ¼Ö´ÐнâÎö²Ù×÷ʱ£¬expIdxÊ×Ïȱ»ÖÃΪ0£¬È»ºó¸ÃÖµËæ×űí´ïʽ½âÎö¹ý³ÌµÄ½øÐжøÖð½¥Ôö³¤¡£tokenÓò±£´æµ±Ç°±»´¦ÀíµÄ±êʶ·û£¬¶øtokType±£´æ¸Ã±êʶ·ûµÄÀàÐÍ¡£
¡¡¡¡½âÎöÆ÷µÄÈë¿ÚµãÊÇevaluate()·½·¨£¬µ÷Óø÷½·¨±ØÐë´«µÝÒ»¸ö×Ö·û´®×÷Ϊ²ÎÊý£¬ÆäÖаüº¬½«Òª´¦ÀíµÄ±í´ïʽ¡£´ÓevalExp2()µ½evalExp6()µÄ5¸ö·½·¨Óëatom()·½·¨¹²Í¬¹¹³ÉµÝ¹éϽµµÄ½âÎöÆ÷¡£ËüÃÇʵÏÖÁËÒ»¸öÔöÇ¿µÄ±í´ïʽ²úÉú¹æÔò¼¯£¬Õâ¸ö¹æÔò¼¯ÔÚÇ°ÃæÒѾ­ÌÖÂÛ¹ý¡£Ã¿¸ö·½·¨¶¥²¿µÄ×¢ÊͲ¿·ÖÃèÊöÁËËüÃÇËùÍê³ÉµÄ¹¦ÄÜ¡£ÔÚ½âÎöÆ÷µÄÏÂÒ»¸ö°æ±¾Öл¹½«Ôö¼ÓevalExp1()·½·¨¡£
¡¡¡¡handleErr()·½·¨´¦Àí±í´ïʽÖеÄÓï·¨´íÎó¡£Ç°ÃæÒѾ­Ìáµ½£¬getToken()ºÍisDelim()·½·¨½«±í´ïʽ·Ö½âΪ»ù±¾µÄÔªËØ¡£½âÎöÆ÷µ÷ÓÃgetToken()·½·¨´Ó±í´ïʽµÄÊ××Ö·û¿ªÊ¼£¬Öð¸ö»ñÈ¡±í´ïʽÖеıêʶ·û£¬Ö±µ½±í´ïʽ½áβ¡£¸ù¾Ý»ñµÃ±êʶ·ûµÄ²»Í¬ÀàÐÍ£¬½âÎöÆ÷½«²ÉÈ¡²»Í¬µÄ¶¯×÷¡£
¡¡¡¡ÎªÁ˸ü׼ȷµØÀí½âÎöÆ÷¼ÆËã±í´ïʽµÄ¹ý³Ì£¬·ÖÎöÏÂÃæ±í´ïʽµÄ½âÎö¹ý³Ì£º
¡¡¡¡10 ¨C 3 * 2
¡¡¡¡ÓÉÓÚevaluate()ÊÇÈë¿Úµã£¬Òò´Ë½âÎöÆ÷Ê×Ïȵ÷ÓÃevaluate()·½·¨»ñµÃµÚÒ»¸ö±êʶ·û¡£Èç¹ûÕâ¸ö±êʶ·ûÊÇEOE£¬ÄÇô±íÃ÷evaluate()´¦ÀíµÄÊǸö¿Õ×Ö·û´®£¬ÓÚÊDzúÉúÒ»¸öNOEXP´íÎó¡£ÔÚÕâ¸öÀý×ÓÖУ¬»ñµÃµÄµÚÒ»¸ö±êʶ·ûÊÇÊý×Ö¡°10¡±¡£½ÓÏÂÀ´½âÎöÆ÷µ÷ÓÃevalExp2()·½·¨£¬È»ºóÊÇһϵÁÐÁ´Ê½µ÷ÓãºevalExp2()µ÷ÓÃevalExp3()£¬evalExp3()µ÷ÓÃevalExp4()£¬evalExp4()ÔÙµ÷ÓÃevalExp5()¡£µ÷ÓÃevalExp5()·½·¨ºó£¬ÏÂÒ»²½ÊǼì²éÕâ¸ö±êʶ·ûÊÇ·ñΪһԪȡÕý»òÕßһԪȡ¸ºÔËËã·û¡£ÔÚ±¾ÀýÖбêʶ·û²»ÊÇÕâÁ½¸öÒ»Ôª²Ù×÷£¬Òò´Ëµ÷ÓÃevalExp6()·½·¨¡£´Ëʱ£¬evalExp6()»òÕߵݹéµ÷ÓÃevalExp2()(µ±¶ÁÈ¡µÄ±êʶ·ûΪÀ¨ºÅʱ)£¬»òÕßµ÷ÓÃatom()»ñµÃÊý×ÖµÄÖµ¡£ÓÉÓÚÕâ¸ö±êʶ·û²»ÊÇ×óÀ¨ºÅ£¬Òò´Ë½âÎöÆ÷µ÷ÓÃatom()·½·¨£¬Ö´Ðк󷵻ØÊýÖµ10¡£ÏÂÒ»²½ÖèÊÇÓÃgetToken()·½·¨¼ÌÐø¼ìË÷Ê£ÓàµÄ±êʶ·û£¬Óë´Ëͬʱ£¬ÑØ×ÅÉÏÊöµ÷ÓÃÁ´Öð²½»ØËÝ¡£ÔÚ±¾ÀýÖУ¬getToken()·½·¨»ñµÃÏÂÒ»¸öÔËËã·û¡°£­¡±£¬Í¬Ê±»ØËݵ÷ÓÃevalExp2()¡£
¡¡¡¡½ÓÏÂÀ´µÄÒ»¸ö²½Öè·Ç³£ÖØÒª¡£ÓÉÓÚµ±Ç°±êʶ·ûÊÇÔËËã·û¡°£­¡±£¬Òò´ËËü±»±£´æµ½±äÁ¿opÖС£È»ºó½âÎöÆ÷¼ÌÐø»ñÈ¡ÏÂÒ»¸ö±êʶ·û¡°3¡±£¬ÓÚÊÇ¿ªÊ¼ÐµÄϽµµ÷Óùý³Ì¡£ºÍ¸Õ²ÅÒ»Ñù£¬µ÷Óùý³Ì×îºóÓÖ½øÈëatom()·½·¨£¬·µ»Ø½á¹ûΪÊýÖµ¡°3¡±¡£È»ºó½âÎöÆ÷½Ó×ŶÁÈë¡°*¡±£¬Õ⽫µ¼Öµ÷ÓÃÁ´ÏòÉÏ»ØËݵ½evalExp3()£¬evalExp3()¶ÁÈë±í´ïʽµÄ×îºóÒ»¸ö±êʶ·û¡°2¡±¡£Õâʱ½âÎöÆ÷½øÐеÚÒ»´ÎËãÊõ²Ù×÷¡ª¡ª 2Óë3Ïà³Ë¡£³Ë»ý·µ»Ø¸øevalExp2()£¬È»ºóÖ´Ðмõ·¨£¬µÃµ½½á¹û4¡£¾¡¹Ü¸Õ¿ªÊ¼Àí½âÕâ¸ö¹ý³ÌÓÐЩÀ§ÄÑ£¬µ«ÊÇ¶ÔÆäËûһЩÀý×ӵķÖÎö¿ÉÒÔÑéÖ¤£¬½âÎöÆ÷ÿ´Î¶¼ÄܶÔÊäÈëµÄ±í´ïʽ½øÐÐÕýÈ·µÄ´¦Àí¡£
¡¡¡¡Èç¹û½âÎö¹ý³Ì·¢Éú´íÎó£¬ÄÇô½âÎöÆ÷½«µ÷ÓÃhandleErr()·½·¨£¬¸Ã·½·¨Å׳öÒ»¸öParserExceptionÒì³£¶Ô´íÎó½øÐÐÃèÊö¡£ÓÉevaluate()Å׳öµÄParserExceptionÒì³£±ØÐëÓÉʹÓýâÎöÆ÷µÄ´úÂë½øÐд¦Àí¡£
¡¡¡¡Ç°ÃæµÄÀý×Ó³ÌÐò±íÃ÷£¬Õâ¸ö½âÎöÆ÷±È½ÏÊʺÏÓÚ¼òµ¥µÄ×ÀÃæ¼ÆËãÆ÷ʹÓá£Ëü»¹²»Äܹ»ÓÃÓÚ¼ÆËã»úÓïÑÔ¡¢Êý¾Ý¿â»òÕ߸´ÔӵļÆËãÆ÷Ö®ÖУ¬ÒòΪËü»¹ÐèÒª´¦Àí±äÁ¿µÄÄÜÁ¦£¬¶øÕâÊÇ2.6½Ú½«ÒªÌÖÂÛµÄÖ÷Ìâ¡£
Ïò½âÎöÆ÷ÖÐÌí¼Ó±äÁ¿
ºÜ¶àÓ¦ÓÃʹÓñäÁ¿´æ´¢Êý¾Ý£¬°üÀ¨ËùÓеıà³ÌÓïÑÔ¡¢´ó²¿·ÖµÄ¼ÆËãÆ÷ºÍµç×ÓÖÆ±íÈí¼þ¡£ÉÏÃæ½éÉܵĵÚÒ»°æ±¾½âÎöÆ÷±ØÐëÌí¼Ó±äÁ¿´¦ÀíµÄ¹¦ÄܲÅÄÜÓÃÓÚÉÏÊöÓ¦ÓÃÁìÓò¡£Îª´Ë£¬½âÎöÆ÷ÐèÒªÔö¼ÓÒÔÏÂһЩ¹¦ÄÜ¡£Ê×ÏÈ£¬µ±È»ÐèÒªÔö¼Ó±äÁ¿¡£Ç°ÎÄÒѾ­Ìáµ½£¬ÎÒÃÇʹÓôÓAµ½ZµÄ26¸ö×ÖĸΪ±äÁ¿ÃüÃû¡£ÎÒÃÇ´æ´¢ÔÚParserÀàÖеÄÒ»¸ö°üº¬26¸öÔªËØµÄË«¾«¶ÈÊý×éÖ®ÖС£Òò´Ë£¬±ØÐëÏòParserÀàÖÐÌí¼ÓÏÂÁÐÓò£º
¡¡¡¡// Array for variables.
¡¡¡¡private double vars[] = new double[26];
¡¡¡¡µ±Parser¶ÔÏó³õʼ»¯Ê±£¬Êý×éÖеÄÿ¸öÔªËØ¶¼±»×Ô¶¯³õʼ»¯Îª0¡£
¡¡¡¡½âÎöÆ÷»¹ÐèÒªÒ»¸ö·½·¨À´²éÕÒÖ¸¶¨±äÁ¿µÄÖµ¡£ÓÉÓÚ±äÁ¿ÃûÓÉ´ÓAµ½ZµÄ×Öĸ×é³É£¬Òò´Ë¿ÉÒÔÓñäÁ¿ÃûµÚÒ»¸ö×ÖĸµÄASCIIÖµ¼õÈ¥AµÄASCIIÖµ£¬µÃµ½µÄ¾ÍÊǸñäÁ¿ÔÚÊý×évarsÖеÄË÷Òý¡£ÏÂÃæ¸ø³öµÄfindVar()·½·¨Íê³ÉÁ˴˹¦ÄÜ£º
¡¡¡¡// Return the value of a variable.
¡¡¡¡private double findVar(String vname) throws ParserException
¡¡¡¡{
¡¡¡¡ if(!Character.isLetter(vname.charAt(0))){
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ return 0.0;
¡¡¡¡ }
¡¡¡¡ return vars[Character.toUpperCase(vname.charAt(0))-'A'];
¡¡¡¡}
¡¡¡¡·ÖÎöÉÏÊö´úÂë¿ÉÖª£¬ËäÈ»findVar()·½·¨½ÓÊյIJÎÊý¿ÉÒÔÊÇÒ»¸ö½Ï³¤µÄ±äÁ¿Ãû£¬ÀýÈçA12»òÕßtest£¬µ«ÊÇÖ»ÓбäÁ¿ÃûµÄµÚÒ»¸ö×ÖĸÊÇÓÐÒâÒåµÄ¡£¶ÁÕß¿ÉÒÔÊÔןıäÕâÒ»ÌØÕ÷ÒÔÊÊÓ¦×Ô¼ºµÄÐèÇó¡£
¡¡¡¡ÁíÍ⻹±ØÐëÐÞ¸Äatom()·½·¨ÒÔͬʱ¾ß±¸´¦ÀíÊý×ֺͱäÁ¿µÄÄÜÁ¦¡£Ðµİ汾µÄ´úÂëÈçÏ£º
¡¡¡¡// Get the value of a number or variable.
¡¡¡¡private double atom() throws ParserException
¡¡¡¡{
¡¡¡¡ double result = 0.0;
¡¡¡¡
¡¡¡¡ switch(tokType) {
¡¡¡¡ case NUMBER:
¡¡¡¡ try {
¡¡¡¡ result = Double.parseDouble(token);
¡¡¡¡ } catch (NumberFormatException exc) {
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ }
¡¡¡¡ getToken();
¡¡¡¡ break;
¡¡¡¡ case VARIABLE:
¡¡¡¡ result = findVar(token);
¡¡¡¡ getToken();
¡¡¡¡ break;
¡¡¡¡ default:
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ break;
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡}
¡¡¡¡´Ó¼¼ÊõÉϽ²£¬ÕâЩ´úÂë¶¼ÊǽâÎöÆ÷ΪÕýÈ·´¦Àí±äÁ¿¶øÔö¼ÓµÄ£»È»¶ø£¬»¹Ã»Óа취ΪÕâЩ±äÁ¿Ö¸¶¨Ò»¸öÖµ¡£ÎªÁ˸ø±äÁ¿¸³Öµ£¬½âÎöÆ÷ÐèÒª´¦Àí¸³ÖµÔËËã·û(¼´¡°=¡±ºÅ)µÄÄÜÁ¦¡£ÎªÁËʵÏÖ¸³Öµ¹¦ÄÜ£¬ÐèÒªÔÚParserÀàÖÐÔö¼ÓÁíÒ»¸ö·½·¨evalExp1()¡£Ôö¼ÓevalExp1()Ö®ºó£¬µÝ¹éϽµµÄµ÷ÓÃÁ´½«ÓÉÕâ¸ö·½·¨¿ªÊ¼¡£Ò²¾ÍÊÇ˵£¬ÏÖÔÚevaluate()±ØÐëµ÷ÓÃevalExp1()·½·¨(¶ø²»ÊÇevalExp2())¿ªÊ¼±í´ïʽµÄ½âÎö¹ý³Ì·½·¨¡£evalExp1()·½·¨µÄ´úÂëÈçÏ£º
¡¡¡¡// Process an assignment.
¡¡¡¡private double evalExp1() throws ParserException
¡¡¡¡{
¡¡¡¡ double result;
¡¡¡¡ int varIdx;
¡¡¡¡ int ttokType;
¡¡¡¡ String temptoken;
¡¡¡¡
¡¡¡¡ if(tokType == VARIABLE) {
¡¡¡¡ // save old token
¡¡¡¡ temptoken = new String(token);
¡¡¡¡ ttokType = tokType;
¡¡¡¡
¡¡¡¡ // Compute the index of the variable.
¡¡¡¡ varIdx = Character.toUpperCase(token.charAt(0)) - 'A';
¡¡¡¡
¡¡¡¡ getToken();
¡¡¡¡ if(!token.equals("=")) {
¡¡¡¡ putBack(); // return current token
¡¡¡¡ // restore old token -- not an assignment
¡¡¡¡ token = new String(temptoken);
¡¡¡¡ tokType = ttokType;
¡¡¡¡ }
¡¡¡¡ else {
¡¡¡¡ getToken(); // get next part of exp
¡¡¡¡ result = evalExp2();
¡¡¡¡ vars[varIdx] = result;
¡¡¡¡ return result;
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡
¡¡¡¡ return evalExp2();
¡¡¡¡}
evalExp1()·½·¨ÐèÒªÏòǰɨÃ裬¾ö¶¨ÊÇ·ñÕæÕýÖ´ÐÐÒ»´Î¸³Öµ²Ù×÷¡£ÕâÊÇÒòΪ±äÁ¿Ãû×ÜÊÇÔÚ¸³Öµ·ûºÅ֮ǰ³öÏÖ£¬µ«Êǵ¥¶ÀµÄ±äÁ¿Ãû²¢²»Äܱ£Ö¤ÆäºóÒ»¶¨ÊÇÒ»¸ö¸³Öµ±í´ïʽ¡£Ò²¾ÍÊÇ˵£¬½âÎöÆ÷Äܹ»ÖªµÀA=100ÊǸ³Öµ²Ù×÷£¬µ«ÊÇËüʵ¼Ê¸ü´ÏÃ÷£¬ÄÜÅж¨A/10²»ÊǸ³Öµ²Ù×÷¡£Îª´Ë£¬evalExp1()´ÓÊäÈëÁ÷ÖжÁÈ¡ÏÂÒ»¸ö±êʶ·û¡£Èç¹û¸Ã±êʶ·û²»ÊÇÒ»¸öµÈºÅ£¬ÄÇô¶Áµ½µÄ±êʶ·û½«·µ»Ø¸øÊäÈëÁ÷£¬Ö®ºó½«µ÷ÓÃputBack()·½·¨½øÐд¦Àí¡£Æä´úÂëÈçÏ£º
¡¡¡¡// Return a token to the input stream.
¡¡¡¡private void putBack()
¡¡¡¡{
¡¡¡¡ if(token == EOE) return;
¡¡¡¡ for(int i=0; i < token.length(); i++) expIdx--;
¡¡¡¡}
¡¡¡¡Íê³É±ØÒªµÄ¸Ä½øÖ®ºó£¬½âÎöÆ÷ÈçÏ£º
¡¡¡¡/*
¡¡¡¡ This module contains the recursive descent
¡¡¡¡ parser that uses variables.
¡¡¡¡*/
¡¡¡¡// Exception class for parser errors.
¡¡¡¡class ParserException extends Exception {
¡¡¡¡ String errStr; // describes the error
¡¡¡¡ public ParserException(String str) {
¡¡¡¡ errStr = str;
¡¡¡¡ }
¡¡¡¡ public String toString() {
¡¡¡¡ return errStr;
¡¡¡¡ }
¡¡¡¡}
¡¡¡¡class Parser {
¡¡¡¡ // These are the token types.
¡¡¡¡ final int NONE = 0;
¡¡¡¡ final int DELIMITER = 1;
¡¡¡¡ final int VARIABLE = 2;
¡¡¡¡ final int NUMBER = 3;
¡¡¡¡ // These are the types of syntax errors.
¡¡¡¡ final int SYNTAX = 0;
¡¡¡¡ final int UNBALPARENS = 1;
¡¡¡¡ final int NOEXP = 2;
¡¡¡¡ final int DIVBYZERO = 3;
¡¡¡¡ // This token indicates end-of-expression.
¡¡¡¡ final String EOE = "\0";
¡¡¡¡ private String exp; // refers to expression string
¡¡¡¡ private int expIdx; // current index into the expression
¡¡¡¡ private String token; // holds current token
¡¡¡¡ private int tokType; // holds token's type
¡¡¡¡ // Array for variables.
¡¡¡¡ private double vars[] = new double[26];
¡¡¡¡ // Parser entry point.
¡¡¡¡ public double evaluate(String expstr) throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;
¡¡¡¡ exp = expstr;
¡¡¡¡ expIdx = 0;
¡¡¡¡ getToken();
¡¡¡¡ if(token.equals(EOE))
¡¡¡¡ handleErr(NOEXP); // no expression present
¡¡¡¡ // Parse and evaluate the expression.
¡¡¡¡ result = evalExp1();
¡¡¡¡ if(!token.equals(EOE)) // last token must be EOE
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ return result;
¡¡¡¡ }
¡¡¡¡ // Process an assignment.
¡¡¡¡ private double evalExp1() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;
¡¡¡¡ int varIdx;
¡¡¡¡ int ttokType;
¡¡¡¡ String temptoken;
¡¡¡¡ if(tokType == VARIABLE) {
¡¡¡¡ // save old token
¡¡¡¡ temptoken = new String(token);
¡¡¡¡ ttokType = tokType;
¡¡¡¡ // Compute the index of the variable.
¡¡¡¡ varIdx = Character.toUpperCase(token.charAt(0)) - 'A';
¡¡¡¡ getToken();
¡¡¡¡ if(!token.equals("=")) {
¡¡¡¡ putBack(); // return current token
// restore old token -- not an assignment
¡¡¡¡ token = new String(temptoken);
¡¡¡¡ tokType = ttokType;
¡¡¡¡ }
¡¡¡¡ else {
¡¡¡¡ getToken(); // get next part of exp
¡¡¡¡ result = evalExp2();
¡¡¡¡ vars[varIdx] = result;
¡¡¡¡ return result;
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡ return evalExp2();
¡¡¡¡ }
¡¡¡¡ // Add or subtract two terms.
¡¡¡¡ private double evalExp2() throws ParserException
¡¡¡¡ {
¡¡¡¡ char op;
¡¡¡¡ double result;
¡¡¡¡ double partialResult;
¡¡¡¡ result = evalExp3();
¡¡¡¡ while((op = token.charAt(0)) == '+' || op == '-') {
¡¡¡¡ getToken();
¡¡¡¡ partialResult = evalExp3();
¡¡¡¡ switch(op) {
¡¡¡¡ case '-':
¡¡¡¡ result = result - partialResult;
¡¡¡¡ break;
¡¡¡¡ case '+':
¡¡¡¡ result = result + partialResult;
¡¡¡¡ break;
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡ }
¡¡¡¡ // Multiply or divide two factors.
¡¡¡¡ private double evalExp3() throws ParserException
¡¡¡¡ {
¡¡¡¡ char op;
¡¡¡¡ double result;
¡¡¡¡ double partialResult;
¡¡¡¡ result = evalExp4();
¡¡¡¡ while((op = token.charAt(0)) == '*' ||
¡¡¡¡ op == '/' || op == '%') {
¡¡¡¡ getToken();
¡¡¡¡ partialResult = evalExp4();
¡¡¡¡ switch(op) {
¡¡¡¡ case '*':
¡¡¡¡ result = result * partialResult;
¡¡¡¡ break;
¡¡¡¡ case '/':
¡¡¡¡ if(partialResult == 0.0)
¡¡¡¡ handleErr(DIVBYZERO);
¡¡¡¡ result = result / partialResult;
¡¡¡¡ break;
¡¡¡¡ case '%':
¡¡¡¡ if(partialResult == 0.0)
¡¡¡¡ handleErr(DIVBYZERO);
¡¡¡¡ result = result % partialResult;
¡¡¡¡ break;
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡ }
¡¡¡¡ // Process an exponent.
¡¡¡¡ private double evalExp4() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;
¡¡¡¡ double partialResult;
¡¡¡¡ double ex;
¡¡¡¡ int t;
¡¡¡¡ result = evalExp5();
¡¡¡¡ if(token.equals("^")) {
¡¡¡¡ getToken();
¡¡¡¡ partialResult = evalExp4();
¡¡¡¡ ex = result;
¡¡¡¡ if(partialResult == 0.0) {
¡¡¡¡ result = 1.0;
¡¡¡¡ } else
¡¡¡¡ for(t=(int)partialResult-1; t > 0; t--)
¡¡¡¡ result = result * ex;
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡ } 
// Evaluate a unary + or -.
¡¡¡¡ private double evalExp5() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;
¡¡¡¡ String op;
¡¡¡¡ op = "";
¡¡¡¡ if((tokType == DELIMITER) &&
¡¡¡¡ token.equals("+") || token.equals("-")) {
¡¡¡¡ op = token;
¡¡¡¡ getToken();
¡¡¡¡ }
¡¡¡¡ result = evalExp6();
¡¡¡¡ if(op.equals("-")) result = -result;
¡¡¡¡ return result;
¡¡¡¡ }
¡¡¡¡ // Process a parenthesized expression.
¡¡¡¡ private double evalExp6() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result;
¡¡¡¡ if(token.equals("(")) {
¡¡¡¡ getToken();
¡¡¡¡ result = evalExp2();
¡¡¡¡ if(!token.equals(")"))
¡¡¡¡ handleErr(UNBALPARENS);
¡¡¡¡ getToken();
¡¡¡¡ }
¡¡¡¡ else result = atom();
¡¡¡¡ return result;
¡¡¡¡ }
¡¡¡¡ // Get the value of a number or variable.
¡¡¡¡ private double atom() throws ParserException
¡¡¡¡ {
¡¡¡¡ double result = 0.0;
¡¡¡¡ switch(tokType) {
¡¡¡¡ case NUMBER:
¡¡¡¡ try {
¡¡¡¡ result = Double.parseDouble(token);
¡¡¡¡ } catch (NumberFormatException exc) {
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ }
¡¡¡¡ getToken();
¡¡¡¡ break;
¡¡¡¡ case VARIABLE:
¡¡¡¡ result = findVar(token);
¡¡¡¡ getToken();
¡¡¡¡ break;
¡¡¡¡ default:
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ break;
¡¡¡¡ }
¡¡¡¡ return result;
¡¡¡¡ }
¡¡¡¡ // Return the value of a variable.
¡¡¡¡ private double findVar(String vname) throws ParserException
¡¡¡¡ {
¡¡¡¡ if(!Character.isLetter(vname.charAt(0))){
¡¡¡¡ handleErr(SYNTAX);
¡¡¡¡ return 0.0;
¡¡¡¡ }
¡¡¡¡ return vars[Character.toUpperCase(vname.charAt(0))-'A'];
¡¡¡¡ } 
// Return a token to the input stream.
¡¡¡¡ private void putBack()
¡¡¡¡ {
¡¡¡¡ if(token == EOE) return;
¡¡¡¡ for(int i=0; i < token.length(); i++) expIdx--;
¡¡¡¡ }
¡¡¡¡ // Handle an error.
¡¡¡¡ private void handleErr(int error) throws ParserException
¡¡¡¡ {
¡¡¡¡ String[] err = {
¡¡¡¡ "Syntax Error",
¡¡¡¡ "Unbalanced Parentheses",
¡¡¡¡ "No Expression Present",
¡¡¡¡ "Division by Zero"
¡¡¡¡ };
¡¡¡¡ throw new ParserException(err[error]);
¡¡¡¡ }
¡¡¡¡ // Obtain the next token.
¡¡¡¡ private void getToken()
¡¡¡¡ {
¡¡¡¡ tokType = NONE;
¡¡¡¡ token = "";
¡¡¡¡ // Check for end of expression.
¡¡¡¡ if(expIdx == exp.length()) {
¡¡¡¡ token = EOE;
¡¡¡¡ return;
¡¡¡¡ }
¡¡¡¡ // Skip over white space.
¡¡¡¡ while(expIdx < exp.length() &&
¡¡¡¡ Character.isWhitespace(exp.charAt(expIdx))) ++expIdx;
¡¡¡¡ // Trailing whitespace ends expression.
¡¡¡¡ if(expIdx == exp.length()) {
¡¡¡¡ token = EOE;
¡¡¡¡ return;
¡¡¡¡ }
¡¡¡¡ if(isDelim(exp.charAt(expIdx))) { // is operator
¡¡¡¡ token += exp.charAt(expIdx);
¡¡¡¡ expIdx++;
¡¡¡¡ tokType = DELIMITER;
¡¡¡¡ }
¡¡¡¡ else if(Character.isLetter(exp.charAt(expIdx))) { // is variable
¡¡¡¡ while(!isDelim(exp.charAt(expIdx))) {
¡¡¡¡ token += exp.charAt(expIdx);
¡¡¡¡ expIdx++;
¡¡¡¡ if(expIdx >= exp.length()) break;
¡¡¡¡ }
¡¡¡¡ tokType = VARIABLE;
¡¡¡¡ }
¡¡¡¡ else if(Character.isDigit(exp.charAt(expIdx))) { // is number
¡¡¡¡ while(!isDelim(exp.charAt(expIdx))) {
¡¡¡¡ token += exp.charAt(expIdx);
¡¡¡¡ expIdx++;
¡¡¡¡ if(expIdx >= exp.length()) break;
¡¡¡¡ }
¡¡¡¡ tokType = NUMBER;
¡¡¡¡ }
¡¡¡¡ else { // unknown character terminates expression
¡¡¡¡ token = EOE;
¡¡¡¡ return;
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡ // Return true if c is a delimiter.
¡¡¡¡ private boolean isDelim(char c)
¡¡¡¡ {
¡¡¡¡ if((" +-/*%^=()".indexOf(c) != -1))
¡¡¡¡ return true;
¡¡¡¡ return false;
¡¡¡¡ }
¡¡¡¡}
¡¡¡¡ÎªÁ˲âÊԸĽøºóµÄ½âÎöÆ÷µÄ¹¦ÄÜ£¬¶ÁÕß¿ÉÒÔʹÓÃÓÃÀ´²âÊÔµÚÒ»°æ±¾½âÎöÆ÷µÄͬһ¸ö³ÌÐò¡£ÓÐÁËÕâ¸ö¸Ä½øºóµÄ½âÎöÆ÷£¬Óû§¿ÉÒÔÊäÈëÈçÏÂʾÀý±í´ïʽ£º
¡¡¡¡A = 10/4
¡¡¡¡A ¨C B
¡¡¡¡C = A * (F ¨C 21)
µÝ¹éϽµ½âÎöÆ÷ÖеÄÓï·¨¼ì²é
ÔÚ½âÎö±í´ïʽʱ£¬±í´ïʽ±ØÐëÑϸñ·ûºÏ½âÎöÆ÷µÄÓï·¨¹æÔò¡£µ±ÊäÈë±í´ïʽ²»·ûºÏÕâÖÖ¹æÔòʱ¾Í»á²úÉúÓï·¨´íÎó¡£Í¨³£Çé¿öÏ£¬Óï·¨´íÎó¶¼ÊÇÓÉÈËΪÒòËØÒýÆðµÄ£¬×î³£¼ûµÄÊÇ´ò×Ö´íÎó¡£¾ÙÀýÀ´Ëµ£¬¶ÔÓÚ±¾Õ½éÉܵĽâÎöÆ÷¶øÑÔ£¬ÏÂÁбí´ïʽ¶¼²»ÊÇÓÐЧµÄ±í´ïʽ£º
¡¡¡¡10 ** 8
¡¡¡¡((10 ¨C 5) * 9
¡¡¡¡/8
¡¡¡¡µÚÒ»¸ö±í´ïʽ°üº¬ÁËÁ½¸öÁ¬ÐøµÄÔËËã·û£¬µÚ¶þ¸ö±í´ïʽȱÉÙÒ»¸öÓÒÀ¨ºÅ£¬µÚÈý¸ö±í´ïʽµÄ¿ªÍ·ÊÇÒ»¸ö³ýºÅ¡£½âÎöÆ÷Öв»ÔÊÐíÒÔÉÏÈκÎÒ»ÖÖÇé¿ö³öÏÖ¡£Óï·¨´íÎó»áµ¼Ö½âÎöÆ÷¸ø³ö´íÎóµÄ½âÎö½á¹û£¬Òò´Ë³ÌÐòÔ±±ØÐ뾡Á¿±ÜÃâ³öÏÖÕâÖÖ´íÎó¡£
¡¡¡¡ÔÚÕâ¸ö½âÎöÆ÷ÖУ¬´íÎó·¢Éúʱ»áµ÷ÓÃhandleErr()·½·¨¡£ÓëÆäËûÀàÐ͵ĽâÎöÆ÷²»Í¬£¬µÝ¹éϽµµÄ·½·¨Ê¹µÃÓï·¨¼ì²é¸ü¼Ó¼òµ¥£¬ÒòΪÔڴ󲿷ÖÇé¿öÏ£¬´íÎó»á·¢ÉúÔÚatom()¡¢findVar()»òÕßevalExp6()µÈ·½·¨ÖУ¬ÕâЩ·½·¨µÄ¹²Í¬µãÊǶ¼¶ÔÀ¨ºÅ½øÐмì²é¡£
¡¡¡¡µ÷ÓÃhandleErr()½«Å׳öParserExceptionÒì³££¬ÆäÖаüº¬¶Ô´íÎóµÄÃèÊö¡£ParserÀà±¾Éí²¢²»²¶×½Õâ¸öÒì³££¬¶øÊǽ«ÆäÅ׸øµ÷ÓôúÂë¡£ÕâÑùÒ»À´£¬½âÎöÆ÷»áÒòΪ·¢Éú´íÎó¶øÂíÉÏÖÕÖ¹½âÎö¹ý³Ì¡£µ±È»£¬¶ÁÕß¿ÉÒÔ¶ÔÕâÖÖ·½Ê½½øÐÐÐÞ¸ÄÒÔÊÊÓ¦×Ô¼ºµÄÐèÇó¡£
¡¡¡¡ÀýÈ磬¶ÁÕß¿ÉÒÔ½øÒ»²½À©³äParserException¶ÔÏóÖÐËù°üº¬µÄÐÅÏ¢¡£ÔÚµ±Ç°µÄ´úÂëÖУ¬Õâ¸öÀà½ö½ö´æ´¢Ò»¸öÃèÊö´íÎóµÄ×Ö·û´®¡£¶ÁÕßÒ²¿ÉÒÔÔö¼Ó´íÎó´úÂë±¾Éí£¬»òÕßÌí¼ÓÖ¸Ïò±í´ïʽ×Ö·û´®ÖдíÎó·¢ÉúµãµÄË÷Òý£¬»òÕßÔö¼ÓÆäËûһЩÐÅÏ¢
¼ÆËãÆ÷Applet
±¾Õ½éÉÜÁËÁ½¸ö½âÎöÆ÷£¬ËüÃǵÄʹÓ÷dz£¼òµ¥£¬¼¸ºõ¿ÉÒÔÓÃÓÚÈκÎÓ¦ÓóÌÐò¡£ÏÂÃæµÄÀý×Ó¿ÉÓÃÀ´ËµÃ÷½âÎöÆ÷µÄʹÓ÷½·¨¡£Õâ¸öÀý×ÓÖ»Óü¸ÐдúÂë¾Í´´½¨ÁËÒ»¸ö¹¦ÄÜÆëÈ«µÄ¼ÆËãÆ÷Applet¡£¸Ã¼ÆËãÆ÷ʹÓÃÁ½¸öÎı¾¿ò£ºµÚÒ»¸öÓÃÓÚ½ÓÊÕÐèÒª¼ÆËãµÄ±í´ïʽ£»µÚ¶þ¸öÓÃÓÚÏÔʾ¼ÆËã½á¹û¡£ÆäÖкóÕßÊÇÒ»¸öÖ»¶ÁÎı¾¿ò¡£¶ø´íÎóÏûÏ¢ÏÔʾÔÚ״̬À¸ÉÏ¡£Ê¾ÀýÔËÐеÄÊä³ö½á¹û(ʹÓÃApplet Viewer)Èçͼ2-1Ëùʾ¡£
¡¡¡¡// A simple calculator applet.
¡¡¡¡import java.awt.*;
¡¡¡¡import java.awt.event.*;
¡¡¡¡import java.applet.*;
¡¡¡¡/*
¡¡¡¡ <applet code="Calc" width=200 height=150>
¡¡¡¡ </applet>
¡¡¡¡*/
¡¡¡¡public class Calc extends Applet
¡¡¡¡ implements ActionListener {
¡¡¡¡ TextField expText, resText;
¡¡¡¡ Parser p;
¡¡¡¡ public void init() {
¡¡¡¡ Label heading = new
¡¡¡¡ Label("Expression Calculator ", Label.CENTER);
¡¡¡¡ Label explab = new Label("Expression ", Label.CENTER);
¡¡¡¡ Label reslab = new Label("Result ", Label.CENTER);
¡¡¡¡ expText = new TextField(24);
¡¡¡¡ resText = new TextField(24);
¡¡¡¡ resText.setEditable(false); // result field for display only
¡¡¡¡ add(heading);
¡¡¡¡ add(explab);
¡¡¡¡ add(expText);
¡¡¡¡ add(reslab);
¡¡¡¡ add(resText);
¡¡¡¡ /* Register expression text field
¡¡¡¡ to receive action events. */
¡¡¡¡ expText.addActionListener(this);
¡¡¡¡ // create parser
¡¡¡¡ p = new Parser();
¡¡¡¡ }
¡¡¡¡ // User pressed Enter.
¡¡¡¡ public void actionPerformed(ActionEvent ae) {
¡¡¡¡ repaint();
¡¡¡¡ }
¡¡¡¡ public void paint(Graphics g) {
¡¡¡¡ double result = 0.0;
¡¡¡¡ String expstr = expText.getText();
¡¡¡¡ try {
¡¡¡¡ if(expstr.length() != 0)
¡¡¡¡ result = p.evaluate(expstr);
¡¡¡¡// To clear expression after ENTER is pressed
¡¡¡¡// use the folloing line:
¡¡¡¡// expText.setText("");
¡¡¡¡ resText.setText(Double.toString(result));
¡¡¡¡ showStatus(""); // erase any previous error message
¡¡¡¡ } catch (ParserException exc) {
¡¡¡¡ showStatus(exc.toString());
¡¡¡¡ resText.setText("");
¡¡¡¡ }
¡¡¡¡ }
¡¡¡¡}

¡¡¡¡CalcÀàÊ×ÏÈÉùÃ÷3¸öʵÀý±äÁ¿£¬·Ö±ð±£´æ3¸öÒýÓᣵÚÒ»¸öÊÇexpText£¬Ö¸ÏòÊäÈë±í´ïʽµÄÎı¾¿ò×é¼þ£»µÚ¶þ¸öÊÇresText£¬Ö¸ÏòÏÔʾ¼ÆËã½á¹ûµÄÎı¾¿ò×é¼þ£»¶øÖ¸Ïò½âÎöÆ÷µÄÒýÓñ£´æÔÚ±äÁ¿pÖС£
¡¡¡¡CalcÀàµÄinit()·½·¨´´½¨Á½¸öÎı¾¿ò²¢½«ËüÃÇÌí¼Óµ½AppletÖУ¬È»ºóΪexpTextÎı¾¿ò×¢²áÒ»¸öÕìÌýÆ÷¡£Óû§Ã¿´ÎÊäÈë»Ø³µÊ±£¬Îı¾¿ò¶¼½«²úÉúÒ»¸öʼþ¡£ÓÉÓÚÏÔʾ½á¹ûµÄÎı¾¿òresTextÖ»ÓÃÓÚÏÔʾ¼ÆËã½á¹û£¬Òò´ËÔÚinit()Öе÷ÓÃsetEditable(false)·½·¨£¬½«ÆäÉèÖÃΪֻ¶ÁÊôÐÔ¡£¾­¹ýÕâÑùµÄÉèÖúó£¬ÏÔʾ½á¹ûµÄÎı¾¿ò´ÓÍâ¹ÛÉÏ¿´³ÊÏÖ»ÒÉ«£¬²¢ÇÒ²»ÔÙÏìÓ¦Óû§µÄÊäÈë¡£init()·½·¨×îºó³õʼ»¯ÁËÒ»¸öParserʵÀý²¢¸³¸ø±äÁ¿p¡£Ê¹ÓüÆËãÆ÷ʱ£¬Óû§Ö»ÐèÊäÈë±í´ïʽ£¬È»ºó»Ø³µ¡£³ÌÐò»á²úÉúÒ»¸öActionEventʼþ£¬²¢µ÷ÓÃactionPerformed()·½·¨À´´¦Àí¸Ãʼþ¡£½Ó×ÅactionPerformed()·½·¨Ïȵ÷ÓÃrepaint()·½·¨£¬×îºóµ÷ÓÃpaint()·½·¨¡£ÔÚpaint()·½·¨ÖУ¬½âÎöÆ÷Ö´ÐмÆËã¹ý³Ì£¬µÃ³ö±í´ïʽµÄ½á¹û£¬²¢ÏÔʾÔÚ½á¹ûÏÔʾÎı¾¿òÖС£×¢Ò⣺ËùÓеĴíÎó¶¼ÏÔʾÔÚ״̬À¸ÖС£
һЩ³¢ÊÔ
±¾ÕÂËù½éÉܵÄÁ½¸ö±í´ïʽ½âÎöÆ÷¿ÉÓÃÓÚÐí¶àÓÃ;£¬ÒòΪËüÃÇʹ³ÌÐòÔ±ÎÞÐè×öºÜ¶à¹¤×÷¼´¿ÉÀ©Õ¹Ó¦ÓóÌÐòµÄ¹¦ÄÜ¡£¿¼ÂÇÒ»¸öÒªÇóÓû§ÊäÈëÊý×ֵijÌÐò¡£ÀýÈçÓÐÒ»¸öÓ¦ÓóÌÐòÒªÇóÓû§ÊäÈëÐèÒª´òÓ¡µÄÎļþ·ÝÊý¡£ÔÚÕý³£Çé¿öÏ£¬³ÌÐòÖ»ÐèÒªÏÔʾһ¸öÎı¾¿ò²¢µÈ´ýÊäÈ룬Ȼºó½«ÊäÈëµÄÎı¾×ª»¯ÎªÓ¦ÓõÄÄÚ²¿Êý×Ö¸ñʽ¡£ÕâÖÖ¼òµ¥µÄ·½·¨ÔÊÐíÓû§ÊäÈëÒ»¸öÖµ£¬ÀýÈç100¡£È»¶ø£¬Èç¹û×ܹ²ÓÐ9¸ö²¿ÃÅ£¬Óû§Ï£ÍûΪÿ¸ö²¿ÃÅ´òÓ¡72·ÝÎļþ£¬¸ÃÈçºÎ´¦ÀíÄØ£¿ÕâʱÓû§±ØÐëÊÖ¹¤¼ÆËãµÃ³ö³Ë»ýµÄ½á¹û£¬²¢ÔÚÎı¾¿òÖÐÊäÈë648¡£È»¶ø£¬Èç¹ûÓû§¿ÉÒÔʹÓýâÎöÆ÷¼ÆËã´ÓÎı¾¿òÖеõ½µÄÊýÖµ£¬ÄÇô¾Í¿ÉÒÔÖ±½ÓÊäÈë9*72£¬¶ø²»ÔÙÐèÒªÆäËûÈκεÄÊÖ¹¤¼ÆËã¡£½âÎöºÍ¼ÆËãÊý×Ö±í´ïʽµÄÄÜÁ¦¿ÉÒÔ¸øÓ¦ÓóÌÐò(ÉõÖÁ×î¼òµ¥µÄÓ¦ÓóÌÐò)Ôö¼Ó³ÉÊ졢רҵµÄ¸Ð¾õ¡£Òò´Ë£¬²»·ÁÔÚÓ¦ÓóÌÐòÖг¢ÊÔʹÓýâÎöÆ÷À´´¦ÀíÊý×ÖµÄÊäÈëÎÊÌâ¡£
¡¡¡¡ÔÚ±¾ÕÂÖÐÔø¾­Ì¸µ½£¬½âÎöÆ÷Ö»Ö´ÐÐ×îСÏ޶ȵĴíÎó¼ì²é¡£Òò´ËÄú¿ÉÄÜÐèÒªÔö¼Ó¸üΪÏêϸµÄ´íÎ󱨸档ÀýÈ磬¿ÉÒÔÍ»³öÏÔʾÔÚ±í´ïʽÖмì²âµ½µÄ´íÎóλÖá£ÕâÑù¾ÍʹµÃÓû§Äܹ»ºÜ¿ì·¢ÏÖÓï·¨´íÎó²¢¼°Ê±¸ÄÕý¡£
¡¡¡¡ÏÖÔÚÕâÖÖ½âÎöÆ÷Ö»Äܹ»¼ÆËãÊý×Ö±í´ïʽ¡£È»¶ø£¬Èç¹ûÏòÆäÖÐÔö¼ÓһЩ´úÂ룬Ëü¾ÍÓпÉÄܼÆËãÆäËûÀàÐ͵ıí´ïʽ£¬ÀýÈç×Ö·û´®¡¢¿Õ¼ä×ø±ê»òÕßÊǸ´ÊýµÈ¡£¾ÙÀýÀ´Ëµ£¬ÎªÁËʹ½âÎöÆ÷Äܹ»¼ÆËã×Ö·û´®£¬±ØÐë×öÈçÏ¸Ķ¯£º
¡¡¡¡(1) ¶¨ÒåÒ»¸öбêʶ·ûÀàÐÍ£¬³ÆÎªSTRING¡£
¡¡¡¡(2) ÔöÇ¿getToken()·½·¨µÄ¹¦ÄÜ£¬Ê¹ÆäÄܹ»Õýȷʶ±ð×Ö·û´®¡£
¡¡¡¡(3) ÔÚatom()·½·¨ÖÐÌí¼ÓÒ»¸öеÄcase´¦ÀíÓï¾ä£¬ÓÃÀ´´¦ÀíSTRINGÀàÐ͵ıêʶ·û¡£
¡¡¡¡ÕâЩ²½ÖèÍê³ÉÖ®ºó£¬½âÎöÆ÷¾ÍÄܹ»ÕýÈ·´¦ÀíÈçÏÂ×Ö·û´®±í´ïʽ£º
¡¡¡¡a = "one"
¡¡¡¡b = "two"
¡¡¡¡c = a + b
¡¡¡¡±£´æÔÚcÖеĽá¹ûÓ¦¸ÃÊÇaºÍbµÄºÏ²¢£¬Ò²¾ÍÊÇ¡°onetwo¡±¡£
µÚÈý²¿·Ö ʹÓÃJavaʵÏÖÓïÑÔ½âÊÍÆ÷
´ó¶àÊý³ÌÐòÔ±¶¼Ôø¾­ÃÎÏë×Å´´Ôì×Ô¼ºµÄ¼ÆËã»úÓïÑÔ¡£Ì¹ÂʵØËµ£¬Äܹ»´´Ôì¡¢¿ØÖÆ¡¢ÔöÇ¿ºÍÐÞ¸ÄÊôÓÚ×Ô¼ºµÄ¼ÆËã»úÓïÑÔ£¬ÕâÖÖÏ뷨ȷʵ·Ç³£¾ßÓÐÎüÒýÁ¦¡£È»¶ø£¬Ö»Óм«ÉÙÊý³ÌÐòÔ±ÈÏΪ£¬ÊµÏÖÕâ¸öÏë·¨ÊÇÒ»¼þ·Ç³£ÈÝÒ׺ÍÁîÈËÓäÔõÄÊÂÇé¡£¿ª·¢Ò»¸ö¹¦ÄÜÆë±¸µÄ±àÒëÆ÷(ÀýÈçJava±àÒëÆ÷)µÄÈ·ÊÇÒ»Ïî¼è¾ÞµÄÈÎÎñ¡£µ«ÊÇÏà±È֮ϣ¬´´½¨Ò»¸öÓïÑÔ½âÊÍÆ÷È´¼òµ¥µÃ¶à¡£
ʹÓÃJavaʵÏÖÓïÑÔ½âÊÍÆ÷µÄÔ­Òò
ʹÓÃJavaʵÏÖÓïÑÔ½âÊÍÆ÷µÄÔ­Òò
¡¡¡¡´ó¶àÊý³ÌÐòÔ±¶¼Ôø¾­ÃÎÏë×Å´´Ôì×Ô¼ºµÄ¼ÆËã»úÓïÑÔ¡£Ì¹ÂʵØËµ£¬Äܹ»´´Ôì¡¢¿ØÖÆ¡¢ÔöÇ¿ºÍÐÞ¸ÄÊôÓÚ×Ô¼ºµÄ¼ÆËã»úÓïÑÔ£¬ÕâÖÖÏ뷨ȷʵ·Ç³£¾ßÓÐÎüÒýÁ¦¡£È»¶ø£¬Ö»Óм«ÉÙÊý³ÌÐòÔ±ÈÏΪ£¬ÊµÏÖÕâ¸öÏë·¨ÊÇÒ»¼þ·Ç³£ÈÝÒ׺ÍÁîÈËÓäÔõÄÊÂÇé¡£¿ª·¢Ò»¸ö¹¦ÄÜÆë±¸µÄ±àÒëÆ÷(ÀýÈçJava±àÒëÆ÷)µÄÈ·ÊÇÒ»Ïî¼è¾ÞµÄÈÎÎñ¡£µ«ÊÇÏà±È֮ϣ¬´´½¨Ò»¸öÓïÑÔ½âÊÍÆ÷È´¼òµ¥µÃ¶à¡£
¡¡¡¡¾¡¹Ü½âÊÍÆ÷ºÍ±àÒëÆ÷¶¼ÒÔÓ¦ÓóÌÐòÔ´´úÂë×÷ΪÊäÈëÄÚÈÝ£¬µ«ÊÇËüÃǶÔÕâЩԴ´úÂëµÄ´¦Àí¹ý³ÌÈ´½ØÈ»²»Í¬¡£±àÒëÆ÷½«³ÌÐòµÄÔ´´úÂëת»¯Îª¿ÉÖ´ÐдúÂëµÄÐÎʽ¡£Í¨³£Çé¿öÏ£¬ÕâÖÖ¿ÉÖ´ÐдúÂëÓɼÆËã»úµÄCPUÖ¸Áî×é³É£¬Òò´Ë¿ÉÒÔÖ±½ÓÔÚ¼ÆËã»úÉÏÖ´ÐС£ÀýÈ磬C++¼´²ÉÓÃÕâÖÖ±àÒ뷽ʽ¡£»¹ÓÐÒ»ÖÖÇé¿ö£¬±àÒëÆ÷Êä³öÒ»ÖÖ¿ÉÒÆÖ²µÄÖмä´úÂ룬ËüÃÇÓÉÔËÐÐʱϵͳִÐС£Java²ÉÓõľÍÊÇÕâÖÖ·½Ê½¡£ÔÚJavaÖУ¬³ÆÕâÖÖÖмä´úÂëΪ¡°×Ö½ÚÂë ¡±¡£
¡¡¡¡½âÊÍÆ÷µÄ¹¤×÷Ô­ÀíÔòÍêÈ«²»Í¬¡£Ëü˳Ðò¶ÁÈë³ÌÐòµÄÔ´´úÂ룬ȻºóÒÀ´ÎÖ´ÐÐÿһÌõÓï¾ä¡£Òò´Ë£¬½âÊÍÆ÷²¢²»ÕæÕý½«Ô´´úÂëת»¯ÎªÄ¿±ê´úÂ룬¶øÊÇÖ±½ÓÖ´ÐгÌÐò¡£¾¡¹ÜʹÓýâÊÍÆ÷Ö´ÐгÌÐòµÄËٶȱȽ«ÏàͬµÄ³ÌÐò±àÒë³ÉÄ¿±ê´úÂëºóÔÙÖ´ÐеÄËÙ¶ÈÂý£¬µ«ÊǽâÊÍÆ÷ÈÔÈ»ÔÚ±à³ÌÖб»¹ã·ºÊ¹Óá£Ô­ÒòÓÐÒÔϼ¸¸ö·½Ã棺
¡¡¡¡µÚÒ»£¬½âÊÍÆ÷Äܹ»Ìá¹©ÕæÕýµÄ½»»¥Ê½»·¾³£¬ÓɽâÊÍÆ÷Ö´ÐеijÌÐòÄܹ»¸ù¾ÝÓû§µÄÖ¸ÁîÔÝÍ£»òÕ߻ָ´ÔËÐС£ÕâÖÖ½»»¥Ê½»·¾³ÔÚ»úÆ÷È˼¼ÊõµÈ·½ÃæÓÃ;ºÜ¹ã¡£µÚ¶þ£¬ÓïÑÔ½âÊÍÆ÷µÄÏÈÌìÌØÐÔ¾ö¶¨ÁËËüÃÇÌØ±ðÊʺÏÓÚ½»»¥Ê½µÄ³ÌÐòµ÷ÊÔ¡£µÚÈý£¬½âÊÍÆ÷×îÊʺÏÓÚ×÷Ϊ¡°½Å±¾ÓïÑÔ¡±£¬±ÈÈçÊý¾Ý¿â²éѯÓïÑԵȡ£µÚËÄ£¬ÓïÑÔ½âÊÍÆ÷ʹµÃͬһ¸ö³ÌÐòÔËÐÐÓÚ²»Í¬ÀàÐÍµÄÆ½Ì¨³ÉΪ¿ÉÄÜ¡£´ËʱΩһµÄ¹¤×÷Ö»ÊÇΪÿ¸öл·¾³ÊµÏÖ½âÊÍÆ÷µÄÔËÐаü¡£
¡¡¡¡ÔÚÓÐЩÇé¿öÏ£¬ÊõÓï¡°½âÊÍÆ÷¡±µÄº¬ÒåÓë¸Õ²ÅËùÃèÊöµÄÇé¿öÓÐËù²»Í¬¡£ÀýÈ磬×î³õµÄJavaÔËÐÐʱϵͳ±»³ÆÎª¡°×Ö½ÚÂë½âÊÍÆ÷¡±¡£µ«ÊÇÕâÖÖ½âÊÍÆ÷Óë±¾ÕÂÖнéÉܵĽâÊÍÆ÷µÄÀàÐͲ¢²»ÍêÈ«Ïàͬ¡£×Ö½ÚÂëÊÇÒ»×é¸ß¶ÈÓÅ»¯µÄ¿ÉÒÆÖ²µÄ»úÆ÷Ö¸Á¶øJavaÔËÐÐʱϵͳÔòΪ×Ö½ÚÂëÌṩһ¸öÖ´Ðл·¾³¡£È»¶øJavaÔËÐÐʱϵͳ²¢²»Ö±½ÓÖ´ÐÐÔ´´úÂ룬¶øÊÇÖ´ÐпÉÒÆÖ²µÄ»úÆ÷´úÂë¡£ÕâÒ²ÊÇJavaÔËÐÐʱϵͳ±»³ÆÎªJavaÐéÄâ»úµÄÔ­Òò¡£
¡¡¡¡½«Òª½éÉܵĽâÊÍÆ÷´úÂë²»½öÓÐȤ¶øÇÒʵÓá£Í¬Ê±£¬Ëü»¹³ä·ÖÏÔʾÁËJavaÓïÑÔ¼òµ¥¸ßЧµÄÌØÐÔ¡£ÓëµÚ2ÕÂÖнéÉܵĽâÎöÆ÷ÏàͬµÄÊÇ£¬Õâ¸öÓïÑÔ½âÊÍÆ÷ҲʹÓá°´¿´úÂ롱±àд¡£Í¬Ê±£¬½âÊÍÆ÷Ò²ÊÇÒ»¸öÏ൱¸´ÔӵijÌÐò£¬µ«ÊÇʹÓÃJavaÓïÑÔʵÏÖÆðÀ´È´·Ç³£¼òµ¥£¬ÕâÒ²ÊÇJavaÓïÑÔ¹¦ÄܶàÑù»¯µÄÒ»¸öÀýÖ¤¡£´ËÍ⣬½âÎöÆ÷´úÂëµÄ¼ò½à»¹ÏÔʾÁËJavaÓï·¨ºÍ¿âµÄÇ¿´ó±í´ïÄÜÁ¦

½âÊͺÎÖÖ¼ÆËã»úÓïÑÔ
¡¡¡¡ÔÚ¹¹Ôì½âÊÍÆ÷֮ǰ£¬Ê×ÏȱØÐëÈ·¶¨½«Òª½âÊ͵ÄÓïÑÔÀàÐÍ¡£¾¡¹ÜJavaËÆºõÊǸö²»´íµÄÑ¡Ôñ£¬µ«ÊÇËü¹ýÓÚÅÓ´óºÍ¸´ÔÓ¡£¼´Ê¹Ñ¡È¡JavaÓïÑÔµÄÒ»¸öСµÄ×Ó¼¯Ò²ÏÔµÃÌ«´óÁË£¬ÒòΪÎÒÃÇÖ»´òËãÀûÓÃÒ»ÕÂµÄÆª·ù½øÐн²½â¡£¶øÇÒ£¬Í¨³£Çé¿öÏÂҲûÓбØÒªÎªÒ»¸öÏñJavaÄÇôǿ´óµÄÓïÑÔ±àд½âÊÍÆ÷£»Ïà·´µØ£¬±àдһ¸ö½âÊÍÆ÷´¦ÀíijÖÖÏà¶Ô¼òµ¥µÄ¼ÆËã»úÓïÑÔµ¹ÊÇ¿ÉÐеġ£Òò´Ë£¬¸üºÃµÄ×ö·¨ÊÇÑ¡ÔñÒ»ÖÖÒ×ÓÚ½âÊÍ¡¢½ÏΪ¼òµ¥µÄÓïÑÔ¡£BASICÓïÑÔµÄÔçÆÚ°æ±¾¾Í·Ç³£·ûºÏÕâЩ±ê×¼£¬Òò´ËÔÚ´ËÑ¡ÔñÁËBASICÓïÑÔµÄÒ»¸ö×Ó¼¯£¬½«Æä×÷Ϊ±¾ÕÂÖÐËù½éÉܵĽâÊÍÆ÷µÄ½âÊÍÓïÑÔ¡£ÔÚÏÂÎÄÖн«³ÆÕâ¸ö×Ó¼¯ÎªSmall BASIC¡£
¡¡¡¡±¾ÕÂÑ¡ÔñÁËÕâ¸öÀàBASICÓïÑÔÓÐ3·½ÃæÔ­Òò¡£µÚÒ»£¬BASICÓïÑÔ×î³õÕýÊÇΪ½âÊÍÖ´ÐжøÉè¼ÆµÄ¡£Òò´Ë£¬ÊµÏÖÒ»¸öBASIC½âÊÍÆ÷Ïà¶Ô±È½ÏÈÝÒס£ÀýÈ磬BASICÓïÑÔµÄÔçÆÚ°æ±¾²»Ö§³Ö¾Ö²¿±äÁ¿¡¢µÝ¹é·½·¨¡¢Óï¾ä¿é¡¢Àà¡¢ÖØÔØµÈÌØÕ÷¡ª¡ª µ«ÊÇÒÔÉÏËùÓÐÕâÐ©ÌØÐÔ¶¼½«Ôö¼ÓBASICÓïÑԵĸ´ÔÓÐÔ¡£ËäȻȱÉÙÁËÐí¶à¹¦ÄÜ£¬µ«ÊǽâÊÍBASIC×Ó¼¯µÄ»ù±¾Ô­ÀíͬÑùÊÊÓÃÓÚÆäËûÓïÑÔ¡£Àí½â±¾ÕÂÖнéÉܵĽâÊÍÆ÷´úÂ룬Äܹ»Îª¿ª·¢ÆäËûÓïÑÔ½âÊÍÆ÷´òÏ»ù´¡¡£Ñ¡ÔñBASICµÄµÚ¶þ¸öÔ­ÒòÊÇ£¬¿ÉÒÔÓÃÏà¶Ô½ÏСµÄ´úÂëÁ¿ÊµÏÖÒ»¸ö½ÏΪºÏÀíµÄ×Ó¼¯¡£µÚÈý£¬ÔçÆÚµÄBASICÓïÑÔÓï·¨¼òµ¥¡¢ÈÝÒ×ÕÆÎÕ£¬¼¸ºõ²»ÐèÒªÓöîÍâµÄʱ¼äÀ´Ñ§Ï°¡£Òò´Ë£¬¼´Ê¹Ò»µã¶¼²»Á˽⴫ͳµÄBASICÓïÑÔ£¬Ò²Äܹ»ºÁÎÞÀ§ÄѵØÊ¹ÓÃSmall BASIC¡£
¡¡¡¡ÏÂÃæ¸ø³öÒ»¸öÓÃSmall BASIC±àдµÄ³ÌÐò£¬¿ÉÒÔ¿´µ½£¬Ê¹ÓÃÕâÖÖÓïÑÔÊǶàôµÄ¼òµ¥¡£¼´Ê¹´ÓÀ´Ã»Óмû¹ý´«Í³·ç¸ñµÄBASIC³ÌÐò£¬Ò²Äܹ»ÇáËÉÀí½âÆä²Ù×÷¹ý³Ì¡£
¡¡¡¡PRINT "A Simple Small BASIC Program"
¡¡¡¡FOR X = 1 TO 10
¡¡¡¡GOSUB 100
¡¡¡¡NEXT
¡¡¡¡END
¡¡¡¡100 PRINT X
¡¡¡¡RETURN
¡¡¡¡¸Ã³ÌÐòÔËÐкóµÃµ½ÈçϵÄÊä³ö½á¹û£º
¡¡¡¡A Simple Small BASIC Program
¡¡¡¡1.0
¡¡¡¡2.0
¡¡¡¡3.0
¡¡¡¡4.0
¡¡¡¡5.0
¡¡¡¡6.0
¡¡¡¡7.0
¡¡¡¡8.0
¡¡¡¡9.0
¡¡¡¡10.0
¡¡¡¡¾¡¹ÜÔÚSmall BASICÓïÑÔÖйؼü×ֵĺ¬Ò弸ºõһĿÁËÈ»£¬µ«ÊDZ¾ÕÂÈÔ½«Ïêϸ½âÊÍÿ¸ö¹Ø¼ü×Ö¡£
¡¡¡¡×îºó£¬Small BASIC·ÂÔìµÄÊÇÔçÆÚµÄBASIC°æ±¾£¬Ëü²»Í¬ÓÚºóÀ´³öÏÖµÄVisual Basic¡£ÊÂʵÉÏ£¬Visual BasicÓëԭʼµÄBASIC¼¸ºõûÓжàÉÙ¹²Í¬µã¡£µ±È»£¬Ö»ÒªÕÆÎÕÁËÕâ¸ö½âÊÍÆ÷µÄ¹¤×÷Ô­Àí£¬¾Í¿ÉÒÔ¸ÄÔìËü£¬Ê¹Ö®Äܹ»½âÊÍËùÐèÒªµÄÈκÎÓïÑÔ»òÕß±äÁ¿
½âÊÍÆ÷¸ÅÊö
ÔÚ¿ªÊ¼Ö®Ç°ÓбØÒªÔÙ´ÎÇ¿µ÷£º±¾Õ½éÉܵĽâÊÍÆ÷ÊÇÒ»¸öÔ´´úÂë½âÊÍÆ÷¡£Ò²¾ÍÊÇ˵£¬½âÊÍÆ÷ÔÚÖ´ÐÐʱ£¬Ã¿´Î¶ÁÈëÒ»ÌõÓï¾ä£¬²¢ÇÒ¸ù¾ÝÕâÌõÓï¾äÖ´ÐÐÌØ¶¨µÄ²Ù×÷£»È»ºóÔÙ¶ÁÈëÏÂÒ»ÌõÓï¾ä£¬ÒÀ´ÎÀàÍÆ¡£ÕâÓëα´úÂë½âÊÍÆ÷ÊÇÓÐËùÇø±ðµÄ£¬ÀýÈçÔçÆÚµÄJavaÔËÐÐʱϵͳ¡£Á½ÕßµÄÇø±ðÔÚÓÚ£ºÔ´´úÂë½âÊÍÆ÷Ö±½Ó¶Ô³ÌÐòµÄÔ´´úÂë½âÊÍÖ´ÐУ»¶øÎ±´úÂë½âÊÍÆ÷ÏȽ«³ÌÐòµÄÔ´´úÂëת»¯ÎªÄ³ÖÖÓë»úÆ÷Î޹صÄÖмä´úÂ룬ȻºóÔÙÖ´ÐÐÖмä´úÂë¡£Ïà±È֮ϣ¬Ô´´úÂë½âÊÍÆ÷¸üÒ×ÓÚ´´½¨£¬²¢ÇÒ²»ÐèÒªÒ»¸ö¶ÀÁ¢µÄ±àÒë¹ý³Ì¡£
¡¡¡¡Small BASIC½âÊÍÆ÷°üÀ¨Á½¸öÖ÷ÒªµÄ×Óϵͳ£ºÒ»¸öÊDZí´ïʽ½âÎöÆ÷£¬¸ºÔð´¦ÀíÊý×Ö±í´ïʽ£»ÁíÒ»¸öÊǽâÊÍÆ÷£¬¸ºÔð³ÌÐòµÄʵ¼ÊÖ´ÐС£¶ÔÓÚǰÕߣ¬¿É²ÉÓñ¾ÊéµÚ2ÕÂËù½éÉܵıí´ïʽ½âÎöÆ÷¡£µ«ÊÇÔÚÕâÀï×öÁËijЩ¸Ä½ø£¬Ê¹µÃ½âÎöÆ÷Äܹ»½âÎö°üº¬ÔÚ³ÌÐòÓï¾äÖеÄÊý×Ö±í´ïʽ£¬¶ø²»ÊÇÖ»ÄܽâÎö¹ÂÁ¢µÄ±í´ïʽ¡£
¡¡¡¡½âÊÍÆ÷×ÓϵͳºÍ½âÎöÆ÷×Óϵͳ°üº¬ÔÚͬһ¸ö½âÊÍÆ÷ÀàÖУ¬¸ÃÀàÃûΪSBasic¡£¾¡¹Ü´ÓÀíÂÛÉϽ²¿ÉÒÔʹÓÃÁ½¸ö¶ÀÁ¢µÄÀࣺһ¸ö°üº¬½âÊÍÆ÷£¬ÁíÒ»¸ö°üº¬±í´ïʽ½âÎöÆ÷£»µ«Êǽ«Á½ÕßÓÃͬһ¸öÀàÀ´ÊµÏֵĴúЧÂÊ»á¸ü¸ß£¬ÒòΪ±í´ïʽ½âÎöÆ÷ºÍ½âÊÍÆ÷µÄ´úÂëÊÇÃܲ»¿É·ÖµÄ¡£ÀýÈ磬Á½¸ö×Óϵͳ¶¼²Ù×÷±£´æ×ųÌÐò´úÂëµÄͬһ¸ö×Ö·ûÊý×é¡£Èç¹û½«ËüÃÇ·Ö±ð°²ÅÅÔÚÁ½¸öÀàÖУ¬½«»áÔö¼Ó¿É¹ÛµÄ¶îÍ⿪Ïú£¬²¢µ¼ÖÂÐÔÄÜÉϵÄËðʧºÍ¹¦ÄÜÉϵÄÖØ¸´¡£´ËÍ⣬ÓÉÓÚ³ÌÐò½âÊ͵ÄÈÎÎñ·±ÖØ£¬¶ø½âÎö±í´ïʽֻÊÇÆäÖеÄÒ»²¿·Ö£¬Òò´Ë½«Õû¸ö½âÊÍ»úÖÆ°üº¬ÔÚµ¥¸öÀàÖÐÊǺÜÓÐÒâÒåµÄ¡£
¡¡¡¡½âÊÍÆ÷Ö´ÐÐʱ£¬Ã¿´Î´Ó³ÌÐòµÄÔ´´úÂëÖжÁÈëÒ»¸ö±êʶ·û¡£Èç¹û¶ÁÈëµÄÊǹؼü×Ö£¬½âÊÍÆ÷¾Í°´Õոùؼü×ÖµÄÒªÇóÖ´Ðй涨µÄ²Ù×÷¡£¾ÙÀýÀ´Ëµ£¬µ±½âÊÍÆ÷¶ÁÈëÒ»¸öPRINTºó£¬Ëü½«´òÓ¡PRINTÖ®ºóµÄ×Ö·û£»µ±¶ÁÈëÒ»¸öGOSUBʱ£¬Ëü¾ÍÖ´ÐÐÖ¸¶¨µÄ×Ó³ÌÐò¡£ÔÚµ½´ï³ÌÐòµÄ½áβ֮ǰ£¬Õâ¸ö¹ý³Ì½«·´¸´½øÐС£¿ÉÒÔ¿´µ½£¬½âÊÍÆ÷Ö»ÊǼòµ¥µØÖ´ÐгÌÐòÖ¸¶¨µÄ¶¯×÷¡£
Small BASIC½âÊÍÆ÷
Small BASIC½âÊÍÆ÷µÄ´úÂëÏ൱³¤¡ª¡ª Ò»°ãÇé¿öϲ»»á½«Õâô³¤µÄ´úÂë·ÅÔÚÊéµÄÒ»ÕÂÖ®ÖС£µ«ÊDz»Òª±»ËüµÄ³¤¶ÈËùÏŵ¹¡£Å׿ªÆä³¤¶È²»Ì¸£¬Õâ¸ö½âÊÍÆ÷µÄ¸ÅÄîÆäʵ±È½Ï¼òµ¥£¬Ö»ÒªÕÆÎÕÁ˽âÊÍÆ÷µÄÒ»°ãģʽ£¬¾ÍÄÜÇáËÉÀí½âËüµÄÿ¸ö²¿·Ö¡£
¡¡¡¡½ÓÏÂÀ´¸ø³öSmall BASIC½âÊÍÆ÷µÄÍêÕû´úÂë¡£±¾ÕÂÊ£ÏÂµÄÆª·ù½«Ïêϸ½âÊÍËüµÄ¹¤×÷Ô­ÀíºÍʹÓ÷½·¨¡£
// A Small BASIC Interpreter.
import java.io.*;
import java.util.*;
// Exception class for interpreter errors.
class InterpreterException extends Exception {
String errStr; // describes the error
public InterpreterException(String str) {
errStr = str;
}
public String toString() {
return errStr;
}
}
// The Small BASIC interpreter.
class SBasic {
final int PROG_SIZE = 10000; // maximum program size
// These are the token types.
final int NONE = 0;
final int DELIMITER = 1;
final int VARIABLE = 2;
final int NUMBER = 3;
final int COMMAND = 4;
final int QUOTEDSTR = 5;
// These are the types of errors.
final int SYNTAX = 0;
final int UNBALPARENS = 1;
final int NOEXP = 2;
final int DIVBYZERO = 3;
final int EQUALEXPECTED = 4;
final int NOTVAR = 5;
final int LABELTABLEFULL = 6;
final int DUPLABEL = 7;
final int UNDEFLABEL = 8;
final int THENEXPECTED = 9;
final int TOEXPECTED = 10;
final int NEXTWITHOUTFOR = 11;
final int RETURNWITHOUTGOSUB = 12;
final int MISSINGQUOTE = 13;
final int FILENOTFOUND = 14;
final int FILEIOERROR = 15;
final int INPUTIOERROR = 16;
// Internal representation of the Small BASIC keywords.
final int UNKNCOM = 0;
final int PRINT = 1;
final int INPUT = 2;
final int IF = 3;
final int THEN = 4;
final int FOR = 5;
final int NEXT = 6;
final int TO = 7;
final int GOTO = 8;
final int GOSUB = 9;
final int RETURN = 10;
final int END = 11;
final int EOL = 12;
// This token indicates end-of-program.
final String EOP = "\0";
// Codes for double-operators, such as <=.
final char LE = 1;
final char GE = 2;
final char NE = 3;
// Array for variables.
private double vars[];
// This class links keywords with their keyword tokens.
class Keyword {
String keyword; // string form
int keywordTok; // internal representation
Keyword(String str, int t) {
keyword = str;
keywordTok = t;
}
}
/* Table of keywords with their internal representation.
All keywords must be entered lowercase. */
Keyword kwTable[] = {
new Keyword("print", PRINT), // in this table.
new Keyword("input", INPUT),
new Keyword("if", IF),
new Keyword("then", THEN),
new Keyword("goto", GOTO),
new Keyword("for", FOR),
new Keyword("next", NEXT),
new Keyword("to", TO),
new Keyword("gosub", GOSUB),
new Keyword("return", RETURN),
new Keyword("end", END)
};
private char[] prog; // refers to program array
private int progIdx; // current index into program
private String token; // holds current token
private int tokType; // holds token's type
private int kwToken; // internal representation of a keyword
// Support for FOR loops.
class ForInfo {
int var; // counter variable
double target; // target value
int loc; // index in source code to loop to
}
// Stack for FOR loops.
private Stack fStack;
// Defines label table entries.
class Label {
String name; // label
int loc; // index of label's location in source file
public Label(String n, int i) {
name = n;
loc = i;
}
}
// A map for labels.
private TreeMap labelTable;
// Stack for gosubs.
private Stack gStack;
// Relational operators.
char rops[] = {
GE, NE, LE, '<', '>', '=', 0
};
/* Create a string containing the relational
operators in order to make checking for
them more convenient. */
String relops = new String(rops);
// Constructor for SBasic.
public SBasic(String progName)
throws InterpreterException {
char tempbuf[] = new char[PROG_SIZE];
int size;
// Load the program to execute.
size = loadProgram(tempbuf, progName);
if(size != -1) {
// Create a properly sized array to hold the program.
prog = new char[size];
// Copy the program into program array.
System.arraycopy(tempbuf, 0, prog, 0, size);
}
}
// Load a program.
private int loadProgram(char[] p, String fname)
throws InterpreterException
{
int size = 0;
try {
FileReader fr = new FileReader(fname);
BufferedReader br = new BufferedReader(fr);
size = br.read(p, 0, PROG_SIZE);
fr.close();
} catch(FileNotFoundException exc) {
handleErr(FILENOTFOUND);
} catch(IOException exc) {
handleErr(FILEIOERROR);
}

// If file ends with an EOF mark, back up.
if(p[size-1] == (char) 26) size--;
return size; // return size of program
}
// Execute the program.
public void run() throws InterpreterException {
// Initialize for new program run.
vars = new double[26];
fStack = new Stack();
labelTable = new TreeMap();
gStack = new Stack();
progIdx = 0;
scanLabels(); // find the labels in the program
sbInterp(); // execute
}
// Entry point for the Small BASIC interpreter.
private void sbInterp() throws InterpreterException
{
// This is the interpreter's main loop.
do {
getToken();
// Check for assignment statement.
if(tokType==VARIABLE) {
putBack(); // return the var to the input stream
assignment(); // handle assignment statement
}
else // is keyword
switch(kwToken) {
case PRINT:
print();
break;
case GOT
execGoto();
break;
case IF:
execIf();
break;
case FOR:
execFor();
break;
case NEXT:
next();
break;
case INPUT:
input();
break;
case GOSUB:
gosub();
break;
case RETURN:
greturn();
break;
case END:
return;
}
} while (!token.equals(EOP));
}
// Find all labels.
private void scanLabels() throws InterpreterException
{
int i;
Object result;
// See if the first token in the file is a label.
getToken();
if(tokType==NUMBER)
labelTable.put(token, new Integer(progIdx));
findEOL();
do {
getToken();
if(tokType==NUMBER) {// must be a line number
result = labelTable.put(token,
new Integer(progIdx));
if(result != null)
handleErr(DUPLABEL);
}
// If not on a blank line, find next line.
if(kwToken != EOL) findEOL();
} while(!token.equals(EOP));
progIdx = 0; // reset index to start of program
}
// Find the start of the next line.
private void findEOL()
{
while(progIdx < prog.length &&
prog[progIdx] != '\n') ++progIdx;
if(progIdx < prog.length) progIdx++;
}
// Assign a variable a value.
private void assignment() throws InterpreterException
{
int var;
double value;
char vname;
// Get the variable name.
getToken();
vname = token.charAt(0);
if(!Character.isLetter(vname)) {
handleErr(NOTVAR);
return;
}
// Convert to index into variable table.
var = (int) Character.toUpperCase(vname) - 'A';
// Get the equal sign.
getToken();
if(!token.equals("=")) {
handleErr(EQUALEXPECTED);
return;
}
// Get the value to assign.
value = evaluate();
// Assign the value.
vars[var] = value;
}
// Execute a simple version of the PRINT statement.
private void print() throws InterpreterException
{
double result;
int len=0, spaces;
String lastDelim = "";
do {
getToken(); // get next list item
if(kwToken==EOL || token.equals(EOP)) break;
if(tokType==QUOTEDSTR) { // is string
System.out.print(token);
len += token.length();
getToken();
}
else { // is expression
putBack();
result = evaluate();
getToken();
System.out.print(result);
// Add length of output to running total.
Double t = new Double(result);
len += t.toString().length(); // save length
}
lastDelim = token;
// If comma, move to next tab stop.
if(lastDelim.equals(",")) {
// compute number of spaces to move to next tab
spaces = 8 - (len % 8);
len += spaces; // add in the tabbing position
while(spaces != 0) {
System.out.print(" ");
spaces--;
}
}
else if(token.equals(";")) {
System.out.print(" ");
len++;
}
else if(kwToken != EOL && !token.equals(EOP))
handleErr(SYNTAX);
} while (lastDelim.equals(";") || lastDelim.equals(","));
if(kwToken==EOL || token.equals(EOP)) {
if(!lastDelim.equals(";") && !lastDelim.equals(","))
System.out.println();
}
else handleErr(SYNTAX);
}
// Execute a GOTO statement.
private void execGoto() throws InterpreterException
{
Integer loc;
getToken(); // get label to go to
// Find the location of the label.
loc = (Integer) labelTable.get(token);
if(loc == null)
handleErr(UNDEFLABEL); // label not defined
else // start program running at that loc
progIdx = loc.intValue();
}
// Execute an IF statement.
private void execIf() throws InterpreterException
{
double result;
result = evaluate(); // get value of expression
/* If the result is true (non-zero),
process target of IF. Otherwise move on
to next line in the program. */
if(result != 0.0) {
getToken();
if(kwToken != THEN) {
handleErr(THENEXPECTED);
return;
} // else, target statement will be executed
}
else findEOL(); // find start of next line
}
// Execute a FOR loop.
private void execFor() throws InterpreterException
{
ForInfo stckvar = new ForInfo();
double value;
char vname;
getToken(); // read the control variable
vname = token.charAt(0);
if(!Character.isLetter(vname)) {
handleErr(NOTVAR);
return;
}
// Save index of control var.
stckvar.var = Character.toUpperCase(vname) - 'A';
getToken(); // read the equal sign
if(token.charAt(0) != '=') {
handleErr(EQUALEXPECTED);
return;
}
value = evaluate(); // get initial value
vars[stckvar.var] = value;
getToken(); // read and discard the TO
if(kwToken != TO) handleErr(TOEXPECTED);
stckvar.target = evaluate(); // get target value
/* If loop can execute at least once,
push info on stack. */
if(value >= vars[stckvar.var]) {
stckvar.loc = progIdx;
fStack.push(stckvar);
}
else // otherwise, skip loop code altogether
while(kwToken != NEXT) getToken();
}
// Execute a NEXT statement.
private void next() throws InterpreterException
{
ForInfo stckvar;
try {
// Retrieve info for this For loop.
stckvar = (ForInfo) fStack.pop();
vars[stckvar.var]++; // increment control var
// If done, return.
if(vars[stckvar.var] > stckvar.target) return;
// Otherwise, restore the info.
fStack.push(stckvar);
progIdx = stckvar.loc; // loop
} catch(EmptyStackException exc) {
handleErr(NEXTWITHOUTFOR);
}
}
// Execute a simple form of INPUT.
private void input() throws InterpreterException
{
int var;
double val = 0.0;
String str;
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
getToken(); // see if prompt string is present
if(tokType == QUOTEDSTR) {
// if so, print it and check for comma
System.out.print(token);
getToken();
if(!token.equals(",")) handleErr(SYNTAX);
getToken();
}
else System.out.print("? "); // otherwise, prompt with ?
// get the input var
var = Character.toUpperCase(token.charAt(0)) - 'A';
try {
str = br.readLine();
val = Double.parseDouble(str); // read the value
} catch (IOException exc) {
handleErr(INPUTIOERROR);
} catch (NumberFormatException exc) {
/* You might want to handle this error
differently than the other interpreter
errors. */
System.out.println("Invalid input.");
}
vars[var] = val; // store it
}
// Execute a GOSUB.
private void gosub() throws InterpreterException
{
Integer loc;
getToken();
// Find the label to call.
loc = (Integer) labelTable.get(token);
if(loc == null)
handleErr(UNDEFLABEL); // label not defined
else {
// Save place to return to.
gStack.push(new Integer(progIdx));
// Start program running at that loc.
progIdx = loc.intValue();
}
}
// Return from GOSUB.
private void greturn() throws InterpreterException
{
Integer t;
try {
// Restore program index.
t = (Integer) gStack.pop();
progIdx = t.intValue();
} catch(EmptyStackException exc) {
handleErr(RETURNWITHOUTGOSUB);
}
}
// **************** Expression Parser ****************
// Parser entry point.
private double evaluate() throws InterpreterException
{
double result = 0.0;
getToken();
if(token.equals(EOP))
handleErr(NOEXP); // no expression present
// Parse and evaluate the expression.
result = evalExp1();
putBack();
return result;
}
// Process relational operators.
private double evalExp1() throws InterpreterException
{
double l_temp, r_temp, result;
char op;
result = evalExp2();
// If at end of program, return.
if(token.equals(EOP)) return result;
op = token.charAt(0);
if(isRelop(op)) {
l_temp = result;
getToken();
r_temp = evalExp1();
switch(op) { // perform the relational operation
case '<':
if(l_temp < r_temp) result = 1.0;
else result = 0.0;
break;
case LE:
if(l_temp <= r_temp) result = 1.0;
else result = 0.0;
break;
case '>':
if(l_temp > r_temp) result = 1.0;
else result = 0.0;
break;
case GE:
if(l_temp >= r_temp) result = 1.0;
else result = 0.0;
break;
case '=':
if(l_temp == r_temp) result = 1.0;
else result = 0.0;
break;
case NE:
if(l_temp != r_temp) result = 1.0;
else result = 0.0;
break;
}
}
return result;
}
// Add or subtract two terms.
private double evalExp2() throws InterpreterException
{
char op;
double result;
double partialResult;
result = evalExp3();
while((op = token.charAt(0)) == '+' || op == '-') {
getToken();
partialResult = evalExp3();
switch(op) {
case '-':
result = result - partialResult;
break;
case '+':
result = result + partialResult;
break;
}
}
return result;
}
// Multiply or divide two factors.
private double evalExp3() throws InterpreterException
{
char op;
double result;
double partialResult;
result = evalExp4();
while((op = token.charAt(0)) == '*' ||
op == '/' || op == '%') {
getToken();
partialResult = evalExp4();
switch(op) {
case '*':
result = result * partialResult;
break;
case '/':
if(partialResult == 0.0)
handleErr(DIVBYZERO);
result = result / partialResult;
break;
case '%':
if(partialResult == 0.0)
handleErr(DIVBYZERO);
result = result % partialResult;
break;
}
}
return result;
}
// Process an exponent.
private double evalExp4() throws InterpreterException
{
double result;
double partialResult;
double ex;
int t;
result = evalExp5();
if(token.equals("^")) {
getToken();
partialResult = evalExp4();
ex = result;
if(partialResult == 0.0) {
result = 1.0;
} else
for(t=(int)partialResult-1; t > 0; t--)
result = result * ex;
}
return result;
}
// Evaluate a unary + or -.
private double evalExp5() throws InterpreterException
{
double result;
String op;
op = "";
if((tokType == DELIMITER) &&
token.equals("+") || token.equals("-")) {
op = token;
getToken();
}
result = evalExp6();
if(op.equals("-")) result = -result;
return result;
}
// Process a parenthesized expression.
private double evalExp6() throws InterpreterException
{
double result;
if(token.equals("(")) {
getToken();
result = evalExp2();
if(!token.equals(")"))
handleErr(UNBALPARENS);
getToken();
}
else result = atom();
return result;
}
// Get the value of a number or variable.
private double atom() throws InterpreterException
{
double result = 0.0;
switch(tokType) {
case NUMBER:
try {
result = Double.parseDouble(token);
} catch (NumberFormatException exc) {
handleErr(SYNTAX);
}
getToken();
break;
case VARIABLE:
result = findVar(token);
getToken();
break;
default:
handleErr(SYNTAX);
break;
}
return result;
}
// Return the value of a variable.
private double findVar(String vname)
throws InterpreterException
{
if(!Character.isLetter(vname.charAt(0))){
handleErr(SYNTAX);
return 0.0;
}
return vars[Character.toUpperCase(vname.charAt(0))-'A'];
}
// Return a token to the input stream.
private void putBack()
{
if(token == EOP) return;
for(int i=0; i < token.length(); i++) progIdx--;
}
// Handle an error.
private void handleErr(int error)
throws InterpreterException
{
String[] err = {
"Syntax Error",
"Unbalanced Parentheses",
"No Expression Present",
"Division by Zero",
"Equal sign expected",
"Not a variable",
"Label table full",
"Duplicate label",
"Undefined label",
"THEN expected",
"TO expected",
"NEXT without FOR",
"RETURN without GOSUB",
"Closing quotes needed",
"File not found",
"I/O error while loading file",
"I/O error on INPUT statement"
};
throw new InterpreterException(err[error]);
}
// Obtain the next token.
private void getToken() throws InterpreterException
{
char ch;
tokType = NONE;
token = "";
kwToken = UNKNCOM;
// Check for end of program.
if(progIdx == prog.length) {
token = EOP;
return;
}
// Skip over white space.
while(progIdx < prog.length &&
isSpaceOrTab(prog[progIdx])) progIdx++;
// Trailing whitespace ends program.
if(progIdx == prog.length) {
token = EOP;
tokType = DELIMITER;
return;
}
if(prog[progIdx] == '\r') { // handle crlf
progIdx += 2;
kwToken = EOL;
token = "\r\n";
return;
}
// Check for relational operator.
ch = prog[progIdx];
if(ch == '<' || ch == '>') {
if(progIdx+1 == prog.length) handleErr(SYNTAX);
switch(ch) {
case '<':
if(prog[progIdx+1] == '>') {
progIdx += 2;;
token = String.valueOf(NE);
}
else if(prog[progIdx+1] == '=') {
progIdx += 2;
token = String.valueOf(LE);
}
else {
progIdx++;
token = "<";
}
break;
case '>':
if(prog[progIdx+1] == '=') {
progIdx += 2;;
token = String.valueOf(GE);
}
else {
progIdx++;
token = ">";
}
break;
}
tokType = DELIMITER;
return;
}
if(isDelim(prog[progIdx])) {
// Is an operator.
token += prog[progIdx];
progIdx++;
tokType = DELIMITER;
}
else if(Character.isLetter(prog[progIdx])) {
// Is a variable or keyword.
while(!isDelim(prog[progIdx])) {
token += prog[progIdx];
progIdx++;
if(progIdx >= prog.length) break;
}
kwToken = lookUp(token);
if(kwToken==UNKNCOM) tokType = VARIABLE;
else tokType = COMMAND;
}
else if(Character.isDigit(prog[progIdx])) {
// Is a number.
while(!isDelim(prog[progIdx])) {
token += prog[progIdx];
progIdx++;
if(progIdx >= prog.length) break;
}
tokType = NUMBER;
}
else if(prog[progIdx] == '"') {
// Is a quoted string.
progIdx++;
ch = prog[progIdx];
while(ch !='"' && ch != '\r') {
token += ch;
progIdx++;
ch = prog[progIdx];
}
if(ch == '\r') handleErr(MISSINGQUOTE);
progIdx++;
tokType = QUOTEDSTR;
}
else { // unknown character terminates program
token = EOP;
return;
}
}
// Return true if c is a delimiter.
private boolean isDelim(char c)
{
if((" \r,;<>+-/*%^=()".indexOf(c) != -1))
return true;
return false;
}
// Return true if c is a space or a tab.
boolean isSpaceOrTab(char c)
{
if(c == ' ' || c =='\t') return true;
return false;
}
// Return true if c is a relational operator.
boolean isRelop(char c) {
if(relops.indexOf(c) != -1) return true;
return false;
}
/* Look up a token's internal representation in the
token table. */
private int lookUp(String s)
{
int i;
// Convert to lowercase.
s = s.toLowerCase();
// See if token is in table.
for(i=0; i < kwTable.length; i++)
if(kwTable[i].keyword.equals(s))
return kwTable[i].keywordTok;
return UNKNCOM; // unknown keyword
}
}
Small BASIC±í´ïʽ½âÎöÆ÷
Small BASIC½âÊÍÆ÷µÄºËÐÄÊDZí´ïʽ½âÎöÆ÷¡£ÈçǰËùÊö£¬Small BASIC²ÉÓõÚ2Õ½éÉܵĽâÎöÆ÷¡£Ã»ÓÐÔĶÁ¹ýµÚ2ÕµĶÁÕßÇëÏȶÁÍêµÚ2Õ£¬ÒòΪ¸ÃÕÂÌṩÁ˽âÎöÆ÷µÄÏêϸÃèÊö¡£±¾Õ±£ÁôÆä»ù±¾²Ù×÷£¬µ«ÐèÒª½øÒ»²½µÄ¸Ä½ø¡£
¡¡¡¡¶Ô½âÎöÆ÷Ëù×öµÄÐí¶à¸Ä¶¯Ö÷ÒªÊÇΪÁËÄܹ»´¦ÀíSmall BASICÓïÑÔµÄÓï·¨¡£ÀýÈ磬Ëü±ØÐëÄܹ»Ê¶±ðSmall BASICÓïÑԵĹؼü×Ö£¬±ÈÈç²»Äܽ«µÈºÅ(£½)×÷Ϊһ¸öÔËËã·û´¦Àí£¬»¹±ØÐëÄܹ»´¦Àí¹ØÏµÔËËã·û¡£±¾ÕÂÖеĽâÊÍÆ÷³ä·ÖÔöÇ¿ÁËgetToken()µÄ¹¦ÄÜ£¬Ê¹ÆäÄܹ»Âú×ãÀ©Õ¹Ö®ºóµÄ¹¦ÄÜÒªÇó¡£±¾Õ¶ԽâÎöÆ÷µÄÆäËû¸Ä¶¯¶¼ÊdzöÓÚЧÂÊ·½ÃæµÄ¿¼ÂÇ¡£ÀýÈ磬ÔÚµÚ2ÕÂÖн«±í´ïʽµÄÒ»¸öÒýÓô«µÝ¸ø½âÎöÆ÷¡£µ«ÊÇÔÚSmall BASIC½âÎöÆ÷ÖУ¬Ö¸ÏòÔ´³ÌÐòµÄÒýÓñ£´æÔÚÒ»¸öʵÀý±äÁ¿ÖУ¬²¢ÇÒÓɽâÊÍÆ÷ºÍ½âÎöÆ÷¹²Ïí¡£ÕâÑù¿ÉÒÔ±ÜÃâ´«µÝÒýÓÃʱËùÒýÆðµÄ¶îÍ⿪Ïú¡£ÓÉÓÚ½âÊÍÆ÷µÄÖ´ÐÐËÙ¶ÈÂýÊÇÆäÌØÕ÷Ö®Ò»£¬Òò´ËÔÚЧÂÊ·½ÃæµÄÌá¸ß·Ç³£ÖØÒª¡£
¡¡¡¡ÁíÒ»´¦±ä»¯ÊÇÓÉÓÚ²Ù×÷¶ÔÏóµÄ²»Í¬ÒýÆðµÄ¡£ÔÚSmall BASICÖУ¬½âÎöÆ÷´¦ÀíµÄ²»ÔÙÊÇ×Ö·û´®£¬¶øÊÇ×Ö·ûÊý×é¡£ÔÚµÚ2Õ½éÉܵĽâÎöÆ÷ÖУ¬´«µÝµÄÊÇÒ»¸ö°üº¬±í´ïʽµÄ×Ö·û´®¡£ÒýÆðÕâÖֱ仯µÄÔ­ÒòÈÔÈ»ÊÇЧÂÊÎÊÌâ¡£ÖÚËùÖÜÖª£¬³ÌÐòÒ»°ã±£´æÔÚÒ»¸öÆÕͨÎı¾ÎļþÖС£Õâ¸öÎļþÊÇÒ»¶Î×Ö·ûÐòÁУ¬¶ø²»ÊÇÒ»¸ö×Ö·û´®¡£Òò´Ë£¬ÔÚ³ÌÐòÖ´ÐÐ֮ǰ£¬µ±½âÊÍÆ÷ÔØÈëÔ´³ÌÐòʱ£¬Ëü½«´ÓÎļþÖжÁÈëÒ»¸ö×Ö·ûÊý×é¡£¾¡¹ÜÕâ¸ö×Ö·ûÊý×é¿ÉÒÔת»»ÎªÒ»¸ö×Ö·û´®£¬µ«ÊÇÕâÖÖת»»»á´øÀ´²»±ØÒªµÄЧÂÊËðʧ¡£
¡¡¡¡ÓÉÓÚSmall BASIC±í´ïʽ½âÎöÆ÷ʹÓõļ¼ÊõÓëµÚ2ÕÂÖнéÉܵÄÍêÈ«Ïàͬ£¬Òò´ËÀí½âËüµÄ²Ù×÷²»»áºÜÄÑ£¬ËùÒÔ±¾Õ²»´òËãÏêϸ½âÊÍËüµÄ´úÂ롣Ȼ¶ø£¬ÔÚ½²½âÊÍÆ÷֮ǰ£¬»¹±ØÐë¸ø³ö¼¸µã×ۺϵÄ˵Ã÷¡£ÏÂÃæÊ×ÏȽâÊÍSmall BASICÖбí´ïʽµÄ׼ȷº¬Òå¡£
¡¡¡¡3.4.1 Small BASICµÄ±í´ïʽ
¡¡¡¡ÔÚ±¾Õ½éÉܵÄSmall BASIC½âÊÍÆ÷ÖУ¬±í´ïʽÓÉÏÂÁÐÔªËØ×é³É£º
¡¡¡¡¡ñ ÕûÊý
¡¡¡¡¡ñ ÔËËã·û+ ¨C / * ^ = () < > >= <= <>
¡¡¡¡¡ñ ±äÁ¿
¡¡¡¡ÔÚSmall BASICÖУ¬¡°^¡±±íʾÇóÃÝÔËËã¡£¡°£½¡±¿ÉÓÃ×÷¸³ÖµÔËËã·ûºÍµÈºÅ£¬È»¶øÏà¶ÔÓÚBASIC±í´ïʽ¶øÑÔ£¬ËüÖ»ÄÜÓÃÓÚ¹ØÏµ±í´ïʽ¡£(ÔÚ±ê×¼BASICÓïÑÔÖУ¬¸³ÖµÊÇÒ»ÌõÓï¾ä¶ø²»ÊÇÒ»Ïî²Ù×÷)¡£¡°<>¡±´ú±í²»µÈºÅ¡£ÕâÐ©ÔªËØ¿ÉÒÔ¸ù¾Ý´úÊýѧµÄ¹æÔò×éºÏ³É±í´ïʽ¡£ÕâÀïÊǼ¸¸ö±í´ïʽµÄÀý×Ó£º
¡¡¡¡7 ¨C 8
¡¡¡¡(100 ¨C 5) * 14/6
¡¡¡¡a + b ¨C c
¡¡¡¡10 ^ 5
¡¡¡¡A < B
¡¡¡¡ÕâЩÔËËã·ûµÄÓÅÏȼ¶¹ØÏµÈç±í3-1Ëùʾ¡£
¡¡¡¡3-1 ÔËËã·ûµÄÓÅÏȼ¶
¡¡¡¡×î¸ßÓÅÏȼ¶×îµÍÓÅÏȼ¶

¡¡ÓÅÏȼ¶ÏàͬµÄÔËËã·û´Ó×óÏòÓÒ½øÐÐÔËËã¡£
¡¡¡¡Small BASIC×öÁËÈçϵļÙÉ裺
¡¡¡¡¡ñ ËùÓеıäÁ¿¶¼ÒÔµ¥¸ö×ÖĸÃüÃû£¬Ò²¾ÍÊÇ˵ֻÓдÓAµ½ZµÄ26¸ö×Öĸ¿ÉÓÃ×÷±äÁ¿Ãû¡£
¡¡¡¡¡ñ ±äÁ¿Ãû²»Çø·Ö´óСд¡£¼´¡°a¡±Óë¡°A¡±ÊÇͬһ±äÁ¿¡£
¡¡¡¡¡ñ ËùÓеÄÊý×Ö¶¼ÊÇdoubleÀàÐÍ.
¡¡¡¡¡ñ ¾¡¹ÜÔÚÏòÆÁÄ»Êä³öÏûÏ¢µÄʱºò¿ÉÄÜ»áÒýÓÃһЩ×Ö·û´®³£Á¿£¬µ«ÊDz»Ö§³Ö×Ö·û´®±äÁ¿¡£
¡¡¡¡ÕâЩ¼ÙÉè±»Ó¦Óõ½½âÎöÆ÷µÄʵÏÖ¹ý³ÌÖС£
¡¡¡¡3.4.2 Small BASICµÄ±êʶ·û
¡¡¡¡Small BASIC½âÎöÆ÷µÄºËÐÄÊÇgetToken()·½·¨¡£ÕâÀïµÄgetToken()·½·¨ÊǵÚ2ÕÂÖÐËù½éÉܵÄgetToken()·½·¨µÄÔöÇ¿°æ±¾¡£ÆäÖÐÐÂÔöµÄ¹¦ÄÜʹ½âÎöÆ÷²»½öÄܹ»Ê¶±ðÊýÖµ±í´ïʽ£¬»¹Äܹ»Ê¶±ðSmall BASICÖеĹؼü×ÖºÍ×Ö·û´®µÈÆäËûÓïÑÔÔªËØ¡£
¡¡¡¡ÔÚSmall BASICÖУ¬Ã¿¸ö¹Ø¼ü×Ö¶¼ÓÐÁ½ÖÖÐÎʽ£ºÍⲿ¸ñʽºÍÄÚ²¿¸ñʽ¡£Íⲿ¸ñʽÊdzÌÐòÔ±ÓÃÓÚ±àд³ÌÐòµÄÎı¾ÐÎʽ¡£ÀýÈç¡°PRINT¡±¾ÍÊÇPRINTÕâ¸ö¹Ø¼ü×ÖµÄÍⲿ¸ñʽ¡£¾¡¹Ü¿ÉÒÔÒÔÍⲿ×Ö·û´®µÄÐÎʽÔÚ½âÊÍÆ÷Öбíʾ±êʶ·û£¬µ«ÊÇͨ³£Ã»ÈË»áÕâô×ö£¬ÒòΪËüµÄЧÂÊʵÔÚÌ«µÍ¡£ÓëÖ®Ïà·´£¬Small BASIC¶Ô±êʶ·ûµÄÄÚ²¿¸ñʽ½øÐвÙ×÷¡£ÄÚ²¿¸ñʽÊÇÒ»ÖÖ¼òµ¥µÄÕûÊýÖµ£¬ÀýÈ磬ÕûÊý1´ú±íPRINTÃüÁÕûÊý2´ú±íINPUTÃüÁî¡£ÄÚ²¿±íʾ·¨µÄÓÅÊÆÔÚÓÚ£ºÓÉÕûÊý±àдµÄ´úÂë±ÈʹÓÃ×Ö·û´®±àдµÄ´úÂëÖ´ÐÐËÙ¶È¿ìºÜ¶à¡£Êµ¼ÊÉÏ£¬getToken()µÄ¹¤×÷¾ÍÊǽ«±êʶ·û´ÓÍⲿ¸ñʽת»»µ½ÏàÓ¦µÄÄÚ²¿¸ñʽ¡£
ÏÂÃæÊÇSmall BASIC½âÊÍÆ÷µÄgetToken()·½·¨¡£ËüµÄÖ´Ðйᴩ½âÊÍÆ÷Ö´ÐеÄÕû¸ö¹ý³Ì£¬Ã¿´Î´¦ÀíÒ»¸ö×Ö·û¡£
// Obtain the next token.
private void getToken() throws InterpreterException
{
char ch;
tokType = NONE;
token = "";
kwToken = UNKNCOM;
// Check for end of program.
if(progIdx == prog.length) {
token = EOP;
return;
}
// Skip over white space.
while(progIdx < prog.length &&
isSpaceOrTab(prog[progIdx])) progIdx++;
// Trailing whitespace ends program.
if(progIdx == prog.length) {
token = EOP;
tokType = DELIMITER;
return;
}
if(prog[progIdx] == '\r') { // handle crlf
progIdx += 2;
kwToken = EOL;
token = "\r\n";
return;
}
// Check for relational operator.
ch = prog[progIdx];
if(ch == '<' || ch == '>') {
if(progIdx+1 == prog.length) handleErr(SYNTAX);
switch(ch) {
case '<':
if(prog[progIdx+1] == '>') {
progIdx += 2;;
token = String.valueOf(NE);
}
else if(prog[progIdx+1] == '=') {
progIdx += 2;
token = String.valueOf(LE);
}
else {
progIdx++;
token = "<";
}
break;
case '>':
if(prog[progIdx+1] == '=') {
progIdx += 2;;
token = String.valueOf(GE);
}
else {
progIdx++;
token = ">";
}
break;
}
tokType = DELIMITER;
return;
}
½âÊÍÆ÷
SBasicµÄ½âÊÍÆ÷²¿·ÖÊÇʵ¼ÊÖ´ÐгÌÐòµÄ´úÂë¡£Ò»°ã¶øÑÔ£¬½âÊÍÖ´ÐÐÒ»¸öSmall BASIC³ÌÐòµÄ¹¤×÷Ï൱ÈÝÒ×£¬ÒòΪÿ¸öÓï¾ä(¸³ÖµÓï¾ä³ýÍâ)¶¼»áÒÔÒ»¸ö¹Ø¼ü×Ö¿ªÍ·¡£Òò´Ë£¬½âÊÍÆ÷µÄ¹¤×÷¾ÍÊÇ´ÓÿÐгÌÐò´úÂëµÄ¿ªÍ·»ñµÃ¹Ø¼ü×Ö£¬È»ºóÖ´Ðйؼü×ÖËùÖ¸¶¨µÄ²Ù×÷¡£½âÊÍÆ÷²»¶ÏÖØ¸´Õâ¸ö¹ý³Ì£¬Ö±µ½½âÊÍÍêÕû¸ö³ÌÐò¡£ÔÚ±¾½ÚÊ£ÏÂµÄÆª·ùÖУ¬½«Ïêϸ·ÖÎö½âÊÍÆ÷µÄÿ¸ö×é³É²¿·Ö¡£
¡¡¡¡3.5.1 InterpreterExceptionÀà
¡¡¡¡½âÊÍÆ÷´úÂëÎļþÊ×Ïȶ¨ÒåÁËInterpreterExceptionÀà¡£µ±½âÊ͹ý³Ì·¢Éú´íÎóʱ¾Í»áÅ׳ö¸ÃÀàÐ͵ÄÒì³£¡£Ê¹ÓÃSBasicµÄ´úÂë±ØÐë´¦ÀíÕâ¸öÒì³£¡£Óï·¨´íÎó¡¢I/O´íÎóºÍÊýÖµ±í´ïʽÖеĴíÎó¶¼ÄÜÒýÆð¸ÃÒì³£¡£
¡¡¡¡3.5.2 SBasic¹¹Ô캯Êý
¡¡¡¡ÏÂÃæÁгöSBasicµÄ¹¹Ô캯Êý£º
¡¡¡¡// Constructor for SBasic.
¡¡¡¡public SBasic(String progName)
¡¡¡¡ throws InterpreterException {
¡¡¡¡ char tempbuf[] = new char[PROG_SIZE];
¡¡¡¡ int size;
¡¡¡¡ // Load the program to execute.
¡¡¡¡ size = loadProgram(tempbuf, progName);
¡¡¡¡ if(size != -1) {
¡¡¡¡ // Create a properly sized array to hold the program.
¡¡¡¡ prog = new char[size];
¡¡¡¡ // Copy the program into program array.
¡¡¡¡ System.arraycopy(tempbuf, 0, prog, 0, size);
¡¡¡¡ }
¡¡¡¡}
¡¡¡¡SBasicµÄ¹¹Ô캯Êý½ÓÊÜÒ»¸öÎļþÃû×÷Ϊ²ÎÊý£¬Ö¸¶¨ÐèÒª½âÊ͵ÄSmall BASIC³ÌÐòÔ´Îļþ¡£È»ºó´´½¨Ò»¸öÁÙʱ»º³åÇø£¬ÒÔ±£´æ¶ÁÈëµÄÔ´Îļþ¡£Õâ¸ö»º³åÇøµÄ´óСÓÉPROG_SIZEÖ¸¶¨£¬Õâ¸öÖµÒѾ­±»Ç¿ÖÆÉèÖÃΪ10,000¡£ÕâÒ²ÊÇÒ»¸öSBasicËùÄܽâÊ͵ijÌÐòµÄ×î´ó³¤¶È¡£ÔÚ±ØÒªµÄʱºò£¬¿ÉÒÔ·½±ãµØ¸Ä±äÕâ¸öÊýÖµ¡£
¡¡¡¡½ÓÏÂÀ´£¬¹¹Ô캯Êýµ÷ÓÃloadProgram()·½·¨£¬¸Ã·½·¨¶ÁÈëÔ´³ÌÐò²¢·µ»ØÆä×Ö·û¸öÊý£¬Èç¹û¶Áȡʧ°ÜÔò·µ»Ø¨C1¡£È»ºó¹¹Ô캯Êý´´½¨Ò»¸ö³¤¶ÈÓë¸Ã³ÌÐò³¤¶ÈÏàͬµÄÊý×飬²¢½«ËüµÄÒ»¸öÒýÓø³¸ø±äÁ¿prog¡£×îºóÕû¸ö³ÌÐò±»¸´ÖƵ½Õâ¸öеĶÓÁС£Òò´Ë£¬progÖ¸ÏòµÄÊý×éµÄ³¤¶ÈÓëÔ´³ÌÐòµÄ³¤¶ÈÊÇÍêÈ«ÏàͬµÄ¡£
¡¡¡¡loadProgram()·½·¨µÄ´úÂëÈçÏ£º
¡¡¡¡// Load a program.
¡¡¡¡private int loadProgram(char[] p, String fname)
¡¡¡¡ throws InterpreterException
¡¡¡¡{
¡¡¡¡ int size = 0;
¡¡¡¡ try {
¡¡¡¡ FileReader fr = new FileReader(fname);
¡¡¡¡ BufferedReader br = new BufferedReader(fr);
¡¡¡¡ size = br.read(p, 0, PROG_SIZE);
¡¡¡¡ fr.close();
¡¡¡¡ } catch(FileNotFoundException exc) {
¡¡¡¡ handleErr(FILENOTFOUND);
¡¡¡¡ } catch(IOException exc) {
¡¡¡¡ handleErr(FILEIOERROR);
¡¡¡¡ }
¡¡¡¡ // If file ends with an EOF mark, back up.
¡¡¡¡ if(p[size-1] == (char) 26) size--;
¡¡¡¡ return size; // return size of program
¡¡¡¡}
¡¡¡¡Õâ¸ö·½·¨µÄ´ó²¿·Ö´úÂë¶¼¼òµ¥Ò×¶®£¬µ«ÇëÌØ±ð×¢ÒâÕ⼸ÐУº
¡¡¡¡// If file ends with an EOF mark, back up.
¡¡¡¡if(p[size-1] == (char) 26) size--;
¡¡¡¡ÕýÈç×¢ÊÍÖÐ˵Ã÷µÄÄÇÑù£¬ÕâÐдúÂ붪ÆúÁË´ú±íÎļþ½áÊøµÄEOF±êÖ¾¡£ÖÚËùÖÜÖª£¬ÓÐЩÎı¾±à¼­Æ÷ÔÚÎļþ½áβ¸½¼ÓÒ»¸öÎļþ½áÊø±ê¼Ç(ͨ³£ÊÇֵΪ26µÄÒ»¸öASCIIÂë)£¬È»¶øÓÐЩ±à¼­Æ÷²»¸½¼ÓÈκαê¼Ç¡£loadProgram()µÄ×ö·¨ÊÇ£ºÅжÏÎļþÊÇ·ñÓнáÊø±êÖ¾£¬Èç¹ûÓоͽ«Ëüɾ³ý£¬ÕâÑùÄÜͬʱ´¦ÀíÁ½ÖÖÇé¿ö¡£
3.5.3 ¹Ø¼ü×Ö
¡¡¡¡Small BASIC½âÊÍÆ÷Ö»ÄܽâÊÍBASICÓïÑÔµÄÒ»¸ö×Ó¼¯£¬°üÀ¨ÒÔϹؼü×Ö£º
 
ÔÚSBasicÖУ¬ÕâЩ¹Ø¼ü×ÖºÍÐнáÊø·ûEOLµÄÄÚ²¿±íʾ·Ö±ðÒÔfinalÀàÐͽøÐÐÉùÃ÷£¬ÈçÏÂËùʾ£º
¡¡¡¡// Internal representation of the Small BASIC keywords.
¡¡¡¡final int UNKNCOM = 0;
¡¡¡¡final int PRINT = 1;
¡¡¡¡final int INPUT = 2;
¡¡¡¡final int IF = 3;
¡¡¡¡final int THEN = 4;
¡¡¡¡final int FOR = 5;
¡¡¡¡final int NEXT = 6;
¡¡¡¡final int TO = 7;
¡¡¡¡final int GOTO = 8;
¡¡¡¡final int GOSUB = 9;
¡¡¡¡final int RETURN = 10;
¡¡¡¡final int END = 11;
¡¡¡¡final int EOL = 12;
¡¡¡¡×¢ÒâUNKNCOMÕâ¸ö±äÁ¿¡£lookUp()·½·¨Ê¹ÓÃÕâ¸öÖµÀ´±íʾδ֪µÄ¹Ø¼ü×Ö¡£
¡¡¡¡ÎªÁ˱ãÓÚ½«¹Ø¼ü×Ö´ÓÍⲿ±íʾת»»ÎªÏàÓ¦µÄÄÚ²¿±íʾ£¬ËùÓеÄÍⲿ±íʾºÍÄÚ²¿±íʾ¶¼±£´æÔÚÒ»¸öÃûΪkwTableµÄ±íÖС£Õâ¸ö±íÓÉKeyword¶ÔÏóËù×é³É¡£KeywordÀàºÍkwTableµÄ¶¨ÒåÈçÏÂËùʾ£º
¡¡¡¡// This class links keywords with their keyword tokens.
¡¡¡¡class Keyword {
¡¡¡¡ String keyword; // string form
¡¡¡¡ int keywordTok; // internal representation
¡¡¡¡ Keyword(String str, int t) {
¡¡¡¡ keyword = str;
¡¡¡¡ keywordTok = t;
¡¡¡¡ }
¡¡¡¡}
¡¡¡¡/* Table of keywords with their internal representation.
¡¡¡¡ All keywords must be entered lowercase. */
¡¡¡¡Keyword kwTable[] = {
¡¡¡¡ new Keyword("print", PRINT), // in this table.
¡¡¡¡ new Keyword("input", INPUT),
¡¡¡¡ new Keyword("if", IF),
¡¡¡¡ new Keyword("then", THEN),
¡¡¡¡ new Keyword("goto", GOTO),
¡¡¡¡ new Keyword("for", FOR),
¡¡¡¡ new Keyword("next", NEXT),
¡¡¡¡ new Keyword("to", TO),
¡¡¡¡ new Keyword("gosub", GOSUB),
¡¡¡¡ new Keyword("return", RETURN),
¡¡¡¡ new Keyword("end", END)
¡¡¡¡};
¡¡¡¡lookup()·½·¨¾ÍÊÇʹÓÃkwTable±í£¬½«¹Ø¼ü×Ö±êʶ·ûת»»ÎªÏàÓ¦µÄÄÚ²¿±íʾ¡£Èç¹ûkwTable±íÖÐûÓÐÆ¥Åä±êʶ·û£¬lookup()½«·µ»ØUNKNCOM¡£lookup()·½·¨µÄ´úÂëÈçÏ£º
¡¡¡¡/* Look up a token's internal representation in the
¡¡¡¡ token table. */
¡¡¡¡private int lookUp(String s)
¡¡¡¡{
¡¡¡¡ int i;
¡¡¡¡ // Convert to lowercase.
¡¡¡¡ s = s.toLowerCase();
¡¡¡¡ // See if token is in table.
¡¡¡¡ for(i=0; i < kwTable.length; i++)
¡¡¡¡ if(kwTable.keyword.equals(s))
¡¡¡¡ return kwTable.keywordTok;
¡¡¡¡ return UNKNCOM; // unknown keyword
¡¡¡¡}
¡¡¡¡3.5.4 run()·½·¨
¡¡¡¡SBasic¶ÔÏó´´½¨Ö®ºó£¬½âÎöÆ÷µ÷ÓÃrun()·½·¨Ö´ÐÐËüÏÈǰ¶ÁÈëµÄ³ÌÐò¡£run()µÄ´úÂëÈçÏÂËùʾ£º
¡¡¡¡// Execute the program.
¡¡¡¡public void run() throws InterpreterException {
¡¡¡¡ // Initialize for new program run.
¡¡¡¡ vars = new double[26];
¡¡¡¡ fStack = new Stack();
¡¡¡¡ labelTable = new TreeMap();
¡¡¡¡ gStack = new Stack();
¡¡¡¡ progIdx = 0;
¡¡¡¡ scanLabels(); // find the labels in the program
¡¡¡¡ sbInterp(); // execute
¡¡¡¡}
¡¡¡¡run()·½·¨Ê×ÏÈ·ÖÅä4¸öÊý¾Ý½á¹¹£ºÒ»¸ö±£´æ±äÁ¿ÖµµÄÊý×飬һ¸ö±£´æFORÑ­»·µÄ¶ÑÕ»£¬Ò»¸ö±£´æ±êÇ©µÄÊ÷ͼ(TreeMap)ºÍÒ»¸ö±£´æGOSUB×Óº¯ÊýµÄ¶ÑÕ»¡£½ÓÏÂÀ´progIdx±äÁ¿±»ÖÃΪ0£¬Ëü±£´æ×ųÌÐòµ±Ç°±»½âÊ͵ÄλÖá£Ã¿´Îµ÷ÓÃrun()·½·¨Ê±£¬ÕâЩÓò¶¼»á±»ÖØÐÂÉèÖã¬ÕâÑù½âÊÍÆ÷¾ÍÄܹ»Öظ´½âÊÍÖ´ÐÐÏàͬµÄ³ÌÐò¡£
¡¡¡¡È»ºóµ÷ÓõÄÊÇscanLabels()·½·¨£¬ËüɨÃèÕû¸ö³ÌÐò£¬ÕÒµ½ËùÓеıêÇ©¡£Ã¿ÕÒµ½Ò»¸ö±êÇ©£¬½âÊÍÆ÷¶¼°ÑÕâ¸ö±êÇ©Á¬Í¬ËüµÄλÖÃÒ»Æð±£´æµ½labelTableͼÖС£ÕâЩ²Ù×÷¿ÉÒÔÔÚ³ÌÐòÖ´ÐÐ֮ǰ¼Ó¿ì³ÌÐòµÄÖ´ÐÐËÙ¶È¡£
¡¡¡¡×îºó£¬½âÎöÆ÷µ÷ÓÃsbInterp()·½·¨¿ªÊ¼³ÌÐòµÄÖ´Ðйý³Ì
3.5.5 sbInterp()·½·¨
¡¡¡¡½âÊÍÆ÷ͨ¹ýsbInterp()¿ªÊ¼²¢¿ØÖÆÒ»¸öSmall BASIC³ÌÐòµÄ½âÊÍÖ´Ðйý³Ì¡£
¡¡¡¡ÏÂÃæÊÇÕâ¸ö·½·¨µÄ´úÂ룺
¡¡¡¡// Entry point for the Small BASIC interpreter.
¡¡¡¡private void sbInterp() throws InterpreterException
¡¡¡¡{
¡¡¡¡ // This is the interpreter's main loop.
¡¡¡¡ do {
¡¡¡¡ getToken();
¡¡¡¡ // Check for assignment statement.
¡¡¡¡ if(tokType==VARIABLE) {
¡¡¡¡ putBack(); // return the var to the input stream
¡¡¡¡ assignment(); // handle assignment statement
¡¡¡¡ }
¡¡¡¡ else // is keyword
¡¡¡¡ switch(kwToken) {
¡¡¡¡ case PRINT:
¡¡¡¡ print();
¡¡¡¡ break;
¡¡¡¡ case GOT
¡¡¡¡ execGoto();
¡¡¡¡ break;
¡¡¡¡ case IF:
¡¡¡¡ execIf();
¡¡¡¡ break;
¡¡¡¡ case FOR:
¡¡¡¡ execFor();
¡¡¡¡ break;
¡¡¡¡ case NEXT:
¡¡¡¡ next();
¡¡¡¡ break;
¡¡¡¡ case INPUT:
¡¡¡¡ input();
¡¡¡¡ break;
¡¡¡¡ case GOSUB:
¡¡¡¡ gosub();
¡¡¡¡ break;
¡¡¡¡ case RETURN:
¡¡¡¡ greturn();
¡¡¡¡ break;
¡¡¡¡ case END:
¡¡¡¡ return;
¡¡¡¡ }
¡¡¡¡ } while (!token.equals(EOP));
¡¡¡¡}
¡¡¡¡ËùÓеĽâÊÍÆ÷¶¼ÓÉÒ»¸ö¶¥²ãÑ­»·½á¹¹Ëù¿ØÖÆ£¬¸ÃÑ­»·´ÓÔ´³ÌÐòÖжÁÈëÏÂÒ»¸ö±êʶ·û£¬È»ºóÑ¡ÔñÊʵ±µÄ¶¯×÷½øÐд¦Àí¡£Small BASIC½âÊÍÆ÷Ò²²»ÀýÍ⣬Õâ¸öÖ÷Ñ­»·°üº¬ÔÚsbInterp()·½·¨ÖС£ËüµÄ¹¤×÷¹ý³ÌÊÇÕâÑùµÄ£ºÊ×ÏÈ£¬´Ó³ÌÐòÖжÁÈëÒ»¸ö±êʶ·û¡£¼ÙÉè³ÌÐòÖÐûÓÐÓï·¨´íÎó£¬Èç¹û¶ÁÈëµÄ±êʶ·ûÊÇÒ»¸ö±äÁ¿£¬ÄÇô½«½øÐÐÒ»´Î¸³Öµ²Ù×÷¡£Èç¹û²»ÊDZäÁ¿£¬ÄÇôÕâ¸ö±êʶ·û²»ÊÇÒ»¸öÐкÅ(½«±»ºöÂÔ)£¬¾ÍÊÇÒ»¸ö¹Ø¼ü×Ö¡£Èç¹ûÊǹؼü×Ö£¬Ôò½âÊÍÆ÷½«¸ù¾ÝkwTokenµÄֵѡÔñÒ»ÌõºÏÊʵÄcaseÓï¾ä£¬kwTokenÖмǼ×ÅËùÓйؼü×ÖµÄÄÚ²¿±íʾ¡£Ã¿¸ö¹Ø¼ü×Ö¶¼ÓÉËü×Ô¼ºµÄ·½·¨´¦Àí£¬½ÓÏÂÀ´½«ÒÀ´Î½éÉÜÕâЩ·½·¨¡£
¡¡¡¡3.5.6 ¸³Öµ
¡¡¡¡ÔÚ´«Í³µÄBASICÓïÑÔÖУ¬¸³ÖµÊÇÒ»ÌõÓï¾ä¶ø²»ÊÇÒ»¸ö²Ù×÷¡£ÔÚSmall BASICµ±ÖÐҲͬÑùÓÃÕâÑùµÄ·½·¨´¦Àí¸³Öµ¡£BASIC¸³ÖµÓï¾äµÄÒ»°ãÐÎʽÈçÏ£º
¡¡¡¡±äÁ¿Ãû£½±í´ïʽ
¡¡¡¡½âÊÍÆ÷µ÷ÓÃassignment()·½·¨´¦Àí¸³ÖµÓï¾ä£¬ÕâÀï¸ø³ö¸Ã·½·¨µÄʵÏÖ´úÂ룺
¡¡¡¡// Assign a variable a value.
¡¡¡¡private void assignment() throws InterpreterException
¡¡¡¡{
¡¡¡¡ int var;
¡¡¡¡ double value;
¡¡¡¡ char vname;
¡¡¡¡ // Get the variable name.
¡¡¡¡ getToken();
¡¡¡¡ vname = token.charAt(0);
¡¡¡¡ if(!Character.isLetter(vname)) {
¡¡¡¡ handleErr(NOTVAR);
¡¡¡¡ return;
¡¡¡¡ }
¡¡¡¡ // Convert to index into variable table.
¡¡¡¡ var = (int) Character.toUpperCase(vname) - 'A';
¡¡¡¡ // Get the equal sign.
¡¡¡¡ getToken();
¡¡¡¡ if(!token.equals("=")) {
¡¡¡¡ handleErr(EQUALEXPECTED);
¡¡¡¡ return;
¡¡¡¡ }
¡¡¡¡ // Get the value to assign.
¡¡¡¡ value = evaluate();
¡¡¡¡ // Assign the value.
¡¡¡¡ vars[var] = value;
¡¡¡¡}
¡¡¡¡assignment()Ê×ÏÈ´Ó³ÌÐòÖжÁÈëÒ»¸öÐèÒª¸³ÖµµÄ±êʶ·û¡£Èç¹û¸Ã±êʶ·û²»ÊÇÒ»¸öÓÐЧµÄ±äÁ¿£¬ÄÇô½âÊÍÆ÷½«±¨¸æNOTVAR´íÎó¡£½ÓÏÂÀ´½«¶ÁÈëÒ»¸öµÈºÅ¡£È»ºóµ÷ÓÃevaluate()·½·¨»ñµÃ½«¸³¸ø±äÁ¿µÄÖµ¡£×îºóÔÙ°ÑÕâ¸öÖµ¸³¸ø±äÁ¿¡£Õâ¸ö·½·¨Òª±ÈÏëÏñÖеĸüΪ¼òµ¥ÇåÎú£¬ÒòΪ±í´ïʽ½âÎöÆ÷ºÍgetToken()·½·¨ÒѾ­½â¾öÁ˴󲿷ֱȽÏÂé·³µÄ¹¤×÷¡£
¡¡3.5.9 GOTOÓï¾ä
¡¡¡¡ÔÚ´«Í³µÄBASICÓïÑÔÖУ¬×îÖØÒªµÄ³ÌÐò¿ØÖÆÐÎʽÊÇGOTOÓï¾ä¡£GOTOÓï¾äµÄÄ¿±ê±ØÐëÊÇÒ»¸öÐкš£ÔÚSmall BASICÓïÑÔÖÐÒ²±£ÁôÁËÕâÒ»´«Í³´¦Àí·½·¨¡£ÓÐЩÈË¿ÉÄÜÖªµÀ£¬ÔçÆÚµÄBASIC°æ±¾ÒªÇó³ÌÐòÖеÄÿÐдúÂë¶¼±ØÐëÒÔÒ»¸öÐкſªÊ¼¡£µ«ÊÇSmall BASIC²»ÔÙÒªÇóÿÐж¼ÓÐÐкţ»Ö»Óе±Ä³Ò»ÐÐÊÇGOTOÓï¾äµÄÄ¿±êÓï¾äʱ£¬Ëü²ÅÐèÒªÒ»¸öÐкš£Òò´Ë£¬ÔÚSmall BASICÖУ¬ÐкŽö½öÖ»ÊÇÒ»¸ö±êÇ©¡£GOTOÓï¾äµÄÒ»°ãÐÎʽÈçÏ£º
¡¡¡¡GOTO ÐкÅ
¡¡¡¡µ±½âÊÍÆ÷Óöµ½Ò»¸öGOTOÓï¾äʱ£¬Ö´Ðйý³Ì±ØÐëÌø×ªµ½ÓëÐкÅÏà¶ÔÓ¦µÄ´úÂëÐС£´¦ÀíGOTOÓï¾äµÄÖ÷ÒªÎÊÌâÔÚÓÚ£º±ØÐëͬʱÌṩÏòÇ°Ìø×ªºÍÏòºóÌø×ª¡£ÎªÁËÓÐЧµØ½â¾öÕâ¸öÎÊÌ⣬ҪÇóÔÚÖ´ÐÐ֮ǰ¾Í±ØÐëɨÃèÕû¸ö³ÌÐò£¬²¢½«É¨Ãèµ½µÄÿ¸ö±êÇ©µÄλÖô洢ÔÚÒ»ÕűíÖС£ÄÇô£¬ÒÔºóÿ´ÎÖ´ÐÐGOTOÓï¾äʱ£¬¾Í¿ÉÒÔ´ÓÕâÕűíÖлñµÃÄ¿±ê´úÂëÐеÄλÖ㬲¢½«³ÌÐòÖ´Ðеã×ªÒÆµ½¸ÃλÖá£
¡¡¡¡TreeMap¼¯ºÏÊÇÒ»ÖÖ´æ´¢±êÇ©¼°ÆäλÖõÄÀíÏëµÄÊý¾Ý½á¹¹£¬ÒòΪÿ¸öÊ÷ͼ¶¼ÓÐÒ»¸öÓëÌØ¶¨Öµ¹ØÁªµÄ¼ü¡£ÔÚ½âÊÍÆ÷ÖУ¬¿ÉÒÔ½«±êǩָ¶¨Îª¼ü£¬½«¼üÖµÖ¸¶¨Îª±êÇ©Ë÷Òý¡£Ã¿¸öÊ÷ͼ±£´æÒ»¸ö±êÇ©/Ë÷Òý¶Ô¡£³ÌÐòÉùÃ÷ÁËÒ»¸öÃûΪlabelTableµÄʵÀý±äÁ¿£¬ÓÉËüÍê³É¶ÔÊ÷ͼµÄÒýÓá£labelTableµÄÉùÃ÷ÈçÏ£º
¡¡¡¡// A map for labels.
¡¡¡¡private TreeMap labelTable;
¡¡¡¡scanLabels()·½·¨É¨ÃèÕû¸ö³ÌÐò£¬²¢½«Ã¿¸ö±êÇ©µÄλÖòåÈëTreeMap±íÖС£ÔÚ³ÌÐòÖ´ÐÐ֮ǰ£¬ÓÉrun()·½·¨µ÷ÓÃscanLabels()½øÐÐ×îºóÔ¤´¦Àí¡£¶øfindEOL()·½·¨ÓÃÀ´²éÕÒÒ»ÐгÌÐò´úÂëµÄ½áβ¡£ÏÂÃæÊÇscanLabels()ºÍfindEOL()µÄ´úÂ룺
¡¡¡¡// Find all labels.
¡¡¡¡private void scanLabels() throws InterpreterException
¡¡¡¡{
¡¡¡¡ int i;
¡¡¡¡ Object result;
¡¡¡¡ // See if the first token in the file is a label.
¡¡¡¡ getToken();
¡¡¡¡ if(tokType==NUMBER)
¡¡¡¡ labelTable.put(token, new Integer(progIdx));
¡¡¡¡ findEOL();
¡¡¡¡ do {
¡¡¡¡ getToken();
¡¡¡¡ if(tokType==NUMBER) { // must be a line number
¡¡¡¡ result = labelTable.put(token,
¡¡¡¡ new Integer(progIdx));
¡¡¡¡ if(result != null)
¡¡¡¡ handleErr(DUPLABEL);
¡¡¡¡ }
¡¡¡¡ // If not on a blank line, find next line.
¡¡¡¡ if(kwToken != EOL) findEOL();
¡¡¡¡ } while(!token.equals(EOP));
¡¡¡¡ progIdx = 0; // reset index to start of program
¡¡¡¡}
¡¡¡¡// Find the start of the next line.
¡¡¡¡private void findEOL()
¡¡¡¡{
¡¡¡¡ while(progIdx < prog.length &&
¡¡¡¡ prog[progIdx] != '\n') ++progIdx;
¡¡¡¡ if(progIdx < prog.length) progIdx++;
¡¡¡¡}
¡¡¡¡scanLabels()·½·¨¼ì²éÿÐдúÂëµÄµÚÒ»¸ö±êʶ·û¡£Èç¹û¸Ã±êʶ·ûÊÇÒ»¸öÊý×Ö£¬ÄÇô¾ÍÈÏΪÕâÊÇÒ»¸öÐкÅ(»òÕß˵£¬ÊÇÒ»¸ö±êÇ©)¡£·¢ÏÖ±êÇ©ºó£¬scanLabels()¾Íµ÷ÓÃput()·½·¨½«Æä´æ´¢µ½labelTableÖС£½Ó×ŵ÷ÓÃTreeMapµÄput()·½·¨·µ»ØÒ»¸öÒýÓã¬Ö¸Ïò¸Ã±êÇ©ÒÔǰµÄÓ³Éä¡£Èç¹ûÏÈǰûÓÐÈκÎÓ³É䣬ÄÇô¾Í·µ»Ønull¡£Òò´Ë£¬Èç¹û·µ»ØÖµ²»Îªnull£¬ÄÇô˵Ã÷¸Ã±êÇ©ÒѾ­´æ´¢ÔÚÊ