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