ovidiu      02/03/01 18:01:17

  Modified:    src/scratchpad/schecoon/src/org/apache/cocoon/flow flow.g
  Log:
  Updated. Added support for most Java-like statements, arrays and dictionaries.
  
  Revision  Changes    Path
  1.2       +105 -20   
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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- flow.g    28 Feb 2002 01:51:16 -0000      1.1
  +++ flow.g    2 Mar 2002 02:01:17 -0000       1.2
  @@ -9,19 +9,56 @@
   class FlowParser extends Parser;
   
   options {
  -    k = 2;
  +    k = 1;
  +}
  +
  +tokens {
  +    DOT;
   }
   
   exprs
  -    :   SEMI exprs
  -    |   expr
  +    :   (expr)? SEMI exprs
       ;
   
   expr
  -    :   assignment
  -    |   function
  +    :   elem        // Elementary expression
  +    |   function    // Function declaration
  +    |   varDecl     // Variable declaration
  +    |   "if" LPAREN elem RPAREN expr
  +        (
  +                     // CONFLICT: the old "dangling-else" problem...
  +                     //           ANTLR generates proper code matching
  +                     //                       as soon as possible.  Hush warning.
  +            options {
  +                warnWhenFollowAmbig = false;
  +            }
  +        :   "else" elem
  +        )?
  +    |   "return" (elem|function)?
  +    |   "try" elem (handler)+
  +    |   "throw" elem
  +
  +        // The following expressions should be rewritten using macros,
  +        // when they become available
  +    |   "while" LPAREN elem RPAREN expr
  +    |   "switch" LPAREN elem RPAREN casesGroup
  +    |   "for" LPAREN (varDecl|elemList) SEMI elemList SEMI elemList RPAREN expr
  +    |   "foreach" LPAREN IDENT "in" elem RPAREN expr
  +    |   "do" elem "while" LPAREN elem RPAREN
  +    ;
  +
  +elem
  +    :   assignment  // Simple expressions
  +    |   block       // A sequence of expressions
       ;
   
  +elemList
  +    :   elem (COMMA elem)*
  +    ;
  +
  +// 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
       ;
  @@ -30,12 +67,48 @@
       :   LPAREN (IDENT)* RPAREN
       ;
   
  +// A sequence of expressions. The value of the block is the value of
  +// the last expression evaluated inside the block.
   block
       :   LCURLY exprs RCURLY
       ;
   
  +// Variable declaration
  +varDecl
  +    :   "var" assignment (COMMA assignment)*
  +    ;
  +
  +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
  +             {#casesGroup = #([CASE_GROUP, "CASE_GROUP"], #casesGroup);}
  +     ;
  +
  +aCase
  +     :       ("case" elem | "default") COLON
  +     ;
  +
  +caseSList
  +     :       exprs
  +     ;
  +
  +// Handler for a try expression
  +handler
  +    :   "catch" LPAREN IDENT IDENT RPAREN block
  +    |   "finally" block
  +    ;
  +
   assignment
  -    :   conditional
  +    :   logicalOr
           (   (   ASSIGN
               |   PLUS_ASSIGN
               |   MINUS_ASSIGN
  @@ -50,11 +123,6 @@
           )?
       ;
   
  -conditional
  -    :   logicalOr
  -        (QUESTION assignment COLON conditional)?
  -    ;
  -
   logicalOr
       :   logicalAnd (LOR logicalAnd)*
       ;
  @@ -88,7 +156,6 @@
                   )
                   additive
               )*
  -        |   "instanceof" typespec
           )
       ;
   
  @@ -116,27 +183,46 @@
   
   postfix
       :   primary
  +        (
  +            // Array indexing
  +            LBRACK assignment RBRACK
  +
  +            // Method invocation
  +        |   DOT LPAREN elemList RPAREN
  +
  +            // Function invocation
  +        |   LPAREN elemList RPAREN
  +        )*
  +    ;
  +
  +primary
  +    :   IDENT
       |   constant
  +    |   arrayOrDict
       |   "true"
       |   "false"
       |   "null"
       |   LPAREN assignment RPAREN
       ;
   
  -primary
  -    :   IDENT
  -    ;
  -
   constant
       :   NUMBER
       |   CHAR_LITERAL
       |   STRING_LITERAL
       ;
   
  -typespec
  -    :   IDENT
  +// 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 elem COLON)=>
  +        LBRACK elem COLON elem (COMMA elem COLON elem)* RBRACK
  +    |   LBRACK elemList RBRACK
       ;
   
  +
  +
   class FlowLexer extends Lexer;
   
   options {
  @@ -188,14 +274,13 @@
   PANYS   :   ('a'..'z'|'A'..'Z'|'@'|'#'|'$'|'_'|'?');
   
   protected
  -ANY     :   (PANYS|PLUS|MINUS|COLON|SEMI|DIV|'0'..'9'|'.'|'"'|'\''|'='|'*'|'!');
  +ANY     :   (PANYS|COLON|'0'..'9'|'!');
   
   IDENT   :   PANYS (ANY)* PANYS;
   
   //
   // The following are stolen from java.g in the ANTLR distribution.
   //
  -
   WS  :   (   ' '
           |   '\t'
           |   '\f'
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to