ºìÁªLinuxÃÅ»§
Linux°ïÖú

ʹÓà Flex ºÍ Bison ¸üºÃµØ½øÐдíÎó´¦Àí

·¢²¼Ê±¼ä:2006-08-27 16:06:33À´Ô´:ºìÁª×÷Õß:download
[code]¡¡¡¡¾¡¹ÜʹÓà Flex ºÍ Bison Éú³É³ÌÐò·Ç³£¼òµ¥£¬µ«ÊÇÒªÈÃÕâЩ³ÌÐò²úÉúÓû§ÓѺõÄÓï·¨ºÍÓïÒå´íÎóÏûϢȴºÜÀ§ÄÑ¡£±¾ÎĽ«½éÉÜ Flex ºÍ Bison µÄ´íÎó´¦ÀíÌØÐÔ£¬²¢Õ¹Ê¾ÈçºÎʹÓÃËüÃÇ£¬È»ºóÏêϸ½éÉÜËüÃǵÄһЩȱÏÝ¡£[/code]¼ò½é
¡¡¡¡ÕýÈç UNIX® ¿ª·¢ÈËÔ±ËùÁ˽âµÄÄÇÑù£¬Flex ºÍ Bison µÄ¹¦Äܷdz£Ç¿´ó£¬·Ç³£ÊʺϿª·¢´Ê·¨ºÍÓï·¨½âÎöÆ÷£¬ÓÈÆäÊÇÓïÑÔ±àÒëÆ÷ºÍ½âÊÍÆ÷¡£Èç¹ûÎÒÃDz»ÊìϤËüÃÇËùʵÏֵŤ¾ß ---- ·Ö±ðÊÇ Lex ºÍ Yacc ---- ¿ÉÒԲο¼Ò»Ï±¾ÎÄ ²Î¿¼×ÊÁÏ Ò»½ÚÖÐÓÐ¹Ø Flex ºÍ Bison ÎĵµµÄÁ´½Ó£¬ÒÔ¼°ÆäËû½éÉÜÕâÁ½¸ö³ÌÐòµÄÎÄÕ¡£
¡¡¡¡±¾ÎĽéÉÜÁ˸ü¸ß¼¶µÄһЩÖ÷Ì⣺ÓÃÀ´ÔÚ±àÒëÆ÷ºÍ½âÊÍÆ÷ÖиüºÃµØʵÏÖ´íÎó´¦ÀíÄÜÁ¦µÄÌØÐԺͼ¼Êõ¡£ÎªÁËչʾÕâЩ¼¼Êõ£¬ÎÒʹÓÃÁËÒ»¸öʾÀý³ÌÐò ccalc£¬Ëü»ùÓÚ Bison ÊÖ²áÖеļÆËã»úʵÏÖÁËÒ»¸öÔöÇ¿µÄ¼ÆËãÆ÷¡£ÎÒÃÇ¿ÉÒÔ´Ó±¾ÎĺóÃæ ÏÂÔØ Ò»½ÚÏÂÔØ ccalc ºÍÏà¹ØÎļþ¡£
¡¡¡¡ÔöÇ¿°üÀ¨Ê¹ÓÃÁ˺ܶà±äÁ¿¡£ÔÚ ccalc ÖУ¬±äÁ¿ÊÇͨ¹ýÔÚ³õʼ»¯ÖÐÊ×´ÎʹÓÃʱ¶¨ÒåµÄ£¬ÀýÈç a = 3¡£Èç¹û±äÁ¿ÊÇÔÚ³õʼ»¯Ö®Ç°Ê¹Óõģ¬ÄǾͻá²úÉúÓïÒå´íÎó£¬Ê¹ÓÃֵΪ 0 À´´´½¨Õâ¸ö±äÁ¿£¬²¢´òÓ¡Ò»ÌõÏûÏ¢¡£
ʾÀýÔ´Îļþ
ʾÀýÔ´´úÂëÖаüÀ¨ 7 ¸öÎļþ£º[code]ccalc.c£ºÖ÷³ÌÐò£¬ÒÔ¼°Ò»Ð©½øÐÐÊäÈë¡¢Êä³öºÍ´íÎó´¦ÀíµÄº¯Êý
ccalc.h£º°üÀ¨Á˶ÔËùÓÐÄ£¿éµÄ¶¨Òå
cmath.c£ºÊýѧº¯Êý
parse.y£ºBison ʹÓõÄÊäÈëÎÄ·¨
lex.l£ºFlex µÄÊäÈë
makefile£º¼òµ¥µÄ makefile
defs.txt£ºÊ¾ÀýÊäÈëÎļþ[/code]Õâ¸ö³ÌÐò½ÓÊÕÁ½¸ö²ÎÊý£º[code]-debug£º²úÉúµ÷ÊÔÊä³ö
filename£ºÊäÈëÎļþÃû£»Ä¬ÈÏֵΪ defs.txt[/code]Bison ʹÓõÄÉèÖÃ
¡¡¡¡ÎªÁË´¦Àí±äÁ¿ÃûºÍʵ¼ÊÖµ£¬Bison µÄÓïÒåÀàÐͱØÐë½øÐÐÔöÇ¿£º
Çåµ¥ 1. ¸üºÃµÄ Bison ÓïÒåÀàÐÍ[code]/* generate include-file with symbols and types */
%defines
/* a more advanced semantic type */
%union {
double value;
char *string;
}[/code]ÓÐЩÎÄ·¨¹æÔò¿ÉÒÔ²úÉúÌض¨µÄÓïÒåÀàÐÍ£¬ÕâÐèÒªÏñÇåµ¥ 2 ÖÐÒ»Ñù¶Ô Bison ½øÐÐÉùÃ÷¡£Òª»ñµÃÒ»¸ö¿ÉÒÆÖ²ÐÔ¸üºÃµÄ Bison ÎÄ·¨°æ±¾£¬ÎÒÃÇÐèÒªÖØж¨Òå +-*/() ·ûºÅ¡£ÏÂÃæÕâ¸öÀý×ÓûÓÐʹÓÃ×óÀ¨ºÅ (£¬¶øÊÇʹÓÃÁ˽áÊø·û·ûºÅ LBRACE£¬ÕâÊÇÓÉ´Ê·¨·ÖÎöÌṩµÄ¡£ÁíÍ⣬²Ù×÷·ûµÄÓÅÏÈ˳ÐòÒ²±ØÐë½øÐÐÉùÃ÷¡£
¡¡¡¡¶ÔÓÚ Flex À´Ëµ£¬ËùÉú³ÉµÄ´úÂëͨ³£¶¼ÒÀÀµÓÚƽ̨ËùʹÓõĴúÂëÒ³£¨codepage£©¡£¾¡¹ÜÎÒÃÇ¿ÉÒÔʹÓÃÆäËû´úÂëÒ³£¬µ«ÊDZØÐëÒª¶ÔÊäÈë½øÐÐת»»¡£Òò´ËÓë Bison ´úÂ벻ͬ£¬Flex ´úÂëÉв»ÄܽøÐÐÒÆÖ²¡£
Çåµ¥ 2. Bison ÉùÃ÷[code]/* terminal symbols */
%token IDENTIFIER
%token VALUE
%type expression
/* operator-precedence
* top-0: -
* 1: * /
* 2: + -
*/
%left ADD SUB
%left MULT DIV
%left NEG
%start program[/code]Õâ¶ÎÎÄ·¨Óë Bison ÊÖ²á·Ç³£ÀàËÆ£¬²»Í¬Ö®´¦ÔÚÓÚËüʹÓÃÁËÃû×Ö×÷ΪÖն˷ûºÅºÍ±êʶ·ûµÄ¼òдÐÎʽ¡£±êʶ·ûÊÇÔÚ¸³ÖµÓï¾äÖнøÐж¨ÒåºÍ³õʼ»¯µÄ£¬²¢ÇÒ¿ÉÒÔÔÚÈκÎÔÊÐíʹÓõĵط½Ê¹Óá£Çåµ¥ 3 ¸ø³öÁËÒ»¸öʾÀýÎÄ·¨£º
Çåµ¥ 3. ʾÀý Bison ÎÄ·¨[code]program
: statement SEMICOLON program
| statement SEMICOLON
| statement error SEMICOLON program
;
statement
: IDENTIFIER ASSIGN expression
| expression
;
expression
: LBRACE expression RBRACE
| SUB expression %prec NEG
| expression ADD expression
| expression SUB expression
| expression MULT expression
| expression DIV expression
| VALUE
| IDENTIFIER
;[/code]program µÄµÚÈý¸öÊä³öÈÃÕâ¸ö·ÖÎö³ÌÐò¿ÉÒÔ»ñµÃ´íÎ󣬴ÓÖÐËÑË÷·ÖºÅ£¬È»ºó¼ÌÐøÖ´ÐУ¨Í¨³£´íÎó¶ÔÓÚ½âÎöÆ÷À´Ëµ¶¼ÊǷdz£ÑÏÖصģ©¡£
¡¡¡¡ÎªÁËÈÃÕâ¸öÀý×Ó¸ü¼ÓÓÐȤ£¬¹æÔòÌåÖеÄÕæÕýÊýѧº¯Êý¶¼ÊÇÒÔµ¥¶Àº¯ÊýµÄÐÎʽʵÏֵġ£ÔÚ½øÐи߼¶ÎÄ·¨·ÖÎöʱ£¬ÎÒÃÇÒª¾¡Á¿±£Ö¤¹æÔò¼ò¶Ì£¬²¢Ê¹Óú¯ÊýÀ´ÊµÏÖһЩ²»»áÖ±½Ó´¦Àí½âÎöµÄ¹ý³Ì£º
Çåµ¥ 4. ʹÓõ¥¶ÀµÄº¯ÊýÀ´ÊµÏÖÊýѧ¹æÔò[code]| expression DIV expression
{
$ = ReduceDiv($1, $3);
}[/code]×îºó£¬º¯Êý yyerror() ±ØÐëÒª½øÐж¨Òå¡£Õâ¸öº¯ÊýÊÇÔÚËùÉú³ÉµÄ½âÎöÆ÷¼ì²âµ½Óï·¨´íÎóʱµ÷Óõģ¬ËüÓÖ»áµ÷ÓÃÒ»¸öСº¯Êý PrintError()£¬ºóÕß»á´òÓ¡ÔöÇ¿µÄ´íÎóÏûÏ¢¡£ÏêϸÄÚÈÝÇë²Î¿´Ô´´úÂë¡£
Flex µÄÉèÖÃ
¡¡¡¡Flex ËùÉú³ÉµÄ´Ê·¨·ÖÎöÆ÷±ØÐëÒª¸ù¾ÝÓïÒåÀàÐÍÌṩÖÕÖ¹·ûºÅ¡£Çåµ¥ 5 ¶¨ÒåÁË¿Õ¸ñ¡¢Êµ¼ÊÖµ¡¢±êʶ·ûºÍ·ûºÅËùʹÓõÄÓï·¨¡£
Çåµ¥ 5. ʾÀý Flex ¹æÔò[code][ \t\r\n]+ {
/* eat up whitespace */
}
{DIGIT}+ {
yylval.value = atof(yytext);
return VALUE;
}
{DIGIT}+"."{DIGIT}* {
yylval.value = atof(yytext);
return VALUE;
}
{DIGIT}+[eE]["+""-"]?{DIGIT}* {
yylval.value = atof(yytext);
return VALUE;
}
{DIGIT}+"."{DIGIT}*[eE]["+""-"]?{DIGIT}* {
yylval.value = atof(yytext);
return VALUE;
}
{ID} {
yylval.string = malloc(strlen(yytext)+1);
strcpy(yylval.string, yytext);
return IDENTIFIER;
}
"+" { return ADD; }
"-" { return SUB; }
"*" { return MULT; }
"/" { return DIV; }
"(" { return LBRACE; }
")" { return RBRACE; }
";" { return SEMICOLON; }
"=" { return ASSIGN; }[/code]ΪÁË°ïÖúµ÷ÊÔ£¬ÎÒÃÇÔÚ³ÌÐòÔËÐеÄĩβ°ÑËùÓÐÒÑÖªµÄ±äÁ¿¼°Æ䵱ǰÄÚÈݶ¼´òÓ¡Á˳öÀ´¡£
ʹÓÃÆÕͨ´íÎóÏûÏ¢µÄÀý×Ó
¡¡¡¡Ê¹ÓÃÏÂÃæµÄÊäÈ루ÆäÖÐÉÔ΢½øÐÐÁËÅŰ棩À´±àÒë²¢ÔËÐÐÕâ¸öʾÀý½âÎöÆ÷³ÌÐò ccalc£º
Çåµ¥ 6. Êýѧ½âÎöÆ÷µÄʾÀýÊäÈë[code]a = 3;
3 aa = a * 4;
b = aa / ( a - 3 );[/code]Êä³ö½á¹ûÈçÏÂËùʾ£º
Çåµ¥ 7. Êýѧ½âÎöÆ÷µÄʾÀýÊä³ö[code]Error 'syntax error'
Error: reference to unknown variable 'aa'
division by zero!
final content of variables
Name------------------ Value----------
'a ' 3
'b ' 3
'aa ' 0[/code]Õâ¸öÊä³ö½á¹û²¢·Ç·Ç³£ÓÐÓã¬ÒòΪËü²¢Ã»ÓÐÏÔʾÎÊÌâµ½µ×ÔÚʲôµØ·½¡£ÕâÔÚÏÂÒ»½ÚÖлá½øÐнéÉÜ¡£
À©Õ¹ Bison ¿ÉÒÔ¸üºÃµØ´¦Àí´íÎóÏûÏ¢
¡¡¡¡Bison µÄ×îÖ÷ÒªµÄÌØÐÔÔÚ Bison ÊÖ²áÖÐÒþ²ØµÄºÜÉ¾ÍÊÇËü¿ÉÒÔͨ¹ýʹÓà YYERROR_VERBOSE ºêÔÚ²úÉúÓï·¨´íÎóµÄÇé¿öÏÂÉú³É¸üÓÐÒâÒåµÄ´íÎóÏûÏ¢¡£
¡¡¡¡ÆÕͨµÄ 'syntax error' ÏûÏ¢ÈçÏ£º
¡¡¡¡Error 'syntax error, unexpected IDENTIFIER, expecting SEMICOLON'
¡¡¡¡ÕâÌõÏûÏ¢¶ÔÓÚµ÷ÊÔ¸üΪºÏÊÊ¡£
¸üºÃµÄÊäÈ뺯Êý
¡¡¡¡Ê¹ÓÃÔ­À´µÄ´íÎóÏûÏ¢£¬ºÜÄÑÅжÏÓïÒåµÄ´íÎó¡£µ±È»£¬Õâ¸öÀý×ӷdz£ÈÝÒ×ÐÞ¸´£¬ÒòΪÎÒÃÇÁ¢¼´¾Í¿ÉÒÔÕÒ³öÓдíÎóµÄÄÇÒ»ÐС£ÔÚ¸ü¼Ó¸´ÔÓµÄÓï·¨ºÍ¶ÔÓ¦ÊäÈëÖУ¬Õâ¿ÉÄܲ¢²»¼òµ¥¡£ÈÃÎÒÃDZàдһ¸öÊäÈ뺯ÊýÀ´´ÓÎļþÖжÁÈ¡ÏàÓ¦µÄÐС£
¡¡¡¡Flex ¾ßÓÐÒ»¸ö·Ç³£ÓÐÓõĺê YY_INPUT£¬Ëü¸ºÔðΪ·ûºÅ½âÊͶÁÈëÊý¾Ý¡£ÎÒÃÇ¿ÉÒÔÔÚ YY_INPUT ºêÖÐÌí¼ÓÒ»¸ö¶Ô GetNextChar() º¯ÊýµÄµ÷Ó㬺óÕß´ÓÎļþÖжÁÈ¡Êý¾Ý£¬²¢±£ÁôÁËÏÂÒ»¸öÒª¶ÁÈ¡µÄ×Ö·ûµÄλÖÃÐÅÏ¢¡£GetNextChar() ʹÓÃÁËÒ»¸ö»º³åÇøÀ´´æ·ÅÒ»ÐÐÊäÈë¡£ÕâÁ½¸ö±äÁ¿±£´æÁ˵±Ç°Ðкź͸ÃÐÐÖÐÏÂÒ»¸ö×Ö·ûµÄλÖãº
Çåµ¥ 8. ¸üºÃµÄ Flex YY_INPUT ºê[code]#define YY_INPUT(buf,result,max_size) {\
result = GetNextChar(buf, max_size); \
if ( result <= 0 ) \
result = YY_NULL; \
}[/code]ʹÓÃÕâ¸öÔöÇ¿µÄ´íÎó´òÓ¡º¯Êý PrintError()£¨ÔÚÇ°ÃæÌÖÂÛ¹ý£¬Ëü¿ÉÒԺܺõØÏÔʾÓÐÎÊÌâµÄÊäÈëÐУ¬ÍêÕûµÄ PrintError() Ô´´úÂëÇë²Î¿´ ʾÀýÔ´´úÂ룩£¬ÎÒÃǾ;ßÓÐÁËÒ»¸öÓû§ÓѺõÄÏûÏ¢£¬ËüÏÔʾÁËÏÂÒ»¸ö×Ö·ûµÄλÖãº
Çåµ¥ 9. ¸üºÃµÄ Flex ´íÎó£º×Ö·ûλÖÃ[code] |....+....:....+....:....+....:....+....:....+....:....+
1 |a = 3;
2 |3 aa = a * 4;
...... !.....^
Error: syntax error, unexpected IDENTIFIER, expecting SEMICOLON
3 |b = aa / ( a - 3 );
...... !.......^
Error: reference to unknown variable 'aa'
...... !.................^
Error: division by zero![/code]Õâ¸öʾÀýº¯Êý¿ÉÒÔ´ÓÆäËûº¯Êý£¨ÀýÈç ReduceDiv()£©ÖнøÐе÷Ó㬴Ӷø´òÓ¡ÓïÒå´íÎó£¬ÀýÈç division by zero »ò unknown identifiers¡£
¡¡¡¡Èç¹ûÎÒÃÇÏ£Íû±ê¼ÇÒ»ÏÂ×îºóʹÓõķûºÅ£¬¾Í¿ÉÒÔ¶Ô Flex ¹æÔò½øÐÐÀ©Õ¹£¬²¢Ð޸ĴíÎóµÄ´òÓ¡¡£º¯Êý BeginToken() ºÍ PrintError()£¨¶þÕ߶¼¿ÉÒÔÔÚʾÀýÔ´´úÂëÖÐÕÒµ½£©Êǹؼü£ºBeginToken() ÊÇÓÉÿÌõ¹æÔò½øÐе÷Óõģ¬ÕâÑùËü¾Í¿ÉÒÔ¼Çסÿ¸ö·ûºÅµÄ¿ªÊ¼ºÍ½áÊø£¬Ã¿´Î´òÓ¡´íÎóʱ¶¼»áµ÷Óà PrintError()¡£ÕâÑù£¬ÎÒÃǾͿÉÒÔÉú³ÉÒ»ÌõÓÐÓõÄÏûÏ¢ÁË£¬ÀýÈ磺
Çåµ¥ 10. ¸üºÃµÄ Flex ´íÎ󣺱íʾȷÇеķûºÅλÖÃ[code] 2 |3 aa = a * 4;
...... !..^^............
Error: syntax error, unexpected IDENTIFIER, expecting SEMICOLON[/code]ȱµã
¡¡¡¡ËùÉú³ÉµÄ´Ê·¨½âÎöÆ÷¿ÉÄÜ»áÔÚ¼ì²âµ½Ä³¸ö·ûºÅ֮ǰ¶ÁÈë¶à¸ö×Ö·û¡£Òò´Ë£¬Õâ¸ö¹ý³Ì²»¿ÉÄܾ«È·µØÏÔʾȷÇеÄλÖá£Ëü×îÖÕÈ¡¾öÓÚΪ Flex ËùÌṩµÄ¹æÔò¡£¹æÔòÔ½¸´ÔÓ£¬Î»Öõľ«È·³Ì¶È¾ÍÔ½µÍ¡£Õâ¸öÀý×ÓÖеĹæÔò¿ÉÒÔÓÉ Flex ͨ¹ýÌáÇ°²éÕÒÒ»¸ö×Ö·ûÀ´½øÐд¦Àí£¬Õâ»áÈÃλÖõÄÔ¤²â¸ü¼Ó¾«È·¡£
Bison µÄ¶¨Î»»úÖÆ
¡¡¡¡ÏÂÃæÈÃÎÒÃÇÀ´¿´Ò»Ï division by zero Õâ¸ö´íÎó¡£×îºóÒ»´Î·ûºÅ¶ÁÈ¡£¨½áÊøÀ¨ºÅ£©²¢²»ÊÇÕâ¸ö´íÎóµÄ¸ùÔ´¡£±í´ïʽ (a-3) µÄÖµ¾ÍÊÇ 0¡£¶ÔÓÚ¸üºÃµÄ´íÎóÏûÏ¢À´Ëµ£¬ÎÒÃÇÐèÒªÖªµÀ±í´ïʽµÄλÖá£ÒªÊµÏÖÕâÖÖ¹¦ÄÜ£¬ÎÒÃÇ¿ÉÒÔÔÚ YYLTYPE ÀàÐ͵ÄÈ«¾Ö±äÁ¿ yylloc ÖÐÌṩÕâ¸ö·ûºÅµÄÈ·ÇÐλÖá£Ê¹Óúê YYLLOC_DEFAULT£¨Çë²Î¿´ Bison Îĵµ ÖÐĬÈϵĶ¨Ò壩£¬Bison ¿ÉÒÔ¼ÆËã³öij¸ö±í´ïʽµÄλÖá£
¡¡¡¡¼Çס£¬Ö»Óе±ÄúÔÚÎÄ·¨ÖÐʹÓÃλÖÃʱ²Å»á¶¨ÒåÀàÐÍ¡£ÕâÊÇÒ»¸ö³£¼ûµÄ´íÎó¡£
¡¡¡¡Ä¬ÈϵÄλÖÃÀàÐÍ YYLTYPE ÈçÇåµ¥ 11 Ëùʾ¡£ÎÒÃÇ¿ÉÒÔ¶ÔÕâ¸öÀàÐÍÖØнøÐж¨Ò壬ʹÆä°üÀ¨¸ü¶àÐÅÏ¢£¬ÀýÈç Flex Ëù¶ÁÈ¡µÄÎļþÃû¡£
Çåµ¥ 11. ĬÈÏλÖÃÀàÐÍ YYLTYPE[code]typedef struct YYLTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
} YYLTYPE;[/code]ÔÚÉÏÒ»½ÚÖУ¬ÎÒÃÇ¿´µ½ÁË BeginToken() º¯Êý£¬ËüÊÇÔÚзûºÅ¿ªÊ¼Ê±µ÷Óõġ£´Ëʱ¾ÍÓ¦¸Ã´æ´¢Õâ¸öλÖÃÁË¡£ÔÚÎÒÃǵÄÀý×ÓÖУ¬Ò»¸ö·ûºÅ²»ÄÜ¿çÔ½¶àÐУ¬Òò´Ë first_line ºÍ last_line ÊÇÏàͬµÄ£¬ËüÃǶ¼±£´æÁ˵±Ç°µÄÐкš£ÆäËûÊôÐÔÓзûºÅµÄÆðµã£¨first_column£©ºÍÖյ㣨last_column£©£¬ÕâÊÇͨ¹ý·ûºÅµÄÆðµãºÍ³¤¶È¼ÆËã³öÀ´µÄ¡£
¡¡¡¡ÒªÊ¹ÓÃÕâ¸öλÖã¬ÎÒÃDZØÐë¶Ô¹æÔò´¦Àíº¯Êý½øÐд¦Àí£¬ÈçÇåµ¥ 12 Ëùʾ¡£·ûºÅ $3 µÄλÖÃÊÇͨ¹ý @3 ½øÐÐÒýÓõġ£ÎªÁË·ÀÖ¹¿½±´Õâ¸ö¹æÔòÖеÄÕû¸ö½á¹¹£¬ÎÒÃÇÉú³ÉÁËÒ»¸öÖ¸Õë &@3¡£Õâ¿´ÆðÀ´¿ÉÄÜÓеãÆæ¹Ö£¬µ«È´ÊÇÕýÈ·µÄ¡£
Çåµ¥ 12. ¼Çס¹æÔòÖеÄλÖÃ[code]| expression DIV expression
{
$ = ReduceDiv($1, $3, &@3);
}[/code]ÔÚ´¦Àíº¯ÊýÖУ¬ÎÒÃÇ»ñµÃÁËÒ»¸öÖ¸Ïò±£´æÁËλÖÃÐÅÏ¢µÄ YYLTYPE ½á¹¹µÄÖ¸Õ룬ÕâÑù¿ÉÒÔÉú³ÉÒ»ÌõºÜºÃµÄ´íÎóÏûÏ¢¡£
Çåµ¥ 13. ÔÚ ReduceDiv ÖÐʹÓñ£´æµÄλÖÃ[code]extern
double ReduceDiv(double a, double b, YYLTYPE *bloc) {
if ( b == 0 ) {
PrintError("division by zero! Line %d:c%d to %d:c%d",
bloc->first_line, bloc->first_column,
bloc->last_line, bloc->last_column);
return MAXFLOAT;
}
return a / b;
}[/code]ÏÖÔÚ´íÎóÏûÏ¢¿ÉÒÔ°ïÖúÎÒÃÇÀ´¶¨Î»ÎÊÌâÁË¡£³ýÁã²Ù×÷´íÎóÔÚµÚ 3 ÐÐµÄµÚ 10 Áе½ 18 ÁÐÖ®¼ä¡£
Çåµ¥ 14. ¸üºÃµÄ ReduceDiv() ´íÎóÏûÏ¢[code] |....+....:....+....:....+....:....+....:....+....:....+
1 |a = 3;
2 |3 aa = a * 4;
...... !..^^...........
Error: syntax error, unexpected IDENTIFIER, expecting SEMICOLON
3 |b = aa / ( a - 3 );
...... !....^^...............
Error: reference to unknown variable 'aa'
...... !.................^..
Error: division by zero! Line 3:10 to 3:18
final content of variables
Name------------------ Value----------
'a ' 3
'b ' 3.40282e+38
'aa ' 0[/code]½áÊøÓï
¡¡¡¡Flex ºÍ Bison ÊÇÓÃÀ´½âÎöÎÄ·¨µÄÒ»¶Ô¹¦ÄÜÇ¿´óµÄ×éºÏ¡£Í¨¹ýʹÓñ¾ÎÄÖнéÉܵļ¼ÇÉ£¬ÎÒÃÇ¿ÉÒÔ¹¹½¨¸üºÃµÄ½âÊÍÆ÷£¬ËüÃÇ¿ÉÒÔÉú³ÉÏñÄú×Ô¼ºÏ²»¶µÄ±àÒëÆ÷ÖÐÒ»ÑùµÄÓÐÓõġ¢ÈÝÒ×Àí½âµÄ´íÎóÏûÏ¢¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