⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tinylex.txt

📁 本程序是 《编译原理与实践》一书中2.35 习题的解答。主要用到了 yyless()和 start condition 来解决。 作者:xiangyazi24@163.com NJU
💻 TXT
字号:
/***************************************************/
/****  File : tiny.1   *****************************/
/****  Lex specification for TINY                  */
/***************************************************/

%{
  #include "globals.h"
  #include "util.h"
  #include "scan.h"

  /*lexmeof identifier or reserved word */
  char tokenString[MAXTOKENLEN+1];
//////////////////////////////////////////////////////////////
  int NO_COPY=0;
  int flag=1;
  #define YY_USER_INIT BEGIN(source_echo)  //这里是后来查看手册才看到的东西,在宏 那一小节 //这里不要了,是不是每次用  yylex                                          //时都会做一次?
                                              // 与所想的不一样

%}
%x source_echo scan
digit [0-9]
number {digit}+
letter [a-zA-Z]
identifier {letter}+
newline   \n
whitespace [ \t]+

%%

<source_echo>.*\n {
   if(EchoSource)fprintf(listing,"%5d :%s",lineno,yytext);
   NO_COPY=1;yyless(0);
   BEGIN(scan); 
   
   return -1;
   }
<scan>
{
     "if"       {return IF;}
     "then"     {return THEN;}
     "else"     {return ELSE;}
     "repeat"   {return REPEAT;}
     "until"    {return UNTIL;}
     "read"     {return READ;}
     "write"    {return WRITE;}
     ":="       {return ASSIGN;}
     "="        {return EQ;}
     "<"        {return LT;}
     "+"        {return PLUS;}
     "-"        {return  MINUS;}
     "*"        {return TIMES;}
     "/"        {return OVER;}
     "("        {return LPAREN;}
     ")"        {return RPAREN; }
     ";"        {return SEMI;}
     {number}   {return NUM;}
     {identifier}  {return ID;}
     {newline}     {BEGIN(source_echo);lineno++;}
     {whitespace}  {/*skip whiltespace*/}
      "{"           {
	              char c;
	                do{
	          	c=input();
	                if(c=='\n')lineno++;

	                 }while(c!='}');/*这里就不加状态转换了,注释就不要了*/

        
                    }
        .          {return ERROR;}
      
}




%% 

TokenType getToken(void)
{
   static int firstTime=TRUE;
   TokenType    currentToken;
   if(firstTime)
   {
      firstTime=FALSE;
	  lineno++;
      yyin=source;
      yyout=listing;
   }

  
   currentToken=yylex();

   if(-1!=currentToken){
   strncpy(tokenString,yytext,MAXTOKENLEN);
   if(TraceScan){
     fprintf(listing,"\t%d: ",lineno);
	 printToken(currentToken,tokenString);

   }
  }
   return currentToken;

}
int yywrap(){flag=0;return 1;} //用到了yywrap(),当达到文件的末尾时,yylex 会调用yywrap(),所以在这里处理一些收尾工作
int main(int argc,char** argv)
{
   if(argc!=3)
   {
    fprintf(stderr,"Usage:%s +  <input file name>  +  <output file name>\n",argv[0]);
	fprintf(stderr,"Default input file  : tiny.txt");
	fprintf(stderr,"Default output file : out.txt ");
	}
   else{
     source=fopen(argv[1],"r");
     listing=fopen(argv[2],"w");
    }
     if(!source)source=fopen("tiny.txt","r");
     if(!listing)listing=fopen("out.txt","w");
  while(flag)
   getToken();
   return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -