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

📄 tigero.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 ErrorMsg.ErrorMsg errorMsg;

Yylex(java.io.InputStream s, ErrorMsg.ErrorMsg e) {
  this(s);
  errorMsg=e;
}

private int comment_count = 0;	//used to detect unclosed comment
private StringBuffer temp = null;	//buffer
private int str_beg = -1;	//used to dectect unclosed string

%}

%eofval{
		if(comment_count != 0)
		{
			err("注释语句不匹配,缺少*/.");			
		}
		if(str_beg != -1)
		{
			yybegin(YYINITIAL);
			err("字符串语句不匹配,缺少\"");	
			str_beg = -1;	
			return tok(sym.STRING,temp.toString());
		}
		return tok(sym.EOF, null);
%eofval}

%state COMMENT,STARINCOM,STRING

NONEWLINE_WHITE_SPACE = [\ \t\r]
WHITE_SPACE = [\ \t\r\n]
DIGIT = [0-9]
ALPHA = [A-Za-z]
DIGITS = {DIGIT}+
LEGID= {ALPHA}({ALPHA}|{DIGIT}|_)*
ILLID={DIGITS}{LEGID}
ASC = \\{DIGIT}{DIGIT}{DIGIT}
CHGLINE = \\{WHITE_SPACE}+\\
ESCAPE = \\.
STRING_TEXT = ([^\n\"\\])*
COMMENT_TEXT = [^*\n]*
NONSTAR=[^/*\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>function		{return tok(sym.FUNCTION, 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>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>"*"		{yybegin(STARINCOM);}
<STARINCOM>"/"		{comment_count--;yybegin(YYINITIAL);	}
<STARINCOM>"*" 		{yybegin(STARINCOM);}
<STARINCOM>{NONSTAR}	{yybegin(COMMENT); }
<COMMENT>{COMMENT_TEXT}	{}

<YYINITIAL>\"		{
				yybegin(STRING);
				temp = new StringBuffer("");
				str_beg = yychar+1;
			}
<STRING>{ASC}	{temp.append((char)Integer.parseInt(yytext().substring(1,4)));}
<STRING>{CHGLINE}	{newline();}
<STRING>{ESCAPE}	{
				if(yytext().charAt(1) == 'n')
					temp.append("\n");
				else if(yytext().charAt(1) == 't')
					temp.append("\t");
				else if(yytext().charAt(1) == '\"')
					temp.append("\"");
				else if(yytext().charAt(1) == '\\')
					temp.append("\\");
				else
					err("非法字符.");
			}
<STRING>{STRING_TEXT}
			{temp = temp.append(yytext());}
<STRING>\n		{
				yybegin(YYINITIAL);
				newline();
				err("字符串语句不匹配,缺少\"");		
				str_beg = -1;
				return tok(sym.STRING,temp.toString());
			}
<STRING>\"		{yybegin(YYINITIAL); str_beg = -1; return tok(sym.STRING,temp.toString());}
<YYINITIAL>{ILLID}   {err("非法ID.");}
<YYINITIAL>{DIGIT}+	{return tok(sym.INT, new Integer(yytext()));}
<YYINITIAL>{LEGID}
			{return tok(sym.ID,yytext());}

<YYINITIAL,COMMENT>.	
			{err("非法字符.");}

⌨️ 快捷键说明

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