--- parser3/src/main/compile.y 2015/04/06 22:27:26 1.269 +++ parser3/src/main/compile.y 2015/10/21 21:45:25 1.273 @@ -8,7 +8,7 @@ */ -volatile const char * IDENT_COMPILE_Y = "$Id: compile.y,v 1.269 2015/04/06 22:27:26 moko Exp $"; +volatile const char * IDENT_COMPILE_Y = "$Id: compile.y,v 1.273 2015/10/21 21:45:25 moko Exp $"; /** @todo parser4: @@ -22,11 +22,9 @@ volatile const char * IDENT_COMPILE_Y = */ #define YYSTYPE ArrayOperation* -#define YYPARSE_PARAM pc -#define YYLEX_PARAM pc #define YYDEBUG 1 -#define YYERROR_VERBOSE 1 -#define yyerror(msg) real_yyerror((Parse_control *)pc, msg) +#define YYERROR_VERBOSE 1 +#define yyerror(pc, msg) real_yyerror(pc, msg) #define YYPRINT(file, type, value) yyprint(file, type, value) #define YYMALLOC pa_malloc #define YYFREE pa_free @@ -61,7 +59,7 @@ static const VString vempty; // local convinient inplace typecast & var #undef PC -#define PC (*(Parse_control *)pc) +#define PC (*pc) #undef POOL #define POOL (*PC.pool) #ifndef DOXYGEN @@ -74,7 +72,9 @@ static const VString vempty; %} -%pure_parser +%pure-parser +%lex-param {Parse_control* pc} +%parse-param {Parse_control* pc} %token EON %token STRING @@ -179,8 +179,10 @@ control_method: '@' STRING '\n' } } else if(command==USE_CONTROL_METHOD_NAME) { CLASS_ADD; - for(size_t i=0; icount(); i+=OPERATIONS_PER_OPVALUE) - PC.request.use_file(PC.request.main_class, LA2S(*strings_code, i)->trim(String::TRIM_END), PC.request.get_used_filename(PC.file_no)); + for(size_t i=0; icount(); i+=OPERATIONS_PER_OPVALUE){ + PC.request.use_file(PC.request.main_class, LA2S(*strings_code, i)->trim(String::TRIM_END), + PC.request.get_used_filename(PC.file_no), strings_code->get(i+1).origin); + } } else if(command==BASE_NAME) { if(PC.append){ strcpy(PC.error, "can't set base while appending methods to class '"); @@ -586,7 +588,11 @@ call_value: '^' { && (*var_code)[0].code==OP::OP_VALUE__GET_CLASS && (*var_code)[3].code==OP::OP_PREPARE_TO_CONSTRUCT_OBJECT && (*var_code)[4].code==OP::OP_VALUE +#ifdef FEATURE_GET_ELEMENT4CALL + && (*var_code)[7].code==OP::OP_GET_ELEMENT4CALL +#else && (*var_code)[7].code==OP::OP_GET_ELEMENT +#endif ){ $$=N(); O(*$$, OP::OP_CONSTRUCT_OBJECT); @@ -601,7 +607,21 @@ call_value: '^' { } }; -call_name: name_without_curly_rdive; +call_name: name_without_curly_rdive { +#ifdef FEATURE_GET_ELEMENT4CALL + size_t count=$1->count(); + if(count){ + $$=$1; +#ifdef OPTIMIZE_BYTECODE_GET_OBJECT_ELEMENT + !(count==5 && change_first(*$$, OP::OP_GET_OBJECT_ELEMENT, OP::OP_GET_OBJECT_ELEMENT4CALL)) && +#endif +#ifdef OPTIMIZE_BYTECODE_GET_OBJECT_VAR_ELEMENT + !(count==5 && change_first(*$$, OP::OP_GET_OBJECT_VAR_ELEMENT, OP::OP_GET_OBJECT_VAR_ELEMENT4CALL)) && +#endif + !change(*$$, count-1, OP::OP_GET_ELEMENT, OP::OP_GET_ELEMENT4CALL); + } +#endif +}; store_params: store_param | store_params store_param { $$=$1; P(*$$, *$2); }; store_param: @@ -1073,8 +1093,8 @@ default: case '"': case '\'': if( - pc.ls == LS_EXPRESSION_STRING_QUOTED && c=='"' || - pc.ls == LS_EXPRESSION_STRING_APOSTROFED && c=='\'') { + (pc.ls == LS_EXPRESSION_STRING_QUOTED && c=='"') || + (pc.ls == LS_EXPRESSION_STRING_APOSTROFED && c=='\'') ) { pop_LS(pc); //"abc". | 'abc'. RC; } @@ -1147,11 +1167,12 @@ default: case LS_METHOD_ROUND: switch(c) { case ')': - if(--lexical_brackets_nestage==0) + if(--lexical_brackets_nestage==0) { if(pc.ls==LS_METHOD_ROUND) // method round param ended pc.ls=LS_METHOD_AFTER; // look for method end else // pc.ls==LS_VAR_ROUND // variable constructor ended pop_LS(pc); // return to normal life + } RC; case '#': // comment start skipping if(end!=begin) {