%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,}?/("{{") { this.popState(); 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'; } "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'; }