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

📄 tiger.lex

📁 本设计Tiger语言为源语言
💻 LEX
字号:
package Parse;import ErrorMsg.ErrorMsg;%% %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 char change(String ss)	{    char tmp=0;    int chr=0;    if (ss.equals("\\t")) tmp=9;    else if(ss.equals("\\n")) tmp=10;    else if(ss.equals("\\r")) tmp=13;    else if(ss.equals("\\\\")) tmp= 92;    else if(ss.equals("\\\""))tmp= 34;    else if(ss.length()==4&&ss.charAt(0)=='\\') {		    	chr= Integer.parseInt(ss.substring(1));	    	if(chr>=0&&chr<=255)	    		tmp= (char)chr;	    	else 	    		err("Wrong character");    	    }    else if(ss.charAt(0)=='\\'&&ss.charAt(1)=='^')	{	    	chr= ss.charAt(2)-64;	    	tmp= (char)chr;    }    return tmp;}private ErrorMsg errorMsg;private String str="";private int comment_count=0;Yylex(java.io.InputStream s, ErrorMsg e) {  this(s);  errorMsg=e;}%}%eofval{	{		if(yy_lexical_state == STRING||yy_lexical_state == STRINGNEWLINE){		   	err("Error: Unclosed string constant.");		   	err("Error: Wrong end of file.");		}		if(yy_lexical_state == COMMENT)	{			err("Error: Unmatched comment punctuation.");		   	err("Error: Wrong end of file." );		}		return tok(sym.EOF,null);  	}%eofval}   %state STRING,STRINGNEWLINE,COMMENT   alpha=[A-Za-z]digit=[0-9]id={alpha}({alpha}|{digit}|_)*nextline=(\n|\r\n|\r)TabPageSpace=[ \t\f]escape=(\\{digit}{digit}{digit}|\\("^")([A-Z]|"@"|"["|"]"|\\|"^"|"_")|\\\\|\\\"|\\t|\\n|\\r)%%<YYINITIAL>{TabPageSpace}*	{}<YYINITIAL,COMMENT> {nextline}*	{newline();}<YYINITIAL> function {return tok(sym.FUNCTION, null);}<YYINITIAL> else {return tok(sym.ELSE, null);}<YYINITIAL> nil {return tok(sym.NIL, null);}<YYINITIAL> do {return tok(sym.DO, null);}<YYINITIAL> of	{return tok(sym.OF, null);}<YYINITIAL> array	{return tok(sym.ARRAY, null);}<YYINITIAL> type	{return tok(sym.TYPE, null);}<YYINITIAL> for	{return tok(sym.FOR, null);}<YYINITIAL> to	{return tok(sym.TO, null);}<YYINITIAL> in	{return tok(sym.IN, null);}<YYINITIAL> end	{return tok(sym.END, null);}<YYINITIAL> if	{return tok(sym.IF, null);}<YYINITIAL> while	{return tok(sym.WHILE, null);}<YYINITIAL> var	{return tok(sym.VAR, null);}<YYINITIAL> break	{return tok(sym.BREAK, null);}<YYINITIAL> let	{return tok(sym.LET, null);}<YYINITIAL> then	{return tok(sym.THEN, null);}<YYINITIAL>","	{return tok(sym.COMMA, null);}<YYINITIAL> ">" {return tok(sym.GT, null);}<YYINITIAL> "/" {return tok(sym.DIVIDE, null);}<YYINITIAL> ":"	{return tok(sym.COLON, null);}<YYINITIAL> "|"	{return tok(sym.OR, null);}<YYINITIAL> ">="	{return tok(sym.GE, null);}<YYINITIAL> "<"	{return tok(sym.LT, null);}<YYINITIAL> "-"	{return tok(sym.MINUS, null);}<YYINITIAL> "*"	{return tok(sym.TIMES, null);}<YYINITIAL> ","	{return tok(sym.COMMA, null);}<YYINITIAL> "<="	{return tok(sym.LE, null);}<YYINITIAL> ":="	{return tok(sym.ASSIGN, null);}<YYINITIAL> "."	{return tok(sym.DOT, null);}<YYINITIAL> "("	{return tok(sym.LPAREN, null);}<YYINITIAL> ")"	{return tok(sym.RPAREN, null);}<YYINITIAL> ";"	{return tok(sym.SEMICOLON, null);}<YYINITIAL> "["	{return tok(sym.LBRACK, null);}<YYINITIAL> "]"	{return tok(sym.RBRACK, null);}<YYINITIAL> "<>"	{return tok(sym.NEQ, null);}<YYINITIAL> "&"	{return tok(sym.AND, null);}<YYINITIAL> "+"	{return tok(sym.PLUS, null);}<YYINITIAL> "{"	{return tok(sym.LBRACE, null);}<YYINITIAL> "}"	{return tok(sym.RBRACE, null);}<YYINITIAL> "="	{return tok(sym.EQ, null);}<YYINITIAL> {id}	{return tok(sym.ID, yytext());}<YYINITIAL> {digit}+	{return tok(sym.INT,Integer.parseInt(yytext()));}<YYINITIAL> \"	{    str="";	yybegin(STRING);}<STRING> \"	{	yybegin(YYINITIAL);	return tok(sym.STRING, str);}<STRING> {escape} {    str+=change(yytext());}<STRING> [^\n\t\"\\]+	{		str+=yytext();}<STRING> \\ {	yybegin(STRINGNEWLINE);}<STRING> "\\r"	{	str+='\r';	yybegin(STRINGNEWLINE);}<STRING> "\\n"	{	str+='\n';	yybegin(STRINGNEWLINE);}<STRING> "\\t"	{	str+='\t';	yybegin(STRINGNEWLINE);}<STRINGNEWLINE> {TabPageSpace}	{}<STRINGNEWLINE>	{nextline} {}<STRINGNEWLINE> \" {err("String newline \\ don't match");}<STRINGNEWLINE> \\ {	yybegin(STRING);}<YYINITIAL> "/*"	{	yybegin(COMMENT);	comment_count+=1;}<YYINITIAL>	"*/"	{	err("Error: Unmatched comment punctuation.");}<COMMENT> "/*"	{	comment_count = comment_count + 1;}<COMMENT> "*/"	{ 	comment_count-=1; 	if (comment_count < 0) {		err("Error: Unmatched comment punctuation.");	}	if (comment_count == 0) {    		yybegin(YYINITIAL);	}}<COMMENT> .	{ }

⌨️ 快捷键说明

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