📄 csharptokenmaker.flex
字号:
/*
CombiningCharacter = ()
*/
DecimalDigitCharacter = ([0-9])
ConnectingCharacter = ([_\-])
/*
FormattingCharacter = ()
*/
/*
IdentifierPartCharacter = ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter}|{CombiningCharacter}|{FormattingCharacter})
*/
IdentifierPartCharacter = ({LetterCharacter}|{DecimalDigitCharacter}|{ConnectingCharacter})
IdentifierPartCharacters = ({IdentifierPartCharacter}+)
IdentifierStartCharacter = ({LetterCharacter}|[_])
IdentifierOrKeyword = ({IdentifierStartCharacter}{IdentifierPartCharacters}?)
Identifier = ("@"?{IdentifierOrKeyword})
/* NOTE: The two below aren't from the C# spec, but we add them so we can */
/* highlight errors. */
NonSeparator = (([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\"))
ErrorIdentifier = ({NonSeparator}+)
/* C1.8 - Literals. */
BooleanLiteral = ("true"|"false")
DecimalDigit = ([0-9])
DecimalDigits = ({DecimalDigit}+)
IntegerTypeSuffix = (([uU][lL]?)|([lL][uU]?))
DecimalIntegerLiteral = ({DecimalDigits}{IntegerTypeSuffix}?)
HexDigit = ([0-9A-Fa-f])
HexDigits = ({HexDigit}+)
HexadecimalIntegerLiteral = ("0"[xX]{HexDigits}{IntegerTypeSuffix}?)
Sign = ([+\-])
ExponentPart = ([eE]{Sign}?{DecimalDigits})
RealTypeSuffix = ([fFdDmM])
RealHelper1 = ({DecimalDigits}"."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
RealHelper2 = ("."{DecimalDigits}{ExponentPart}?{RealTypeSuffix}?)
RealHelper3 = ({DecimalDigits}{ExponentPart}{RealTypeSuffix}?)
RealHelper4 = ({DecimalDigits}{RealTypeSuffix})
RealLiteral = ({RealHelper1}|{RealHelper2}|{RealHelper3}|{RealHelper4})
ErrorNumberFormat = (({DecimalIntegerLiteral}|{HexadecimalIntegerLiteral}|{RealLiteral}){NonSeparator}+)
SingleCharacter = ([^\'\\\n])
SimpleEscapeSequence = ("\\"[\'\"\\0abfnrtv])
HexadecimalEscapeSequence = ("\\x"{HexDigit}{HexDigit}?{HexDigit}?{HexDigit}?)
Character = ({SingleCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
UnclosedCharacterLiteral = ("'"{Character})
CharacterLiteral = ({UnclosedCharacterLiteral}"'")
ErrorUnclosedCharacterLiteral = ("'"[^\'\n]*)
ErrorCharacterLiteral = ("''"|{ErrorUnclosedCharacterLiteral}[\'])
QuoteEscapeSequence = ("\"\"")
SingleVerbatimStringLiteralCharacter = ([^\"])
VerbatimStringLiteralStart = ("@\"")
SingleRegularStringLiteralCharacter = ([^\"\\\n])
RegularStringLiteralCharacter = ({SingleRegularStringLiteralCharacter}|{SimpleEscapeSequence}|{HexadecimalEscapeSequence}|{UnicodeEscapeSequence})
RegularStringLiteralCharacters = ({RegularStringLiteralCharacter}+)
UnclosedRegularStringLiteral = ("\""{RegularStringLiteralCharacters}?)
RegularStringLiteral = ({UnclosedRegularStringLiteral}"\"")
ErrorUnclosedRegularStringLiteral = ([\"]([^\"\n]|"\\\"")*)
ErrorRegularStringLiteral = ({ErrorUnclosedRegularStringLiteral}"\"")
/* C.1.9 - Operators and Punctuators. */
OOPHelper1 = (":")
OOPHelper2 = ("+"|"-"|"*"|"/"|"%"|"&"|"|"|"^"|"!"|"~")
OOPHelper3 = ("="|"<"|">"|"?"|"++"|"--"|"&&"|"||"|"<<"|">>")
OOPHelper4 = ("=="|"!="|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&=")
OOPHelper5 = ("|="|"^="|"<<="|">>="|"->")
OperatorOrPunctuator = ({OOPHelper1}|{OOPHelper2}|{OOPHelper3}|{OOPHelper4}|{OOPHelper5})
/* NOTE: We distinguish between operators and separators (punctuators), but */
/* the C# spec doesn't, so the stuff below isn't in the spec. */
Separator = ([\{\}\[\]\(\)])
Separator2 = ([,;])
/* C.1.10 - Pre-processing Directives. */
/* NOTE: We don't do ALL of the PP stuff here as it's unnecessary */
/* for us to know the difference between declarations, diagnostics, */
/* regions, etc. */
ConditionalSymbol = ({IdentifierOrKeyword}) /* Not correct - excludes "true" and "false". */
PPNewLine = ({Whitespace}?{SingleLineComment}?{NewlineCharacter})
PPPrimaryExpression = ({IdentifierOrKeyword}|({Whitespace}?{PPExpression}{Whitespace}?))
PPUnaryExpression = ({PPPrimaryExpression}|("!"{Whitespace}?{PPUnaryExpression}))
PPEqualityExpression = ({PPUnaryExpression}|({Whitespace}?"=="{Whitespace}?{PPUnaryExpression})|({Whitespace}?"!="{Whitespace}?{PPUnaryExpression}))
PPAndExpression = ({PPEqualityExpression}|({Whitespace}?"&&"{Whitespace}?{PPEqualityExpression}))
PPOrExpression = ({PPAndExpression}|({Whitespace}?"||"{Whitespace}?{PPAndExpression}))
PPExpression = ({Whitespace}?{PPOrExpression}{Whitespace}?)
PPWord = ("define"|"undef"|"if"|"elif"|"else"|"endif"|"line"|"error"|"warning"|"region"|"endregion")
PPDirective = ({Whitespace}?"#"{Whitespace}?{PPWord}{InputCharacter}*)
%state DELIMITEDCOMMENT
%state DOCUMENTCOMMENT
%state VERBATIMSTRING
%%
/* Keywords */
<YYINITIAL> "abstract" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "as" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "base" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "break" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "case" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "catch" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "checked" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "class" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "const" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "continue" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "decimal" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "default" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "delegate" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "do" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "else" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "enum" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "event" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "explicit" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "extern" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "finally" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "fixed" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "for" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "foreach" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "goto" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "if" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "implicit" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "in" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "interface" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "internal" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "is" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "lock" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "namespace" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "new" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "null" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "object" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "operator" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "out" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "override" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "params" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "private" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "protected" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "public" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "readonly" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "ref" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "return" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "sealed" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "sizeof" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "stackalloc" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "static" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "string" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "struct" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "switch" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "this" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "throw" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "try" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "typeof" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "unchecked" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "unsafe" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "using" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "virtual" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "void" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "volatile" { addToken(Token.RESERVED_WORD); }
<YYINITIAL> "while" { addToken(Token.RESERVED_WORD); }
/* Data types. */
<YYINITIAL> "bool" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "byte" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "char" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "double" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "float" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "int" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "long" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "object" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "sbyte" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "short" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "string" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "uint" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "ulong" { addToken(Token.DATA_TYPE); }
<YYINITIAL> "ushort" { addToken(Token.DATA_TYPE); }
<YYINITIAL> {
{NewlineCharacter} { addNullToken(); return firstToken; }
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
{Identifier} { addToken(Token.IDENTIFIER); }
{Whitespace} { addToken(Token.WHITESPACE); }
/* String/Character Literals. */
{CharacterLiteral} { addToken(Token.LITERAL_CHAR); }
{UnclosedCharacterLiteral} { addToken(Token.ERROR_CHAR); /*addNullToken(); return firstToken;*/ }
{ErrorUnclosedCharacterLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
{ErrorCharacterLiteral} { addToken(Token.ERROR_CHAR); }
{VerbatimStringLiteralStart} { start = zzMarkedPos-2; yybegin(VERBATIMSTRING); }
{RegularStringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
{UnclosedRegularStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
{ErrorUnclosedRegularStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
{ErrorRegularStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
/* Comments. */
{DelimitedCommentStart} { start = zzMarkedPos-2; yybegin(DELIMITEDCOMMENT); }
{DocumentationCommentStart} { start = zzMarkedPos-3; yybegin(DOCUMENTCOMMENT); }
{SingleLineComment} { addToken(Token.COMMENT_EOL); addNullToken(); return firstToken; }
/* Separators. */
{Separator} { addToken(Token.SEPARATOR); }
{Separator2} { addToken(Token.IDENTIFIER); }
/* Operators. */
{OperatorOrPunctuator} { addToken(Token.OPERATOR); }
/* Numbers */
{DecimalIntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
{HexadecimalIntegerLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
{RealLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
/* Preprocessor directives. */
{PPDirective} { addToken(Token.PREPROCESSOR); }
/* Pretty-much anything else. */
{ErrorIdentifier} { addToken(Token.ERROR_IDENTIFIER); }
/* Ended with a line not in a string or comment. */
<<EOF>> { addNullToken(); return firstToken; }
/* Catch any other (unhandled) characters and flag them as bad. */
. { addToken(Token.ERROR_IDENTIFIER); }
}
<DELIMITEDCOMMENT> {
[^\n\*]+ {}
\n { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
{DelimitedCommentEnd} { yybegin(YYINITIAL); addToken(start,zzStartRead+1, Token.COMMENT_MULTILINE); }
\* {}
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_MULTILINE); return firstToken; }
}
<DOCUMENTCOMMENT> {
[^\<\n]* {}
\n { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
"<"[^\>]*">" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzMarkedPos-1, Token.PREPROCESSOR); start = zzMarkedPos; }
"<" { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addToken(temp,zzEndRead, Token.PREPROCESSOR); addNullToken(); return firstToken; }
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_DOCUMENTATION); addNullToken(); return firstToken; }
}
<VERBATIMSTRING> {
[^\"\n]* {}
{QuoteEscapeSequence} {}
\" { yybegin(YYINITIAL); addToken(start,zzStartRead, Token.LITERAL_STRING_DOUBLE_QUOTE); }
\n { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
<<EOF>> { addToken(start,zzStartRead-1, Token.LITERAL_STRING_DOUBLE_QUOTE); return firstToken; }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -