使用parse generator遇到的一點問題,剛剛入門啊

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;
    }
    ;


我還糾結一個問題,如果這樣子不改名字可能更是正確的,改過名字之後就只有兩個文件,不知道到底是怎麼回事。研究中......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章