scanner.lex

来自「用Java实现的编译器。把源代码编译成SPARC汇编程序」· LEX 代码 · 共 236 行

LEX
236
字号
package parser;
import java_cup.runtime.Symbol;  // definition of scanner/parser interface
import java.util.*;
import CatDecaf.SymTable.*;


%%

%{
/* This flag is used for printing DEBUG messages */
public static boolean debug;
public static int lineno;
%}

%eofval{
  return new Symbol(sym.EOF);
%eofval}
%public
%class Scanner
%line
%char
%implements java_cup.runtime.Scanner
%function next_token
%type java_cup.runtime.Symbol


ALPHA=[A-Za-z_]
WHITE_SPACE=[\r\n\ \t\b\012\014]+
CHAR=([\040-\041]|[\043-\046]|[\050-\133]|[\135-\176]|\\\\|\\'|\\\"|"\t"|"\n")
CHAR_LITERAL='{CHAR}'
UNCLOSED_CHAR_LITERAL='({CHAR}*)
STRING_LITERAL=\"{CHAR}*\"
SINGLE_QUOTE_STRING_LITERAL='{CHAR}{CHAR}+'
UNCLOSED_STRING_LITERAL=\"{CHAR}*
COMMENT=//[^\n]*

DIGIT=[0-9]
INT_LITERAL=({DIGIT})+
HEX_DIGIT=[0-9a-fA-F]
HEX_LITERAL=0(x){HEX_DIGIT}+
IDENTIFIER={ALPHA}({ALPHA}|{DIGIT})*
NUM_ID_ERROR={DIGIT}+{IDENTIFIER}

%%

<YYINITIAL> {WHITE_SPACE} { }

<YYINITIAL> "=" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.ASSIGN, 		(yyline+1),yychar, new String("=")));}
<YYINITIAL> "," 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.COMMA,		(yyline+1),yychar, new String(","))); }
<YYINITIAL> ";" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.SEMI,		(yyline+1),yychar, new String(";"))); }
<YYINITIAL> "(" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.LPAREN,		(yyline+1),yychar, new String("("))); }
<YYINITIAL> ")" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.RPAREN,		(yyline+1),yychar, new String(")"))); }
<YYINITIAL> "[" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.LSQUARE,	(yyline+1),yychar, new String("["))); }
<YYINITIAL> "]" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.RSQUARE,	(yyline+1),yychar, new String("]"))); }
<YYINITIAL> "{" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.LCURLY, 		(yyline+1),yychar, new String("{"))); }
<YYINITIAL> "}" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.RCURLY, 		(yyline+1),yychar, new String("}"))); }
<YYINITIAL> "<<" { if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.SHIFTLEFT,	(yyline+1),yychar, new String("<<"))); }
<YYINITIAL> ">>" { if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.SHIFTRIGHT,	(yyline+1),yychar, new String(">>"))); }
<YYINITIAL> "+" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.PLUS, 		(yyline+1),yychar, new String("+"))); }
<YYINITIAL> "-" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.MINUS, 		(yyline+1),yychar, new String("-"))); }
<YYINITIAL> "*" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.MULT, 		(yyline+1),yychar, new String("*"))); }
<YYINITIAL> "/" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.DIVIDE,	 	(yyline+1),yychar, new String("/"))); }
<YYINITIAL> "%" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.MOD, 		(yyline+1),yychar, new String("%"))); }
<YYINITIAL> "<"  	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.LESSTHAN, 	(yyline+1),yychar, new String("<"))); }
<YYINITIAL> ">"  	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.GREATERTHAN,(yyline+1),yychar, new String(">"))); }
<YYINITIAL> "<=" { if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.LTOE, 		(yyline+1),yychar, new String("<="))); }
<YYINITIAL> ">=" { if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.GTOE, 		(yyline+1),yychar, new String(">="))); }
<YYINITIAL> "==" { if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.EQUAL, 		(yyline+1),yychar, new String("=="))); }
<YYINITIAL> "!=" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.NOTEQUAL,	(yyline+1),yychar, new String("!="))); }
<YYINITIAL> "&&" 	{ if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.AND, 		(yyline+1),yychar, new String("&&"))); }
<YYINITIAL> "||"  { if (debug) System.out.println("Token at line ("+(yyline+1)+"): "+yytext());
				   lineno = yyline + 1; return (new Symbol(sym.OR,	 		(yyline+1),yychar, new String("||"))); }



