2019-01-24 13:57:54 +00:00
/ * *
* Created by Aleksey Chichenkov < a . chichenkov @ initi . ru > on 1 / 23 / 19.
* /
var js _beautify = require ( "js-beautify" ) ;
2019-01-25 13:30:02 +00:00
var args = require ( "args-parser" ) ( process . argv ) ;
2019-01-24 13:57:54 +00:00
var fs = require ( "fs" ) ;
var exec = require ( 'child_process' ) . exec ;
exec ( "re2c -i lexer.l" , function ( err , stdout , stderr ) {
err && console . log ( "ERROR: " , err ) ;
err && process . exit ( 1 ) ;
post _process _lexer ( stdout ) ;
} ) ;
var post _process _lexer = function ( _string ) {
2019-01-24 15:10:15 +00:00
// insert last case for string detect
2019-01-25 11:25:21 +00:00
_string = _string . replace ( /\}\nENDER}/gm , "yy100000000: { this._searchString(); this._set_next(); return; }}}" ) ;
2019-01-24 15:10:15 +00:00
2019-01-24 13:57:54 +00:00
_string = _string . replace ( /^.*(_r2c_var_.*;|unsigned int yyaccept = 0;)\n/gm , "" ) ; // replace var yych;
2019-01-25 11:25:21 +00:00
_string = _string . replace ( /(yych = \*this._yy_cursor);\n/gm , "\tcase 1:\n yych = this._string[this._yy_cursor];\n" ) ; // insert "case 1:" before;
_string = _string . replace ( /\*(.*?);/gm , "this._string[$1];" ) ; // замена разыменовываний
2019-01-24 13:57:54 +00:00
_string = _string . replace ( /^yy(\d*?):/gm , "case $1:" ) ; // replace goto marker onto case
_string = _string . replace ( /\) goto yy(\d*?);/gm , ") { id = $1; break; }" ) ; // replace goto inside if
_string = _string . replace ( /goto yy(\d*?);/gm , "id = $1; break;" ) ; // replace goto outside if
_string = _string . replace ( /\{ (addLexeme.*break;) \}/gm , "$1" ) ; // replace addLexeme
_string = _string . replace ( /\{ (unknownSymbol.*break;) \}/gm , "$1" ) ; // replace unknownSymbol
_string = _string . replace ( /0x00/gm , 'undefined' ) ; // replace 0x00
// black magic
2019-01-25 11:25:21 +00:00
_string = _string . replace ( /(switch \(yych\) \{[\s\S]*?})/gm , "(function(){$1}.bind(this))(); break;" ) ; // добавим замыкание что бы обработать свиче в свиче
_string = _string . replace ( /switch\((id)\)/gm , "switch(this._state)" ) ; // replace id to this._state
_string = _string . replace ( /id = (\d.*?);/gm , "this._state = $1;" ) ; // replace id = n to this._state = n
_string = _string . replace ( /yyaccept/gm , "this._yy_accept" ) ; // replace yyaccept to this._yy_accept
_string = _string . replace ( /yych/gm , "this._yy_char" ) ; // replace yych to this._yy_char
2019-01-24 13:57:54 +00:00
2019-01-25 13:30:02 +00:00
if ( args [ "t" ] !== undefined ) {
switch ( args [ "t" ] ) {
case "web" :
2019-01-28 15:36:41 +00:00
_string = "(function(){\n" + _string + "return Lexer; \n})()" ;
2019-01-25 13:30:02 +00:00
break ;
case "node" :
_string += "\n module.exports = Lexer" ;
break ;
}
}
var output = args [ "o" ] || "lexer.js" ;
2019-01-24 13:57:54 +00:00
2019-01-25 13:30:02 +00:00
if ( ! ( args [ "no-beautify" ] || args [ "nb" ] ) ) {
_string = js _beautify ( _string , { indent _size : 4 , space _in _empty _paren : true } ) ;
2019-01-25 12:15:41 +00:00
}
fs . writeFileSync ( output , _string ) ;
2019-01-24 13:57:54 +00:00
} ;