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 + -
显示快捷键?