http://apps.hi.baidu.com/share/detail/51468885
按照這個鏈接做練習,出現了很多不可思議的問題,我承認是自己的問題。弄了半天,雖然原理還沒有弄那麼清楚,但是最起碼已經能運行了。
mylexer.l
%{
#include <stdio.h>
#include <string.h>
#include "myparser.h" //注意,這裏的頭文件要和Parser Generator生成的頭文件名一樣。
extern char *yytext;
extern YYSTYPE yylval;
%}
%%
[0-9]+ {yylval.number=atoi(yytext); return NUMBER;}
heater return TOKHEATER;
heat return TOKHEAT;
on|off {yylval.number=!strcmp(yytext,"on"); return STATE;}
target return TOKTARGET;
temperature return TOKTEMPERATURE;
[a-z0-9]+ {yylval.string=strdup(yytext);return WORD;}
\n /* ignore end of line */;
[ \t]+ /* ignore whitespace */;
%%
myparser.y
%{
/****************************************************************************
myparser.y
ParserWizard generated YACC file.
Date: 2012年5月6日
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "mylexer.h"
void yyerror(const char *str)
{
fprintf(stderr,"error:%s\n",str);
}
int yywrap()
{
return 1;
}
main()
{
yyparse();
}
char *heater="xl's test";
%}
/////////////////////////////////////////////////////////////////////////////
// declarations section
// attribute type
// place any declarations here
%token TOKHEATER TOKHEAT TOKTARGET TOKTEMPERATURE
%union
{
int number;
char *string;
}
%token <number> STATE
%token <number> NUMBER
%token <string> WORD
%%
commands:
| commands command
;
command:
heat_switch | target_set | heater_select
;
heat_switch:
TOKHEAT STATE
{
if($2)
printf("\tHeater '%s' turned on\n", heater);
else
printf("\tHeat '%s' turned off\n", heater);
}
;
target_set:
TOKTARGET TOKTEMPERATURE NUMBER
{
printf("\tHeater '%s' temperature set to %d\n",heater, $3);
}
;
heater_select:
TOKHEATER WORD
{
printf("\tSelected heater '%s'\n",$2);
heater=$2;
}
;
我還糾結一個問題,如果這樣子不改名字可能更是正確的,改過名字之後就只有兩個文件,不知道到底是怎麼回事。研究中......