NUnitWeb Code
Status: Alpha
Brought to you by:
johngarrison
public enum JsToken : int { EOF, ID, INT, DOUBLE, LBRACE, RBRACE, LPARA, RPARA, LBRACK, RBRACK, DOT, SEMI, COMMA, LT, GT, GTEQ, LTEQ, EQEQ, NEQ, PLUS, MINUS, STAR, MOD, INC, DEC, SHL, SHR, SHRE, AND, OR, XOR, NOT, COMP, LOG_AND, LOG_OR, CONDITIONAL, COLON, ASSIGN, PLUSEQ, MINEQ, TIMESEQ, MODEQ, SHLEQ, SHREQ, SHREEQ, ANDEQ, OREQ, XOREQ, DIV, DIVEQ, BREAK, ELSE, NEW, VAR, CASE, FINALLY, RETURN, VOID, CATCH, FOR, SWITCH, WHILE, CONTINUE, FUNCTION, WITH, DEFAULT, IF, THROW, DELETE, IN, TRY, DO, INSTANCEOF, TYPEOF, NULL, TRUE, FALSE, THIS, REGEX, DEBUGGER, QUOTE, ESCQUOTE, TIC, ESCTIC, ESCCHAR, STRTXT } public class JsParseException : System.Exception { public JsParseException ( string msg ) : base ( msg ) { } } public class Yytoken { public Yytoken ( JsToken token, string text, int line ) { m_token = token; m_text = text; m_line = line; } public JsToken m_token; public string m_text; public int m_line; public override string ToString() { return "Token: " + m_text + " (line "+ m_line + ")"; } } %% %{ private bool m_eof = false; public bool EOF { get { return m_eof; } } public int LineNumber { get { return yyline; } set { yyline = value; } } public int CharNumber { get { return yychar; } } %} %eof{ m_eof = true; %eof} %namespace JavaScript %line %char %state YYSTRINGQUOTE %state YYSTRINGTIC %state YYCOMMENT HexDigit [0-9a-fA-F] Digit [0-9] OctalDigit [0-7] TetraDigit [0-3] NonZeroDigit [1-9] Letter [a-zA-Z_] AnyButSlash [^\/] AnyButAstr [^\*] BLANK [ ] BLK [\b] TAB [\t] FF [\f] ESCCHR [\\] CR [\r] LF [\n] UniEsc [\1b] OctEscape1 [\\]{OctalDigit} OctEscape2 [\\]{OctalDigit}{OctalDigit} OctEscape3 [\\]{TetraDigit}{OctalDigit}{OctalDigit} OctEscape ({OctEscape1}|{OctEscape2}|{OctEscape3}) Escape ([\\]([r]|[n]|[b]|[f]|[t]|[\\]|)) ULetter ({Letter}|{UniEsc}) Identifier {ULetter}({ULetter}|{Digit})* Comment1 ("/*")(.|\r|\n)*("*/") Comment2 \/\/.* Comment ({Comment2}) Dimension [\[]({CR}|{LF}|{FF}|{TAB}|{BLK}|{BLANK}|{Comment})*[\]] IntSuffix ([l]|[L]) DecimalNum {NonZeroDigit}{Digit}*{IntSuffix}? OctalNum ([0]{OctalDigit}*{IntSuffix}?) HexNum [0]([x]|[X]){HexDigit}{HexDigit}*{IntSuffix}? IntegerLiteral ({DecimalNum}|{OctalNum}|{HexNum}) Sign ([\+]|[\-]) FlSuffix ([f]|[F]|[d]|[D]) SignedInt ({Sign}?{Digit}+) Expo ([e]|[E]) ExponentPart ({Expo}{SignedInt}?) Float1 {Digit}+[\.]{Digit}+{ExponentPart}?{FlSuffix}? Float2 [\.]{Digit}+{ExponentPart}?{FlSuffix}? Float3 {Digit}+{ExponentPart}{FlSuffix}? Float4 {Digit}+{FlSuffix} FloatingPoint ({Float1}|{Float2}|{Float3}|{Float4}) STRTXT=({Digit}|{Letter}|[ ]|[\:\;\,\.\!\@\#\$\%\&\*\(\)\-\=\+\|\}\]\[\{\?/\>\<\~\`]) STRTXTS=(({STRTXT}|["^"\t])*) NEWLINE=((\r\n)|\n) STRING_TEXT=([\"](([\\\\]|{STRTXT}|[\']|["^"])*)([\"])) STRING_TEXT2=(([\'])(([\\\\]|{STRTXT}|[\"]|["^"])*)([\'])) REX_SYM=([ ]|[\\]|[\:]|[\;]|[\,]|[\.]|[\!]|[\@]|[\#]|[\$]|[\%]|[\^]|[\&]|[\*]|[\(]|[\)]|[\-]|[\_]|[\=]|[\+]|[\|]|[\}]|[\]]|[\[]|[\{]|[\?]|[\>]|[\<]|[\~]|[\`]) REX_EXPR=(/[^/\*]({Digit}|{Letter}|{REX_SYM}|("\/"))*(/)) %% <YYINITIAL> "{" {return (new Yytoken(JsToken.LBRACE,yytext(),yyline));} <YYINITIAL> "}" {return (new Yytoken(JsToken.RBRACE,yytext(),yyline));} <YYINITIAL> "(" {return (new Yytoken(JsToken.LPARA,yytext(),yyline));} <YYINITIAL> ")" {return (new Yytoken(JsToken.RPARA,yytext(),yyline));} <YYINITIAL> "[" {return (new Yytoken(JsToken.LBRACK,yytext(),yyline));} <YYINITIAL> "]" {return (new Yytoken(JsToken.RBRACK,yytext(),yyline));} <YYINITIAL> "." {return (new Yytoken(JsToken.DOT,yytext(),yyline));} <YYINITIAL> ";" {return (new Yytoken(JsToken.SEMI,yytext(),yyline));} <YYINITIAL> "," {return (new Yytoken(JsToken.COMMA,yytext(),yyline));} <YYINITIAL> "<" {return (new Yytoken(JsToken.LT,yytext(),yyline));} <YYINITIAL> ">" {return (new Yytoken(JsToken.GT,yytext(),yyline));} <YYINITIAL> ">=" {return (new Yytoken(JsToken.GTEQ,yytext(),yyline));} <YYINITIAL> "<=" {return (new Yytoken(JsToken.LTEQ,yytext(),yyline));} <YYINITIAL> "==" {return (new Yytoken(JsToken.EQEQ,yytext(),yyline));} <YYINITIAL> "!=" {return (new Yytoken(JsToken.NEQ,yytext(),yyline));} <YYINITIAL> "+" {return (new Yytoken(JsToken.PLUS,yytext(),yyline));} <YYINITIAL> "-" {return (new Yytoken(JsToken.MINUS,yytext(),yyline));} <YYINITIAL> "*" {return (new Yytoken(JsToken.STAR,yytext(),yyline));} <YYINITIAL> "%" {return (new Yytoken(JsToken.MOD,yytext(),yyline));} <YYINITIAL> "++" {return (new Yytoken(JsToken.INC,yytext(),yyline));} <YYINITIAL> "--" {return (new Yytoken(JsToken.DEC,yytext(),yyline));} <YYINITIAL> "<<" {return (new Yytoken(JsToken.SHL,yytext(),yyline));} <YYINITIAL> ">>" {return (new Yytoken(JsToken.SHR,yytext(),yyline));} <YYINITIAL> ">>>" {return (new Yytoken(JsToken.SHRE,yytext(),yyline));} <YYINITIAL> "&" {return (new Yytoken(JsToken.AND,yytext(),yyline));} <YYINITIAL> "|" {return (new Yytoken(JsToken.OR,yytext(),yyline));} <YYINITIAL> "^" {return (new Yytoken(JsToken.XOR,yytext(),yyline));} <YYINITIAL> "!" {return (new Yytoken(JsToken.NOT,yytext(),yyline));} <YYINITIAL> "~" {return (new Yytoken(JsToken.COMP,yytext(),yyline));} <YYINITIAL> "&&" {return (new Yytoken(JsToken.LOG_AND,yytext(),yyline));} <YYINITIAL> "||" {return (new Yytoken(JsToken.LOG_OR,yytext(),yyline));} <YYINITIAL> "?" {return (new Yytoken(JsToken.CONDITIONAL,yytext(),yyline));} <YYINITIAL> ":" {return (new Yytoken(JsToken.COLON,yytext(),yyline));} <YYINITIAL> "=" {return (new Yytoken(JsToken.ASSIGN,yytext(),yyline));} <YYINITIAL> "+=" {return (new Yytoken(JsToken.PLUSEQ,yytext(),yyline));} <YYINITIAL> "-=" {return (new Yytoken(JsToken.MINEQ,yytext(),yyline));} <YYINITIAL> "*=" {return (new Yytoken(JsToken.TIMESEQ,yytext(),yyline));} <YYINITIAL> "%=" {return (new Yytoken(JsToken.MODEQ,yytext(),yyline));} <YYINITIAL> "<<=" {return (new Yytoken(JsToken.SHLEQ,yytext(),yyline));} <YYINITIAL> ">>=" {return (new Yytoken(JsToken.SHREQ,yytext(),yyline));} <YYINITIAL> ">>>=" {return (new Yytoken(JsToken.SHREEQ,yytext(),yyline));} <YYINITIAL> "&=" {return (new Yytoken(JsToken.ANDEQ,yytext(),yyline));} <YYINITIAL> "|=" {return (new Yytoken(JsToken.OREQ,yytext(),yyline));} <YYINITIAL> "^=" {return (new Yytoken(JsToken.XOREQ,yytext(),yyline));} <YYINITIAL> "/" {return (new Yytoken(JsToken.DIV,yytext(),yyline));} <YYINITIAL> "/=" {return (new Yytoken(JsToken.DIVEQ,yytext(),yyline));} <YYINITIAL> "this" {return (new Yytoken(JsToken.THIS,yytext(),yyline));} <YYINITIAL> "break" {return (new Yytoken(JsToken.BREAK,yytext(),yyline));} <YYINITIAL> "else" {return (new Yytoken(JsToken.ELSE,yytext(),yyline));} <YYINITIAL> "new" {return (new Yytoken(JsToken.NEW,yytext(),yyline));} <YYINITIAL> "var" {return (new Yytoken(JsToken.VAR,yytext(),yyline));} <YYINITIAL> "case" {return (new Yytoken(JsToken.CASE,yytext(),yyline));} <YYINITIAL> "finally" {return (new Yytoken(JsToken.FINALLY,yytext(),yyline));} <YYINITIAL> "return" {return (new Yytoken(JsToken.RETURN,yytext(),yyline));} <YYINITIAL> "void" {return (new Yytoken(JsToken.VOID,yytext(),yyline));} <YYINITIAL> "catch" {return (new Yytoken(JsToken.CATCH,yytext(),yyline));} <YYINITIAL> "for" {return (new Yytoken(JsToken.FOR,yytext(),yyline));} <YYINITIAL> "switch" {return (new Yytoken(JsToken.SWITCH,yytext(),yyline));} <YYINITIAL> "while" {return (new Yytoken(JsToken.WHILE,yytext(),yyline));} <YYINITIAL> "continue" {return (new Yytoken(JsToken.CONTINUE,yytext(),yyline));} <YYINITIAL> "function" {return (new Yytoken(JsToken.FUNCTION,yytext(),yyline));} <YYINITIAL> "with" {return (new Yytoken(JsToken.WITH,yytext(),yyline));} <YYINITIAL> "default" {return (new Yytoken(JsToken.DEFAULT,yytext(),yyline));} <YYINITIAL> "if" {return (new Yytoken(JsToken.IF,yytext(),yyline));} <YYINITIAL> "throw" {return (new Yytoken(JsToken.THROW,yytext(),yyline));} <YYINITIAL> "delete" {return (new Yytoken(JsToken.DELETE,yytext(),yyline));} <YYINITIAL> "in" {return (new Yytoken(JsToken.IN,yytext(),yyline));} <YYINITIAL> "try" {return (new Yytoken(JsToken.TRY,yytext(),yyline));} <YYINITIAL> "do" {return (new Yytoken(JsToken.DO,yytext(),yyline));} <YYINITIAL> "instanceof" {return (new Yytoken(JsToken.INSTANCEOF,yytext(),yyline));} <YYINITIAL> "typeof" {return (new Yytoken(JsToken.TYPEOF,yytext(),yyline));} <YYINITIAL> "null" {return (new Yytoken(JsToken.NULL,yytext(),yyline));} <YYINITIAL> "true" {return (new Yytoken(JsToken.TRUE,yytext(),yyline));} <YYINITIAL> "false" {return (new Yytoken(JsToken.FALSE,yytext(),yyline));} <YYINITIAL> "debugger" {return (new Yytoken(JsToken.DEBUGGER,yytext(),yyline));} <YYINITIAL> {REX_EXPR} {return (new Yytoken(JsToken.REGEX,yytext(),yyline));} <YYINITIAL> \" {yybegin(YYSTRINGQUOTE); return (new Yytoken(JsToken.QUOTE,yytext(),yyline));} <YYINITIAL> ' {yybegin(YYSTRINGTIC); return (new Yytoken(JsToken.TIC,yytext(),yyline));} <YYSTRINGQUOTE,YYSTRINGTIC> \\\" {return (new Yytoken(JsToken.ESCQUOTE,yytext(),yyline));} <YYSTRINGQUOTE,YYSTRINGTIC> \\' {return (new Yytoken(JsToken.ESCTIC,yytext(),yyline));} <YYSTRINGQUOTE,YYSTRINGTIC> \\{STRTXT} {return (new Yytoken(JsToken.ESCCHAR,yytext(),yyline));} <YYSTRINGQUOTE,YYSTRINGTIC> \\\\ {return (new Yytoken(JsToken.ESCCHAR,yytext(),yyline));} <YYSTRINGQUOTE,YYSTRINGTIC> {STRTXTS} {return (new Yytoken(JsToken.STRTXT,yytext(),yyline));} <YYSTRINGQUOTE> ' {return (new Yytoken(JsToken.STRTXT,yytext(),yyline));} <YYSTRINGTIC> \" {return (new Yytoken(JsToken.STRTXT,yytext(),yyline));} <YYSTRINGQUOTE> \" {yybegin(YYINITIAL); return (new Yytoken(JsToken.QUOTE,yytext(),yyline));} <YYSTRINGTIC> ' {yybegin(YYINITIAL); return (new Yytoken(JsToken.TIC,yytext(),yyline));} <YYINITIAL> "/*" {yybegin(YYCOMMENT); return null;} <YYCOMMENT> . {return null;} <YYCOMMENT> [\r\n] {return null;} <YYCOMMENT> "*/" {yybegin(YYINITIAL); return null;} <YYINITIAL> {Identifier} {return (new Yytoken(JsToken.ID,yytext(),yyline));} <YYINITIAL> {DecimalNum} {return (new Yytoken(JsToken.INT,yytext(),yyline));} <YYINITIAL> {HexNum} {return (new Yytoken(JsToken.INT,yytext(),yyline));} <YYINITIAL> {OctalNum} {return (new Yytoken(JsToken.INT,yytext(),yyline));} <YYINITIAL> {Float1} {return (new Yytoken(JsToken.DOUBLE,yytext(),yyline));} <YYINITIAL> {Float2} {return (new Yytoken(JsToken.DOUBLE,yytext(),yyline));} <YYINITIAL> {Float3} {return (new Yytoken(JsToken.DOUBLE,yytext(),yyline));} <YYINITIAL> {Float4} {return (new Yytoken(JsToken.DOUBLE,yytext(),yyline));} <YYINITIAL> {CR} { return null; } <YYINITIAL> {LF} { return null; } <YYINITIAL> {FF} { return null; } <YYINITIAL> {TAB} { return null; } <YYINITIAL> {BLK} { return null; } <YYINITIAL> {BLANK} { return null; } <YYINITIAL> {Comment} { return null; } <YYINITIAL> . { throw new JsParseException ("Unmatched input: " + yytext() + " on line " + yyline); }