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

📄 tiger.lex

📁 编译原理大作业---tiger编译器 包括semant,translate,mipsframe,regalloc等所有phase 懂的人自会知道
💻 LEX
字号:
package Parse;%%%implements Lexer%function nextToken%type java_cup.runtime.Symbol%{private ErrorMsg.ErrorMsg errorMsg;private void newline() { errorMsg.newline(yychar); }// contatore annidamento commentiprivate int commentDepth = 0;private Integer temp;// variabile usata per la creazione di una stringaprivate String str;private void err(int pos, String s) { errorMsg.error(pos,s); }private void err(String s) { err(yychar,s); }private java_cup.runtime.Symbol tok(int kind, Object value) {    return new java_cup.runtime.Symbol(kind, yychar, yychar+yylength(), value);}Yylex(java.io.InputStream s, ErrorMsg.ErrorMsg e) {   this(s);   errorMsg = e;}private String[] asciiTable =   {"","","","","","","","","","","",    "","","","","","","","","","",    "","","","","","","","","","",    ""," ","!","\"","#","$","%","&","'","(",    ")","*","+",",","-",".","/","0","1","2",    "3","4","5","6","7","8","9",":",";","<",    "=",">","?","@","A","B","C","D","E","F",    "G","H","I","J","K","L","M","N","O","P",    "Q","R","S","T","U","V","W","X","Y","Z",    "[","\\","]","^","_","\'","a","b","c","d",    "e","f","g","h","i","j","k","l","m","n",    "o","p","q","r","s","t","u","v","w","x",    "y","z","{","|","}","~",""};%}%eofval{   {     // controlla se e' rimasto aperto qualche commento     if (commentDepth!=0) {        err(yychar-1,"Commento non chiuso.");        return null;     }     else return tok(sym.EOF, null);   }%eofval}%char%notunix%state COMMENT,STRING,ESCAPESALPHA=[A-Za-z]NZERO=[1-9]NUM=0|{NZERO}SPACE=[\ \t\b]%%<YYINITIAL> ","        {return tok(sym.COMMA, null);}<YYINITIAL> ":"        {return tok(sym.COLON, null);}<YYINITIAL> ";"        {return tok(sym.SEMICOLON, null);}<YYINITIAL> "("        {return tok(sym.LPAREN, null);}<YYINITIAL> ")"        {return tok(sym.RPAREN, null);}<YYINITIAL> "["        {return tok(sym.LBRACK, null);}<YYINITIAL> "]"        {return tok(sym.RBRACK, null);}<YYINITIAL> "{"        {return tok(sym.LBRACE, null);}<YYINITIAL> "}"        {return tok(sym.RBRACE, null);}<YYINITIAL> "-"        {return tok(sym.MINUS, null);}<YYINITIAL> "+"        {return tok(sym.PLUS, null);}<YYINITIAL> "."        {return tok(sym.DOT, null);}<YYINITIAL> "*"        {return tok(sym.TIMES, null);}<YYINITIAL> "/"        {return tok(sym.DIVIDE, null);}<YYINITIAL> "="        {return tok(sym.EQ, null);}<YYINITIAL> "<>"       {return tok(sym.NEQ, null);}<YYINITIAL> "<"        {return tok(sym.LT, null);}<YYINITIAL> "<="       {return tok(sym.LE, null);}<YYINITIAL> ">"        {return tok(sym.GT, null);}<YYINITIAL> ">="       {return tok(sym.GE, null);}<YYINITIAL> "&"        {return tok(sym.AND, null);}<YYINITIAL> "|"        {return tok(sym.OR, null);}<YYINITIAL> ":="       {return tok(sym.ASSIGN, null);}<YYINITIAL> "var"      {return tok(sym.VAR, null);}<YYINITIAL> "end"      {return tok(sym.END, null);}<YYINITIAL> "for"      {return tok(sym.FOR, null);}<YYINITIAL> "while"    {return tok(sym.WHILE, null);}<YYINITIAL> "do"       {return tok(sym.DO, null);}<YYINITIAL> "function" {return tok(sym.FUNCTION, null);}<YYINITIAL> "nil"      {return tok(sym.NIL, null);}<YYINITIAL> "if"       {return tok(sym.IF, null);}<YYINITIAL> "then"     {return tok(sym.THEN, null);}<YYINITIAL> "else"     {return tok(sym.ELSE, null);}<YYINITIAL> "to"       {return tok(sym.TO, null);}<YYINITIAL> "break"    {return tok(sym.BREAK, null);}<YYINITIAL> "array"    {return tok(sym.ARRAY, null);}<YYINITIAL> "of"       {return tok(sym.OF, null);}<YYINITIAL> "type"     {return tok(sym.TYPE, null);}<YYINITIAL> "let"      {return tok(sym.LET, null);}<YYINITIAL> "in"       {return tok(sym.IN, null);}<YYINITIAL> {SPACE}+   { }<YYINITIAL,COMMENT> \n {newline();}<YYINITIAL> "/*" { yybegin(COMMENT); commentDepth = 1; }<COMMENT> "/*" { commentDepth++; }<COMMENT> "*/" {    commentDepth--;    if (commentDepth == 0) yybegin(YYINITIAL);}<YYINITIAL> \"   { str = ""; yybegin (STRING); }<STRING>    [\\] { yybegin(ESCAPES); }<ESCAPES>   \"   { str = str +"\""; yybegin(STRING);  }<ESCAPES>   "n"  { str = str + "\n"; yybegin(STRING); }<ESCAPES>   "t"  { str = str + "\t"; yybegin(STRING); }<ESCAPES>   ^C   { str = str + "^C"; yybegin(STRING); }<ESCAPES>   [0-9][0-9][0-9] {    try {        str = str +        asciiTable[(new Integer(yytext())).intValue()];    }    catch (ArrayIndexOutOfBoundsException e) {       err("Errore lessicale: cod. carattere ascii illegale");    }    yybegin(STRING);}<ESCAPES> (\r\n|\t|\f|" ")*[\\] { yybegin(STRING); }<ESCAPES> . { str = str + "\\"+ yytext();              err("Errore lessicale: Sequenza di escape non legale");              yybegin(STRING);            }<ESCAPES>  \n  { err("Errore lessicale: Stringa non chiusa correttamente."); }<STRING>   [\\][\\]    { str = str + "\\"; }<STRING>   \n  { err("Errore lessicale: Stringa non chiusa correttamente.");                 yybegin(YYINITIAL);               }<STRING>   \"  { yybegin(YYINITIAL); return tok(sym.STRING,str); }<STRING>   \n  { err("Errore lessicale: Stringa non chiusa correttamente.");                 yybegin(YYINITIAL);               }<STRING>   [^\"]  { str = str + yytext(); }<YYINITIAL> ({NUM})* { return tok(sym.INT,temp.valueOf(yytext()));}<YYINITIAL> {ALPHA}({ALPHA}|{NUM}|_)* { return tok(sym.ID,yytext());}<COMMENT> . { }<YYINITIAL> . { err(yychar,"Errore lessicale: Carattere non previsto: " + yytext() ); }

⌨️ 快捷键说明

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