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