<YYINITIAL> "boolean" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.BOOLEAN,	(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"callout" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.CALLOUT,	(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"class" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.CLASS,	(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"else" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.ELSE,		(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"extends" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.EXTENDS,	(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"for" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.FOR,		(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"if" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.IF,		(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"int" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.INT,		(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"new" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.NEW,		(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"null" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.NULL,		(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"return" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.RETURN,	(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"this" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.THIS,		(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"void" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.VOID,		(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"while" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.WHILE,	(yyline+1),yychar, new String(yytext())));
	}
<YYINITIAL>"true" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.BOOLTRUE,(yyline+1),yychar,new Boolean(yytext())));
	}
<YYINITIAL>"false" {
		if (debug) System.out.println("Token (Keyword) at line ("+(yyline+1)+"): "+yytext());
		lineno = yyline + 1; return (new Symbol(sym.BOOLFALSE,(yyline+1),yychar, new Boolean(yytext())));
	}

<YYINITIAL> {IDENTIFIER} {
	if (debug) System.out.println("Token (Indentifier) at line ("+(yyline+1)+"): "+yytext());
	lineno = yyline + 1; return (new Symbol(sym.ID,(yyline+1),yychar, new String(yytext())));
}

<YYINITIAL> {CHAR_LITERAL} {
	String str =  yytext().substring(1,yytext().length() - 1);
	if (debug) System.out.println("Token (Char Literal) at line ("+(yyline+1)+"): "+str);
	lineno = yyline + 1; return (new Symbol(sym.CHARLIT,(yyline+1),yychar, new Character(str.charAt(0))));
}

<YYINITIAL> {UNCLOSED_CHAR_LITERAL} {
		System.err.println(parser.infile + ": "+ (yyline+1) +": Lexical error: Unclosed char literal: '"+yytext());
		ClassProgram.numOfError++;
		ClassProgram.semanticCheck=false;
}

<YYINITIAL> {STRING_LITERAL} {
	String str =  yytext().substring(1,yytext().length() - 1);
	if (debug) System.out.println("Token (String Literal) at line ("+(yyline+1)+"): "+str);
	lineno = yyline + 1; return (new Symbol(sym.STRINGLIT,(yyline+1),yychar, new String(str)));
}

<YYINITIAL> {SINGLE_QUOTE_STRING_LITERAL} {

		System.err.println(parser.infile + ": "+ (yyline+1) +": Lexical error: Double quotation marks needed for string: '"+yytext());
		ClassProgram.numOfError++;
		ClassProgram.semanticCheck=false;	
}

<YYINITIAL> {UNCLOSED_STRING_LITERAL} {

		System.err.println(parser.infile + ": "+ (yyline+1) +": Lexical error: Unclosed string literal: '"+yytext());
		ClassProgram.numOfError++;
		ClassProgram.semanticCheck=false;	
}

<YYINITIAL> {INT_LITERAL}|{HEX_LITERAL} {
	if (debug) System.out.println("Token (Integer Literal) at line ("+(yyline+1)+"): "+yytext());
	lineno = yyline + 1; return (new Symbol(sym.INTLIT,(yyline+1),yychar, new String(yytext())));
}

<YYINITIAL> {NUM_ID_ERROR} {

		System.err.println(parser.infile + ": "+ (yyline+1) +": Lexical error: Illegal identifier: '"+yytext());
		ClassProgram.numOfError++;
		ClassProgram.semanticCheck=false;
}

<YYINITIAL> {COMMENT} {
	//if (debug) System.out.println("Token (Comment line) at line ("+(yyline+1)+"): "+yytext());
}

<YYINITIAL> . {

		System.err.println(parser.infile + ": "+ (yyline+1) +": Lexical error: Illegal character: '"+yytext());
		ClassProgram.numOfError++;
		ClassProgram.semanticCheck=false;	
}













⌨️ 快捷键说明

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