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