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