ovidiu 02/03/11 08:19:50 Modified: src/scratchpad/schecoon/src/org/apache/cocoon/flow flow.g Log: Updated. Revision Changes Path 1.6 +155 -122 xml-cocoon2/src/scratchpad/schecoon/src/org/apache/cocoon/flow/flow.g Index: flow.g =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/schecoon/src/org/apache/cocoon/flow/flow.g,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- flow.g 7 Mar 2002 02:12:08 -0000 1.5 +++ flow.g 11 Mar 2002 16:19:50 -0000 1.6 @@ -10,22 +10,33 @@ options { k = 1; + exportVocab=jWeave; // Call its vocabulary "jWeave" + buildAST = true; // uses CommonAST by default + codeGenMakeSwitchThreshold = 2; // Some optimizations + codeGenBitsetTestThreshold = 3; } tokens { - DOT; + DOT; MTHINVOKE; FUNCALL; ARRAYIDX; SEQ; RETURN; ARRAY; DICT; FUNCTION; + PARAMS; VARARGS; } -exprs - : (expr)? SEMI exprs +program + : exprs EOF! + ; + +exprs! + : ( e:expr (SEMI!)+ + {#exprs = #([SEQ], #exprs, #e);} + )+ ; expr - : assignment // Simple expressions - | block // A sequence of expressions - | function // Function declaration - | varDecl // Variable declaration - | "if" LPAREN expr RPAREN expr + : assignment + | block // A sequence of expressions + | varDecl // Variable declaration + | function // Function declaration + | "if"^ LPAREN! expr RPAREN! expr ( // CONFLICT: the old "dangling-else" problem... // ANTLR generates proper code matching @@ -35,8 +46,12 @@ }: "else" expr )? - | "return" expr - | "try" expr + + // The following expressions should be rewritten using macros, + // when they become available + |! "return"^ return:expr + {#expr = #([RETURN], return); } + | "try"^ expr ( // CONFLICT: Similar with the dangling else options { @@ -44,130 +59,135 @@ }: handler )+ - | "throw" expr - - // The following expressions should be rewritten using macros, - // when they become available - | "import" identifierStar - | "while" LPAREN expr RPAREN expr - | "switch" LPAREN expr RPAREN casesGroup - | "for" LPAREN exprList SEMI exprList SEMI exprList RPAREN expr - | "foreach" LPAREN IDENT "in" expr RPAREN expr - | "do" expr "while" LPAREN expr RPAREN + | "throw"^ expr + | "import"^ identifierStar + | "while"^ LPAREN! expr RPAREN! expr + | "switch"^ LPAREN! expr RPAREN! casesGroup + | "for"^ LPAREN! exprList SEMI! exprList SEMI! exprList RPAREN! expr + | "foreach"^ LPAREN! IDENT "in" expr RPAREN! expr + | "do"^ expr "while" LPAREN! expr RPAREN! ; exprList - : expr + : assignment ( // CONFLICT: Similar with the dangling else options { warnWhenFollowAmbig = false; }: - COMMA expr + COMMA! assignment )* ; // A function is either named or unnamed. A named function is // // equivalent to a variable declaration whose value is an unnamed // function. -function - : "function" (IDENT)? parameters block +function! + : "function"^ (n:IDENT)? p:parameters b:block + {#function = #([FUNCTION, "function"], n, #([PARAMS], p), b);} + ; + +parameters! + : LPAREN! + (funParam (COMMA! funParam)*)? + (v:"*args" {#parameters.addChild(#[VARARGS, "*args"]);})? + RPAREN! ; -parameters - : LPAREN (IDENT)* RPAREN +funParam + : IDENT (ASSIGN^ (IDENT|constant))? ; // A sequence of expressions. The value of the block is the value of // the last expression evaluated inside the block. block - : LCURLY exprs RCURLY + : LCURLY! exprs RCURLY! ; // Variable declaration varDecl - : "var" exprList + : "var"^ exprList ; casesGroup - : ( // CONFLICT: to which case group do the statements bind? - // ANTLR generates proper code: it groups the - // many "case"/"default" labels together then - // follows them with the statements - options { - warnWhenFollowAmbig = false; - } - : - aCase - )+ - caseSList - ; + : ( // CONFLICT: to which case group do the exprs bind? + // ANTLR generates proper code: it groups the + // many "case"/"default" labels together then + // follows them with the exprs + options { + warnWhenFollowAmbig = false; + } + : + aCase + )+ + caseSList + ; aCase - : ("case" expr | "default") COLON - ; + : ("case" expr | "default") COLON! + ; caseSList - : exprs - ; + : exprs + ; // Handler for a try expression handler - : "catch" LPAREN expr IDENT RPAREN expr + : "catch" LPAREN! expr IDENT RPAREN! expr | "finally" expr ; identifierStar : IDENT - (DOT (IDENT|STAR))* + (DOT! (IDENT|STAR))* ; assignment : logicalOr - ( ( ASSIGN - | PLUS_ASSIGN - | MINUS_ASSIGN - | STAR_ASSIGN - | DIV_ASSIGN - | MOD_ASSIGN - | BAND_ASSIGN - | BXOR_ASSIGN - | BOR_ASSIGN + ( ( ASSIGN^ + | PLUS_ASSIGN^ + | MINUS_ASSIGN^ + | STAR_ASSIGN^ + | DIV_ASSIGN^ + | MOD_ASSIGN^ + | BAND_ASSIGN^ + | BXOR_ASSIGN^ + | BOR_ASSIGN^ ) assignment )? ; logicalOr - : logicalAnd (LOR logicalAnd)* + : logicalAnd (LOR^ logicalAnd)* ; logicalAnd - : inclusiveOr (LAND inclusiveOr)* + : inclusiveOr (LAND^ inclusiveOr)* ; inclusiveOr - : exclusiveOr (BOR exclusiveOr)* + : exclusiveOr (BOR^ exclusiveOr)* ; exclusiveOr - : and (BXOR and)* + : and (BXOR^ and)* ; and - : equality (BAND equality)* + : equality (BAND^ equality)* ; equality - : relational ((NOT_EQUAL | EQUAL) relational)* + : relational ((NOT_EQUAL^ | EQUAL^) relational)* ; relational : additive - ( ( ( LT - | GT - | LE - | GE + ( ( ( LT^ + | GT^ + | LE^ + | GE^ ) additive )* @@ -175,24 +195,25 @@ ; additive - : multiplicative ((PLUS | MINUS) multiplicative)* + : multiplicative ((PLUS^ | MINUS^) multiplicative)* ; multiplicative - : unary ((STAR | DIV | MOD) unary)* + : unary ((STAR^ | DIV^ | MOD^) unary)* ; unary - : INC unary - | DEC unary - | MINUS unary - | PLUS unary + : INC^ unary + | DEC^ unary + | MINUS^ unary + | PLUS^ unary | unaryNotPlusMinus + | arrayOrDict ; unaryNotPlusMinus - : BNOT unary - | LNOT unary + : BNOT^ unary + | LNOT^ unary | postfix ; @@ -200,40 +221,45 @@ : primary ( // Array indexing - LBRACK assignment RBRACK + LBRACK! a:assignment RBRACK! + {#postfix = #([ARRAYIDX], a);} // Method invocation - | DOT LPAREN exprList RPAREN + | DOT! LPAREN! ma:exprList RPAREN! + {#postfix = #([MTHINVOKE], ma);} // Function invocation - | LPAREN exprList RPAREN + | LPAREN! fa:exprList RPAREN! + {#postfix = #([FUNCALL], fa);} )* ; primary : IDENT | constant - | arrayOrDict - | "true" - | "false" - | "null" - | LPAREN assignment RPAREN + | LPAREN! assignment RPAREN! ; constant : NUMBER | CHAR_LITERAL | STRING_LITERAL + | "true" + | "false" + | "null" ; // An array or a dictionary: // [a, b, c] -> array // [a: 1, b: 2, c: 3] -> dictionary // Use a syntactic predicate to disambiguate on ':' -arrayOrDict - : (LBRACK expr COLON)=> - LBRACK expr COLON expr (COMMA expr COLON expr)* RBRACK - | LBRACK exprList RBRACK +arrayOrDict! + : (LBRACK! expr COLON!)=> + LBRACK! key:expr COLON! value:expr + (COMMA! keys:expr COLON! values:expr)* RBRACK! + {#arrayOrDict = #([DICT, "dict"], key, value, ([DICT], keys, values));} + | LBRACK! elems:exprList RBRACK! + {#arrayOrDict = #([ARRAY, "array"], elems);} ; @@ -242,56 +268,62 @@ options { k = 2; + exportVocab=jWeave; // Call its vocabulary "jWeave" testLiterals=false; // don't automatically test for literals } -QUESTION : '?' ; -LPAREN : '(' ; -RPAREN : ')' ; -LBRACK : '[' ; -RBRACK : ']' ; -LCURLY : '{' ; -RCURLY : '}' ; -COLON : ':' ; -COMMA : ',' ; -ASSIGN : '=' ; +QUESTION : '?' ; +LPAREN : '(' ; +RPAREN : ')' ; +LBRACK : '[' ; +RBRACK : ']' ; +LCURLY : '{' ; +RCURLY : '}' ; +COLON : ':' ; +COMMA : ',' ; +ASSIGN : '=' ; EQUAL : "==" ; -LNOT : '!' ; -BNOT : '~' ; +LNOT : '!' ; +BNOT : '~' ; NOT_EQUAL : "!=" ; -DIV : '/' ; +DIV : '/' ; DIV_ASSIGN : "/=" ; -PLUS : '+' ; +PLUS : '+' ; PLUS_ASSIGN : "+=" ; -INC : "++" ; -MINUS : '-' ; -MINUS_ASSIGN : "-=" ; -DEC : "--" ; -STAR : '*' ; +INC : "++" ; +MINUS : '-' ; +MINUS_ASSIGN : "-=" ; +DEC : "--" ; +STAR : '*' ; STAR_ASSIGN : "*=" ; -MOD : '%' ; +MOD : '%' ; MOD_ASSIGN : "%=" ; -GE : ">=" ; -GT : ">" ; -LE : "<=" ; -LT : '<' ; -BXOR : '^' ; +GE : ">=" ; +GT : ">" ; +LE : "<=" ; +LT : '<' ; +BXOR : '^' ; BXOR_ASSIGN : "^=" ; -BOR : '|' ; +BOR : '|' ; BOR_ASSIGN : "|=" ; -LOR : "||" ; -BAND : '&' ; +LOR : "||" ; +BAND : '&' ; BAND_ASSIGN : "&=" ; LAND : "&&" ; -SEMI : ';' ; +SEMI : ';' ; protected -PANYS : ('a'..'z'|'A'..'Z'|'@'|'#'|'$'|'_'|'?'); +PANY : ('a'..'z'|'A'..'Z'|'_'); protected -ANY : (PANYS|COLON|'0'..'9'|'!'); +SPECIAL : ('@'|'#'|'$'); -IDENT : PANYS (ANY)* PANYS; +protected +ANY : (PANY|COLON|'0'..'9'); + +IDENT + options {testLiterals=true;} + : (PANY (ANY)*) | (SPECIAL (ANY)+); // // The following are stolen from java.g in the ANTLR distribution. @@ -299,14 +331,15 @@ WS : ( ' ' | '\t' | '\f' - // handle newlines - | ( "\r\n" // Evil DOS + // handle newlines + | ( options {generateAmbigWarnings=false;} + : "\r\n" // Evil DOS | '\r' // Macintosh | '\n' // Unix (the right way) ) { newline(); } - ) - { $setType(Token.SKIP); } + )+ + { _ttype = Token.SKIP;} ; // Single-line comments @@ -412,7 +445,7 @@ // a numeric literal -NUM_INT +NUMBER {boolean isDecimal=false;} : '.' {_ttype = DOT;} (('0'..'9')+ (EXPONENT)? (FLOAT_SUFFIX)? { _ttype = NUMBER; })?
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]