📄 scan_lex.l
字号:
/****************************************************/
/* File: scan.l */
/* Lex specification for Cminus */
/****************************************************/
%{
#include "globals.h"
#include "util.h"
#include "scan.h"
/* lexeme of identifier or reserved word */
char tokenString[MAXTOKENLEN+1];
%}
digit [0-9]
number {digit}+
letter [a-zA-Z]
identifier {letter}+
newline \n
whitespace [ \t]+
%%
"/*" { char c;
int done=FALSE;
ECHO;
do
{
while((c=input())!='*')
{
if (c == EOF) break;
if (c == '\n') lineno++;
putchar(c);
}
if (c == EOF) break;
if (c == '\n') lineno++;
putchar(c);
while((c=input())=='*')
{
if (c == EOF) break;
if (c == '\n') lineno++;
putchar(c);
}
if (c == EOF) break;
if (c == '\n') lineno++;
putchar(c);
if(c=='/'){done=TRUE;c=input();
if (c == EOF) break;
if (c == '\n') lineno++;
putchar(c);}
} while (!done);
}
"if" {return IF;}
"else" {return ELSE;}
"int" {return INT;}
"return" {return RETURN;}
"void" {return VOID;}
"while" {return WHILE;}
"=" {return ASSIGN;}
"==" {return EQ;}
"!=" {return NOEQ;}
"<" {return LT;}
"<=" {return LTEQ;}
">" {return GT;}
">=" {return GTEQ;}
"+" {return PLUS;}
"-" {return MINUS;}
"*" {return TIMES;}
"/" {return OVER;}
"(" {return LPAREN;}
")" {return RPAREN;}
"[" {return LBRA;}
"]" {return RBRA;}
"{" {return LBRACE;}
"}" {return RBRACE;}
"," {return COMMA;}
";" {return SEMI;}
{number} {return NUM;}
{identifier} {return ID;}
{newline} {lineno++;}
{whitespace} {/* skip whitespace */}
. {return ERROR;}
%%
TokenType getToken(void)
{ static int firstTime = TRUE;
TokenType currentToken;
if (firstTime)
{ firstTime = FALSE;
lineno++;
yyin = source;
yyout = listing;
}
currentToken = yylex();
strncpy(tokenString,yytext,MAXTOKENLEN);
if (TraceScan) {
fprintf(listing,"\t%d: ",lineno);
printToken(currentToken,tokenString);
}
return currentToken;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -