--- parser3/src/main/compile.y 2001/03/12 21:54:20 1.93 +++ parser3/src/main/compile.y 2001/03/14 08:50:03 1.98 @@ -3,7 +3,7 @@ Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - $Id: compile.y,v 1.93 2001/03/12 21:54:20 paf Exp $ + $Id: compile.y,v 1.98 2001/03/14 08:50:03 paf Exp $ */ /* @@ -35,10 +35,10 @@ #include "pa_request.h" #include "pa_vobject.h" #include "pa_vdouble.h" -#include "core.h" +#include "pa_globals.h" #define SELF_ELEMENT_NAME "self" -#define USE_CONTROL_METHOD_NAME "use" +#define USE_CONTROL_METHOD_NAME "USE" int real_yyerror(parse_control *pc, char *s); static void yyprint(FILE *file, int type, YYSTYPE value); @@ -79,8 +79,10 @@ int yylex(YYSTYPE *lvalp, void *pc); %token DEF "def" %token IN "in" %token FEXISTS "-f" +%token IS "is" /* logical */ +%left "is" %left "lt" "gt" "le" "ge" %left "eq" "ne" %left '<' '>' "<=" ">=" "##" @@ -143,7 +145,6 @@ control_method: '@' STRING '\n' // defaulting base. may change with @BASE PC->cclass->set_base(PC->request->root_class); // append to request's classes - PC->request->classes_array()+=PC->cclass; PC->request->classes().put(*name, PC->cclass); } else { strcpy(PC->error, "@"CLASS_NAME" must contain sole name"); @@ -350,10 +351,7 @@ store_param: ; store_square_param: '[' store_code_param_parts ']' {$$=$2}; store_round_param: '(' store_expr_param_parts ')' {$$=$2}; -store_curly_param: '{' maybe_codes '}' { - $$=N(POOL); - PCA($$, $2); -}; +store_curly_param: '{' store_curly_param_parts '}' {$$=$2}; store_code_param_parts: store_code_param_part | store_code_param_parts ';' store_code_param_part { $$=$1; P($$, $3) } @@ -362,6 +360,10 @@ store_expr_param_parts: store_expr_param_part | store_expr_param_parts ';' store_expr_param_part { $$=$1; P($$, $3) } ; +store_curly_param_parts: + store_curly_param_part +| store_curly_param_parts ';' store_curly_param_part { $$=$1; P($$, $3) } +; store_code_param_part: empty /* optimized [] case */ | STRING { /* optimized [STRING] case */ @@ -377,6 +379,10 @@ store_expr_param_part: write_expr_value $$=N(POOL); PCA($$, $1); }; +store_curly_param_part: maybe_codes { + $$=N(POOL); + PCA($$, $1); +}; write_expr_value: expr_value { $$=$1; O($$, OP_WRITE); @@ -493,6 +499,7 @@ expr: | expr "ge" expr { $$=$1; P($$, $3); O($$, OP_STR_GE) } | expr "eq" expr { $$=$1; P($$, $3); O($$, OP_STR_EQ) } | expr "ne" expr { $$=$1; P($$, $3); O($$, OP_STR_NE) } +| expr "is" expr { $$=$1; P($$, $3); O($$, OP_IS) } ; string_inside_quotes_value: maybe_codes { @@ -742,10 +749,19 @@ int yylex(YYSTYPE *lvalp, void *pc) { break; case 'i': if(end==begin) // right after whitespace - if(PC->source[0]=='n') { // in - skip_analized=1; - result=IN; - goto break2; + switch(PC->source[0]) { + case 'n': + { // in + skip_analized=1; + result=IN; + goto break2; + } + case 's': + { // is + skip_analized=1; + result=IS; + goto break2; + } } break; case 'd': @@ -926,6 +942,8 @@ int yylex(YYSTYPE *lvalp, void *pc) { case '^': push_LS(PC, LS_METHOD_NAME); RC; + case ';': // param delim + RC; case '}': if(--lexical_brackets_nestage==0) { PC->ls=LS_METHOD_AFTER;