//Language: Java Script


// tokens
Token=tnone
Token=tjsstring
Token=tjscomment
Token=tjsident
Token=tjsinteger
Token=tjsfloat
Token=tjsresword
Token=tjssymbol
Token=tjssymbol2
Token=turl
Token=twhitespace


// states
State=sjsnormal,CaseSensitive
State=sjsstring1
State=sjsstring2
State=sjscomment1
State=sjscomment2


// delims
Delimiters=;.,:'"{}[]()?!@#$%^&*-+=|\/

//symbols  (must be before heredoc)
sjsnormal  [<>\.,=;&|!%/@\+\-\*]         sjsnormal  tjssymbol
sjsnormal  [()\[\]\{\}]         sjsnormal  tjssymbol2

// reswords
sjsnormal 'break'        sjsnormal tjsresword
sjsnormal 'case'         sjsnormal tjsresword
sjsnormal 'catch'        sjsnormal tjsresword
sjsnormal 'class'        sjsnormal tjsresword
sjsnormal 'const'        sjsnormal tjsresword
sjsnormal 'continue'     sjsnormal tjsresword
sjsnormal 'debugger'     sjsnormal tjsresword
sjsnormal 'default'      sjsnormal tjsresword
sjsnormal 'delete'       sjsnormal tjsresword
sjsnormal 'do'           sjsnormal tjsresword
sjsnormal 'else'         sjsnormal tjsresword
sjsnormal 'enum'         sjsnormal tjsresword
sjsnormal 'export'       sjsnormal tjsresword
sjsnormal 'extends'      sjsnormal tjsresword
sjsnormal 'false'        sjsnormal tjsresword
sjsnormal 'finally'      sjsnormal tjsresword
sjsnormal 'for'          sjsnormal tjsresword
sjsnormal 'function'     sjsnormal tjsresword
sjsnormal 'if'           sjsnormal tjsresword
sjsnormal 'import'       sjsnormal tjsresword
sjsnormal 'in'           sjsnormal tjsresword
sjsnormal 'new'          sjsnormal tjsresword
sjsnormal 'null'         sjsnormal tjsresword
sjsnormal 'return'       sjsnormal tjsresword
sjsnormal 'super'        sjsnormal tjsresword
sjsnormal 'switch'       sjsnormal tjsresword
sjsnormal 'this'         sjsnormal tjsresword
sjsnormal 'throw'        sjsnormal tjsresword
sjsnormal 'true'         sjsnormal tjsresword
sjsnormal 'try'          sjsnormal tjsresword
sjsnormal 'typeof'       sjsnormal tjsresword
sjsnormal 'var'          sjsnormal tjsresword
sjsnormal 'void'         sjsnormal tjsresword
sjsnormal 'while'        sjsnormal tjsresword
sjsnormal 'with'         sjsnormal tjsresword

// numbers
sjsnormal [0-9][0-9]*                            sjsnormal  tjsinteger
sjsnormal 0X[0-9A-F]+                            sjsnormal  tjsinteger
sjsnormal [1-9][0-9]*\.[0-9]*                    sjsnormal  tjsfloat
sjsnormal [1-9][0-9]*{\.[0-9]+}|e{[\+\-]}|[0-9]+ sjsnormal  tjsfloat

// idents
sjsnormal   [a-z_A-Z$][a-z_A-Z0-9$]*  sjsnormal   tjsident

//white space
sjsnormal #32*                    sjsnormal     twhitespace
sjsnormal #9*                     sjsnormal     twhitespace

//strings
sjsnormal  \'                     sjsstring1    tjsstring
sjsstring1  [^\']*                sjsstring1    tjsstring
sjsstring1  \'                    sjsnormal     tjsstring
sjsstring1  \'\'                  sjsstring1    tjsstring
sjsstring1   \\\\                 sjsstring1    tjsstring
sjsstring1   \\\'                 sjsstring1    tjsstring
sjsstring1   \\[^\\]              sjsstring1    tjsstring
sjsstring1   $                    sjsnormal     tjsstring

//strings
sjsnormal  \"                     sjsstring2    tjsstring
sjsstring2  [^\"]*                sjsstring2    tjsstring
sjsstring2  \"                    sjsnormal     tjsstring
sjsstring2  \"\"                  sjsstring2    tjsstring
sjsstring2   \\\\                 sjsstring2    tjsstring
sjsstring2   \\\"                 sjsstring2    tjsstring
sjsstring2   \\[^\\]              sjsstring2    tjsstring
sjsstring2   $                    sjsnormal     tjsstring

//comments
sjsnormal   //                      sjscomment1  tjscomment
sjscomment1 [^\-^<]*                sjscomment1  tjscomment
sjscomment1 [\-]*[^>]               sjscomment1  tjscomment
sjscomment1 [\-]*>                  sjsnormal    tjscomment
sjscomment1 $                       sjsnormal    tjscomment
sjscomment1 </script>               snormal     thtmlscript
sjscomment1 <^[/script>]            sjscomment1  tjscomment

sjsnormal   /\*                     sjscomment2  tjscomment
sjscomment2 [^\*]*                  sjscomment2  tjscomment
sjscomment2 \*[^/]                  sjscomment2  tjscomment
sjscomment2 [\*]*/                  sjsnormal    tjscomment
