--- parser3/src/main/compile.y 2001/09/18 16:05:42 1.166 +++ parser3/src/main/compile.y 2002/01/25 13:48:55 1.175 @@ -1,12 +1,12 @@ +%{ /** @file Parser: compiler(lexical parser and grammar). Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + + $Id: compile.y,v 1.175 2002/01/25 13:48:55 paf Exp $ */ -%{ -static char *RCSId="$Id: compile.y,v 1.166 2001/09/18 16:05:42 parser Exp $"; /** @todo parser4: @@ -59,6 +59,7 @@ static int yylex(YYSTYPE *lvalp, void *p %token BAD_STRING_COMPARISON_OPERATOR %token BAD_HEX_LITERAL +%token BAD_METHOD_DECL_START %token LAND "&&" %token LOR "||" @@ -99,7 +100,7 @@ static int yylex(YYSTYPE *lvalp, void *p /* numerical */ %left '-' '+' -%left '*' '/' '%' +%left '*' '/' '%' '\\' %left NEG /* negation: unary - */ %% @@ -500,11 +501,12 @@ expr: | expr '*' expr { $$=$1; P($$, $3); O($$, OP_MUL) } | expr '/' expr { $$=$1; P($$, $3); O($$, OP_DIV) } | expr '%' expr { $$=$1; P($$, $3); O($$, OP_MOD) } +| expr '\\' expr { $$=$1; P($$, $3); O($$, OP_INTDIV) } | expr '&' expr { $$=$1; P($$, $3); O($$, OP_BIN_AND) } | expr '|' expr { $$=$1; P($$, $3); O($$, OP_BIN_OR) } | expr '#' expr { $$=$1; P($$, $3); O($$, OP_BIN_XOR) } -| expr "&&" expr { $$=$1; P($$, $3); O($$, OP_LOG_AND) } -| expr "||" expr { $$=$1; P($$, $3); O($$, OP_LOG_OR) } +| expr "&&" expr { $$=$1; PNC($$, $3); O($$, OP_LOG_AND) } +| expr "||" expr { $$=$1; PNC($$, $3); O($$, OP_LOG_OR) } | expr "##" expr { $$=$1; P($$, $3); O($$, OP_LOG_XOR) } | expr '<' expr { $$=$1; P($$, $3); O($$, OP_NUM_LT) } | expr '>' expr { $$=$1; P($$, $3); O($$, OP_NUM_GT) } @@ -584,14 +586,39 @@ static int yylex(YYSTYPE *lvalp, void *p } else PC.col++; - if(c=='^' && PC.ls!=LS_COMMENT && PC.ls!=LS_DEF_COMMENT) + if(c=='@' && PC.col==0+1) { + if(PC.ls==LS_DEF_SPECIAL_BODY) { + // @SPECIAL + // ... + // @APPEND_CLEAN(begin, end-begin, PC.file, begin_line); @@ -639,6 +666,8 @@ static int yylex(YYSTYPE *lvalp, void *p } break; } + break; + } // #comment start skipping if(c=='#' && PC.col==1) { if(end!=begin) { @@ -647,6 +676,7 @@ static int yylex(YYSTYPE *lvalp, void *p } // fall into COMMENT lexical state [wait for \n] push_LS(PC, LS_COMMENT); + continue; } switch(PC.ls) { @@ -669,12 +699,6 @@ static int yylex(YYSTYPE *lvalp, void *p case '^': push_LS(PC, LS_METHOD_NAME); RC; - case '@': - if(PC.col==0+1) { - push_LS(PC, LS_DEF_NAME); - RC; - } - break; case ']': if(PC.ls==LS_NAME_SQUARE_PART) if(--lexical_brackets_nestage==0) {// $name.[co<]?>de<]?> @@ -770,19 +794,8 @@ static int yylex(YYSTYPE *lvalp, void *p break; case LS_DEF_SPECIAL_BODY: - // @todo in case - // ################ - // @next-method - // we are here with c=='@' - // which is wrong, and need action - if(c=='\n') { - switch(*PC.source) { - case '@': case 0: // end of special_code - pop_LS(PC); - break; - } + if(c=='\n') RC; - } break; // (EXPRESSION) @@ -820,7 +833,7 @@ static int yylex(YYSTYPE *lvalp, void *p goto break2; } goto break2; - case '+': case '*': case '/': case '%': + case '+': case '*': case '/': case '%': case '\\': case '~': case ';': RC; @@ -1080,6 +1093,8 @@ static int yylex(YYSTYPE *lvalp, void *p case '.': // name part delim case '$': // name part subvar case ':': // ':name' or 'class:name' + case '^': // ^abc^xxx wrong. bailing out + case ']': case '}': case ')': // ^abc]}) wrong. bailing out RC; } break;