/*
 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.oracle.graal.compiler.match;

import java.lang.annotation.*;

import com.oracle.graal.nodes.*;

/**
 * This annotation declares a textual pattern for matching an HIR DAG. It's an s-expression with a
 * node followed by its inputs. Node types are always uppercase and lowercase words are the names of
 * nodes.
 *
 * <pre>
 *   NAME := [a-z][a-zA-Z0-9]*
 *   NODETYPE := [A-Z][a-zA-Z0-9]*
 *   NODEORNAME :=  NODE [ = NAME ] | NAME
 *   EXPRESSION := ( NODEORNAME [ EXPRESSION | NODEORNAME [ EXPRESSION | NODEORNAME ] )
 * </pre>
 *
 * All matched nodes except the root of the match and {@link ConstantNode}s must have a single user.
 * All matched nodes must be in the same block.
 */

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Repeatable(value = MatchRules.class)
public @interface MatchRule {
    String value();
}

@@ -1226,71 +1226,118 @@
 HIR 
-DAG. It's an s-expression with a%0A * node followed by its inputs
+tree. The format is a LISP style%0A * s-expression with node types and/or names that are matched against the HIR
 . No
@@ -1355,16 +1355,19 @@
 e always
+%0A *
  upperca
@@ -1377,72 +1377,204 @@
 and 
-lowercase words are the names of%0A * nodes.%0A *%0A * %3Cpre%3E%0A *   NAME
+the names of nodes are always lowercase. Named nodes can be used to match trees%0A * where a node is used multiple times but only as an input to the full match.%0A *%0A * %3Cpre%3E%0A *   &lt;node-name&gt;   
  := 
@@ -1600,16 +1600,28 @@
 *   
-NODETYPE
+&lt;node-type&gt;   
  := 
@@ -1647,133 +1647,286 @@
 *   
-NODEORNAME :=  NODE %5B = NAME %5D %7C NAME%0A *   EXPRESSION := ( NODEORNAME %5B EXPRESSION %7C NODEORNAME %5B EXPRESSION %7C NODEORNAME %5D )
+&lt;node-spec&gt;    := &lt;node-type&gt; %7B '=' &lt;node-name&gt; %7D%0A *   &lt;node-or-name&gt; := &lt;node-spec&gt; %7C &lt;node-name&gt;%0A *   &lt;argument&gt;     := &lt;node-or-name&gt; %7C &lt;match-rule&gt;%0A *   &lt;match-rule&gt;   := '(' &lt;node-spec&gt; &lt;argument&gt;+ ')'
 %0A * 

update description of the MatchRule syntax