/*
 [The "BSD license"]
 Copyright (c) 2010 Terence Parr
 All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:
 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
 3. The name of the author may not be used to endorse or promote products
    derived from this software without specific prior written permission.

 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/** ANTLR v3 tree grammar to walk trees created by ANTLRv3.g */
tree grammar ANTLRv3Tree;

options {
	tokenVocab = ANTLRv3;
	ASTLabelType = CommonTree;
}

@header {
package org.antlr.grammar.v3;
}

grammarDef
    :   ^( grammarType ID DOC_COMMENT? optionsSpec? tokensSpec? attrScope* action* rule+ )
    ;

grammarType
	:	LEXER_GRAMMAR
    |	PARSER_GRAMMAR
    |	TREE_GRAMMAR
    |	COMBINED_GRAMMAR
    ;

tokensSpec
	:	^(TOKENS tokenSpec+)
	;

tokenSpec
	:	^('=' TOKEN_REF STRING_LITERAL)
	|	^('=' TOKEN_REF CHAR_LITERAL)
	|	TOKEN_REF
	;

attrScope
	:	^('scope' ID ACTION)
	;

action
	:	^('@' ID ID ACTION)
	|	^('@' ID ACTION)
	;

optionsSpec
	:	^(OPTIONS option+)
	;

option
    :   qid // only allowed in element options
    |	^('=' ID optionValue)
 	;
 	
optionValue
    :   ID
    |   STRING_LITERAL
    |   CHAR_LITERAL
    |   INT
    ;

rule
	:	^( RULE ID modifier? (^(ARG ARG_ACTION))? (^(RET ARG_ACTION))?
	       throwsSpec? optionsSpec? ruleScopeSpec? ruleAction*
	       altList
	       exceptionGroup? EOR
	     )
	;

modifier
	:	'protected'|'public'|'private'|'fragment'
	;

/** Match stuff like @init {int i;} */
ruleAction
	:	^('@' ID ACTION)
	;

throwsSpec
	:	^('throws' ID+)
	;

ruleScopeSpec
	:	^('scope' ACTION)
	|	^('scope' ACTION ID+)
	|	^('scope' ID+)
	;

block
    :   ^( BLOCK optionsSpec? (alternative rewrite)+ EOB )
    ;

altList
    :   ^( BLOCK (alternative rewrite)+ EOB )
    ;

alternative
    :   ^(ALT element+ EOA)
    |   ^(ALT EPSILON EOA)
    ;

exceptionGroup
	:	exceptionHandler+ finallyClause?
	|	finallyClause
    ;

exceptionHandler
    :    ^('catch' ARG_ACTION ACTION)
    ;

finallyClause
    :    ^('finally' ACTION)
    ;

element
	:	^(('='|'+=') ID block)
	|	^(('='|'+=') ID atom)
	|	atom
	|	ebnf
	|   ACTION
	|   SEMPRED
	|	GATED_SEMPRED
	|   ^(TREE_BEGIN element+)
	;

atom:   ^(('^'|'!') atom)
	|	^(CHAR_RANGE CHAR_LITERAL CHAR_LITERAL optionsSpec?)
	|	^('~' notTerminal optionsSpec?)
	|	^('~' block optionsSpec?)
    |	^(RULE_REF ARG_ACTION)
    |	RULE_REF
    |   CHAR_LITERAL
    |   ^(CHAR_LITERAL optionsSpec)
    |	TOKEN_REF
    |	^(TOKEN_REF optionsSpec)
    |	^(TOKEN_REF ARG_ACTION optionsSpec)
    |	^(TOKEN_REF ARG_ACTION)
    |	STRING_LITERAL
    |	^(STRING_LITERAL optionsSpec)
    |	'.'
    |	^('.' optionsSpec?)
    ;

/** Matches ENBF blocks (and token sets via block rule) */
ebnf
	:	^(SYNPRED block)
	|	^(OPTIONAL block)
  	|	^(CLOSURE block)
   	|	^(POSITIVE_CLOSURE block)
	|	SYN_SEMPRED
	|	block
	;

notTerminal
	:   CHAR_LITERAL
	|	TOKEN_REF
	|	STRING_LITERAL
	;
		
// R E W R I T E  S Y N T A X

rewrite
	:	(^('->' SEMPRED rewrite_alternative))* ^('->' rewrite_alternative)
	|
	;

rewrite_alternative
	:	rewrite_template
	|	rewrite_tree_alternative
   	|   ^(ALT EPSILON EOA)
	;
	
rewrite_tree_block
    :   ^(BLOCK rewrite_tree_alternative EOB)
    ;

rewrite_tree_alternative
    :	^(ALT rewrite_tree_element+ EOA)
    ;

rewrite_tree_element
	:	rewrite_tree_atom
	|	rewrite_tree
	|   rewrite_tree_block
	|   rewrite_tree_ebnf
	;

rewrite_tree_atom
    :   CHAR_LITERAL
	|   TOKEN_REF
	|   ^(TOKEN_REF ARG_ACTION) // for imaginary nodes
    |   RULE_REF
	|   STRING_LITERAL
	|   LABEL
	|	ACTION
	;

rewrite_tree_ebnf
	:	^(OPTIONAL rewrite_tree_block)
  	|	^(CLOSURE rewrite_tree_block)
   	|	^(POSITIVE_CLOSURE rewrite_tree_block)
	;
	
rewrite_tree
	:	^(TREE_BEGIN rewrite_tree_atom rewrite_tree_element* )
	;

rewrite_template
	:   ^( TEMPLATE ID rewrite_template_args
		   (DOUBLE_QUOTE_STRING_LITERAL | DOUBLE_ANGLE_STRING_LITERAL)
		 )
	|	rewrite_template_ref
	|	rewrite_indirect_template_head
	|	ACTION
	;

/** foo(a={...}, ...) */
rewrite_template_ref
	:	^(TEMPLATE ID rewrite_template_args)
	;

/** ({expr})(a={...}, ...) */
rewrite_indirect_template_head
	:	^(TEMPLATE ACTION rewrite_template_args)
	;

rewrite_template_args
	:	^(ARGLIST rewrite_template_arg+)
	|	ARGLIST
	;

rewrite_template_arg
	:   ^(ARG ID ACTION)
	;

qid	:	ID ('.' ID)* ;
