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;
}
;
我还纠结一个问题,如果这样子不改名字可能更是正确的,改过名字之后就只有两个文件,不知道到底是怎么回事。研究中......