%x mu emu %% [^\x00]*?/("<%") { if(yytext.slice(-1) !== "\\") this.begin("mu"); if(yytext.slice(-1) === "\\") yytext = yytext.substr(0,yyleng-1), this.begin("emu"); if(yytext) return 'CONTENT'; } [^\x00]+ { return 'CONTENT'; } [^\x00]{2,}?/("{{"|<>) { if(yytext.slice(-1) !== "\\") this.popState(); if(yytext.slice(-1) === "\\") yytext = yytext.substr(0,yyleng-1); return 'CONTENT'; } "{{>" { return 'OPEN_PARTIAL'; } "<%=" { return 'OPEN_BLOCK'; } "<%/" { return 'OPEN_ENDBLOCK'; } "{{^" { return 'OPEN_INVERSE'; } "<%"\s*"else" { return 'OPEN_INVERSE'; } "{<%%" { return 'OPEN_UNESCAPED'; } "{{&" { return 'OPEN_UNESCAPED'; } "<%!"[\s\S]*?"%>" { yytext = yytext.substr(3,yyleng-5); this.popState(); return 'COMMENT'; } "<%" { return 'OPEN'; } "=" { return 'EQUALS'; } "."/[%} ] { return 'ID'; } ".." { return 'ID'; } [\/.] { return 'SEP'; } \s+ { /*ignore whitespace*/ } "%%>" { this.popState(); return 'CLOSE'; } "%>" { this.popState(); return 'CLOSE'; } '"'("\\"["]|[^"])*'"' { yytext = yytext.substr(1,yyleng-2).replace(/\\"/g,'"'); return 'STRING'; } "'"("\\"[']|[^'])*"'" { yytext = yytext.substr(1,yyleng-2).replace(/\\"/g,'"'); return 'STRING'; } "@"[a-zA-Z]+ { yytext = yytext.substr(1); return 'DATA'; } "true"/[%}\s] { return 'BOOLEAN'; } "false"/[%}\s] { return 'BOOLEAN'; } [0-9]+/[%}\s] { return 'INTEGER'; } [a-zA-Z0-9_$-]+/[=%}\s\/.] { return 'ID'; } '['[^\]]*']' { yytext = yytext.substr(1, yyleng-2); return 'ID'; } . { return 'INVALID'; } <> { return 'EOF'; }