📄 my.flex
字号:
import java_cup.runtime.*;%%%public%class Scanner%implements sym%unicode%line%column%cup%cupdebug%{ StringBuffer string = new StringBuffer(); private Symbol symbol(int type) { return new MySymbol(type, yyline+1, yycolumn+1); } private Symbol symbol(int type, Object value) { return new MySymbol(type, yyline+1, yycolumn+1, value); } /** * assumes correct representation of a long value for * specified radix in scanner buffer from <code>start</code> * to <code>end</code> */ private long parseLong(int start, int end, int radix) { long result = 0; long digit; for (int i = start; i < end; i++) { digit = Character.digit(yycharat(i),radix); result*= radix; result+= digit; } return result; }%}/* main character classes */LineTerminator = \r|\n|\r\nInputCharacter = [^\r\n]WhiteSpace = {LineTerminator} | [ \t\f]/* comments */Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/"EndOfLineComment = "//" {InputCharacter}* {LineTerminator}?DocumentationComment = "/*" "*"+ [^/*] ~"*/"/* identifiers */Identifier = [:jletter:][:jletterdigit:]*/* integer literals */DecIntegerLiteral = 0 | [1-9][0-9]*DecLongLiteral = {DecIntegerLiteral} [lL]HexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8}HexLongLiteral = 0 [xX] 0* {HexDigit} {1,16} [lL]HexDigit = [0-9a-fA-F]OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15}OctLongLiteral = 0+ 1? {OctDigit} {1,21} [lL]OctDigit = [0-7] /* floating point literals */ FloatLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? [fF]DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}?FLit1 = [0-9]+ \. [0-9]* FLit2 = \. [0-9]+ FLit3 = [0-9]+ Exponent = [eE] [+-]? [0-9]+/* string and character literals */StringCharacter = [^\r\n\"\\]SingleCharacter = [^\r\n\'\\]%state STRING, CHARLITERAL%%<YYINITIAL> { /* keywords */ "repeat" { return symbol(REPEAT); } "array" { return symbol(ARRAY); } "boolean" { return symbol(BOOLEAN); } "break" { return symbol(BREAK); } "byte" { return symbol(BYTE); } "read" { return symbol(READ); } "char" { return symbol(CHAR); } "const" { return symbol(CONST); } "continue" { return symbol(CONTINUE); } "do" { return symbol(DO); } "real" { return symbol(REAL); } "else" { return symbol(ELSE); } "switch" { return symbol(SWITCH); } "case" { return symbol(CASE); } "write" { return symbol(WRITE); } "float" { return symbol(FLOAT); } "for" { return symbol(FOR); } "to" { return symbol(TO); } "default" { return symbol(DEFAULT); } "integer" { return symbol(INTEGER); } "program" { return symbol(PROGRAM); } "long" { return symbol(LONG); } "short" { return symbol(SHORT); } "or" { return symbol(OROR); } "and " { return symbol(ANDAND); } "goto" { return symbol(GOTO); } "if" { return symbol(IF); } "then" { return symbol(THEN); } "not" { return symbol(NOT); } "short" { return symbol(SHORT); } "until" { return symbol(UNTIL); } "return" { return symbol(RETURN); } "void" { return symbol(VOID); } "while" { return symbol(WHILE); } "begin" { return symbol(BEGIN); } "end" { return symbol(END); } "procedure" { return symbol(PROCEDURE); } "call" { return symbol(CALL); } /* boolean literals */ "true" { return symbol(BOOLEAN_LITERAL, new Boolean(true)); } "false" { return symbol(BOOLEAN_LITERAL, new Boolean(false)); } /* separators */ "(" { return symbol(LPAREN); } ")" { return symbol(RPAREN); } "{" { return symbol(LBRACE); } "}" { return symbol(RBRACE); } "[" { return symbol(LBRACK); } "]" { return symbol(RBRACK); } ";" { return symbol(SEMICOLON); } "," { return symbol(COMMA); } "." { return symbol(DOT); } /* operators */ "=" { return symbol(EQ); } ":=" { return symbol(ASSIGN); } ">" { return symbol(GT); } "<" { return symbol(LT); } "~" { return symbol(COMP); } "?" { return symbol(QUESTION); } ":" { return symbol(COLON); } "==" { return symbol(EQEQ); } "<=" { return symbol(LTEQ); } ">=" { return symbol(GTEQ); } "<>" { return symbol(NOTEQ); } "++" { return symbol(PLUSPLUS); } "--" { return symbol(MINUSMINUS); } "+" { return symbol(PLUS); } "-" { return symbol(MINUS); } "*" { return symbol(MULT); } "/" { return symbol(DIV); } "&" { return symbol(AND); } "|" { return symbol(OR); } "^" { return symbol(XOR); } "%" { return symbol(MOD); } "<<" { return symbol(LSHIFT); } ">>" { return symbol(RSHIFT); } "+=" { return symbol(PLUSEQ); } "-=" { return symbol(MINUSEQ); } "*=" { return symbol(MULTEQ); } "/=" { return symbol(DIVEQ); } "&=" { return symbol(ANDEQ); } "|=" { return symbol(OREQ); } "^=" { return symbol(XOREQ); } "%=" { return symbol(MODEQ); } "<<=" { return symbol(LSHIFTEQ); } ">>=" { return symbol(RSHIFTEQ); } /* string literal */ \" { yybegin(STRING); string.setLength(0); } /* character literal */ \' { yybegin(CHARLITERAL); } /* numeric literals */ {DecIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer(yytext())); } {DecLongLiteral} { return symbol(INTEGER_LITERAL, new Long(yytext().substring(0,yylength()-1))); } {HexIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(2, yylength(), 16))); } {HexLongLiteral} { return symbol(INTEGER_LITERAL, new Long(parseLong(2, yylength()-1, 16))); } {OctIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(0, yylength(), 8))); } {OctLongLiteral} { return symbol(INTEGER_LITERAL, new Long(parseLong(0, yylength()-1, 8))); } {FloatLiteral} { return symbol(FLOATING_POINT_LITERAL, new Float(yytext().substring(0,yylength()-1))); } {DoubleLiteral} { return symbol(FLOATING_POINT_LITERAL, new Double(yytext())); } {DoubleLiteral}[dD] { return symbol(FLOATING_POINT_LITERAL, new Double(yytext().substring(0,yylength()-1))); } /* comments */ {Comment} { /* ignore */ } /* whitespace */ {WhiteSpace} { /* ignore */ } /* identifiers */ {Identifier} { return symbol(IDENTIFIER, yytext()); } }<STRING> { \" { yybegin(YYINITIAL); return symbol(STRING_LITERAL, string.toString()); } {StringCharacter}+ { string.append( yytext() ); } /* escape sequences */ "\\b" { string.append( '\b' ); } "\\t" { string.append( '\t' ); } "\\n" { string.append( '\n' ); } "\\f" { string.append( '\f' ); } "\\r" { string.append( '\r' ); } "\\\"" { string.append( '\"' ); } "\\'" { string.append( '\'' ); } "\\\\" { string.append( '\\' ); } \\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1),8); string.append( val ); } /* error cases */ \\. { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); } {LineTerminator} { throw new RuntimeException("Unterminated string at end of line"); }}<CHARLITERAL> { {SingleCharacter}\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character(yytext().charAt(0))); } /* escape sequences */ "\\b"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\b'));} "\\t"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\t'));} "\\n"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\n'));} "\\f"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\f'));} "\\r"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\r'));} "\\\""\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\"'));} "\\'"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\''));} "\\\\"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\\')); } \\[0-3]?{OctDigit}?{OctDigit}\' { yybegin(YYINITIAL); int val = Integer.parseInt(yytext().substring(1,yylength()-1),8); return symbol(CHARACTER_LITERAL, new Character((char)val)); } /* error cases */ \\. { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); } {LineTerminator} { throw new RuntimeException("Unterminated character literal at end of line"); }}/* error fallback */.|\n { throw new RuntimeException("Illegal character \""+yytext()+ "\" at line "+yyline+", column "+yycolumn); }<<EOF>> { return symbol(EOF); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -