📄 tinylex.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 + -