tiger.lex
来自「Tiger语言的一种编译器,在大学CS课程必做的,不过可惜的是没有完全完成,做好」· LEX 代码 · 共 155 行
LEX
155 行
package Parse;%% %implements Lexer%function nextToken%type java_cup.runtime.Symbol%char%{private void newline() { errorMsg.newline(yychar);}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);}private ErrorMsg.ErrorMsg errorMsg;Yylex(java.io.InputStream s, ErrorMsg.ErrorMsg e) { this(s); errorMsg=e;}private int comment_count = 0; //used to detect unclosed commentprivate StringBuffer temp = null; //bufferprivate int str_beg = -1; //used to dectect unclosed string%}%eofval{ if(comment_count != 0) {//unclosed comment err("Can't Find */ to end the Comment!"); } if(str_beg != -1) {//unclosed string: prompt and return sym.STRING token yybegin(YYINITIAL);//return to state YYINITIAL err("String Unclosed! Have you fogotten a \"?"); str_beg = -1; //set string closed return tok(sym.STRING,temp.toString());//return sym.STRING token } return tok(sym.EOF, null);//normal exit,return sym.EOF token%eofval}%state COMMENT,STRINGNONEWLINE_WHITE_SPACE = [\ \t\r]WHITE_SPACE = [\ \t\r\n]DIGIT = [0-9]ALPHA = [A-Za-z]ASC_DEC = \\{DIGIT}{DIGIT}{DIGIT}ANO_LINE = \\{WHITE_SPACE}+\\ESCAPE = \\.STRING_LITERAL = ([^\n\"\\])*COMMENT_TEXT = ([^/*\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])*%%<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.DOT, null);}<YYINITIAL>"+" {return tok(sym.PLUS, null);}<YYINITIAL>"-" {return tok(sym.MINUS, 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>array {return tok(sym.ARRAY, null);}<YYINITIAL>if {return tok(sym.IF, null);}<YYINITIAL>then {return tok(sym.THEN, null);}<YYINITIAL>else {return tok(sym.ELSE, null);}<YYINITIAL>while {return tok(sym.WHILE, null);}<YYINITIAL>for {return tok(sym.FOR, null);}<YYINITIAL>to {return tok(sym.TO, null);}<YYINITIAL>do {return tok(sym.DO, null);}<YYINITIAL>let {return tok(sym.LET, null);}<YYINITIAL>in {return tok(sym.IN, null);}<YYINITIAL>end {return tok(sym.END, null);}<YYINITIAL>of {return tok(sym.OF, null);}<YYINITIAL>break {return tok(sym.BREAK, null);}<YYINITIAL>nil {return tok(sym.NIL, null);}<YYINITIAL>function {return tok(sym.FUNCTION, null);}<YYINITIAL>var {return tok(sym.VAR, null);}<YYINITIAL>type {return tok(sym.TYPE, null);}<YYINITIAL>{NONEWLINE_WHITE_SPACE}+ {}<YYINITIAL,COMMENT>\n {newline();}<YYINITIAL>"/*" {yybegin(COMMENT); comment_count++;}<COMMENT>"/*" {comment_count++;}<COMMENT>"*/" { comment_count--; if(comment_count < 0) err("Illegal Comment: Can't Find */ to end the Comment!"); if(comment_count == 0) yybegin(YYINITIAL); }<COMMENT>{COMMENT_TEXT} {}<YYINITIAL>\" { yybegin(STRING); temp = new StringBuffer(""); str_beg = yychar+1; }<STRING>{ASC_DEC} {temp.append((char)Integer.parseInt(yytext().substring(1,4)));}<STRING>{ANO_LINE} {newline();}<STRING>{ESCAPE} { if(yytext().charAt(1) == '\"') temp.append("\""); else if(yytext().charAt(1) == '\\') temp.append("\\"); else if(yytext().charAt(1) == 'n') temp.append("\n"); else if(yytext().charAt(1) == 't') temp.append("\t"); else err("Illegal Charactor After \\: " + yytext().charAt(1)); }<STRING>{STRING_LITERAL} {temp = temp.append(yytext());}<STRING>\n { yybegin(YYINITIAL); newline(); err("String Unclosed! Have you fogotten a \"?"); str_beg = -1; return tok(sym.STRING,temp.toString()); }<STRING>\" {yybegin(YYINITIAL); str_beg = -1; return tok(sym.STRING,temp.toString());}<YYINITIAL>{DIGIT}+ {return tok(sym.INT, new Integer(yytext()));}<YYINITIAL>{ALPHA}({ALPHA}|{DIGIT}|_)* {return tok(sym.ID,yytext());}<YYINITIAL,COMMENT>. {err("Illegal Charactor!");}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?