group Dbg;

/*
 [The "BSD license"]
 Copyright (c) 2005-2009 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.
*/

@parserBody.mixins() ::= <<
include ANTLR3::<if(profile)>Profile<else>Debug<endif>::ParserEvents
>>


@parserBody.additionalMembers() ::= <<
<if(grammar.grammarIsRoot)>
RULE_NAMES = [
  :invalid_rule, <grammar.allImportedRules:{rST|:<rST.name>}; wrap="\n  ", separator=", ">
].freeze
<endif>
>>


@rule.body() ::= <<
in_rule(grammar_file_name, "<ruleName>") do
  @debug_listener.location(<ruleDescriptor.tree.line>, <ruleDescriptor.tree.column>)

  <@super.body()>

  @debug_listener.location(<ruleDescriptor.EORNode.line>, <ruleDescriptor.EORNode.column>)
end
>>


// Common debug event triggers used by region overrides below
enterSubRule() ::= <<
in_subrule(<decisionNumber>) do<\n>
>>


exitSubRule() ::= <<
end<\n>
>>


enterDecision() ::= <<
in_decision(<decisionNumber>) do<\n>
>>


exitDecision() ::= <<
end<\n>
>>


enterAlt(n) ::= <<
in_alternative(<n>)<\n>
>>


// Region overrides that tell various constructs to add debugging triggers
@block.body() ::= <<
in_subrule(<decisionNumber>) do
  <@super.body()>
end
>>


// @blockBody.predecision() ::= "<enterSubRule()>"
// @blockBody.postdecision() ::= "<exitDecision()>"
// @blockBody.postbranch() ::= "<exitSubRule()>"
@blockBody.decision() ::= <<
in_decision(<decisionNumber>) do
  <@super.decision()>
end
>>


@ruleBlock.decision() ::= <<
in_decision(<decisionNumber>) do
  <@super.decision()>
end<\n>
>>


@ruleBlockSingleAlt.prealt() ::= "<enterAlt(n={1})>"


@blockSingleAlt.prealt() ::= "<enterAlt(n={1})>"


@positiveClosureBlock.loopBody() ::= <<
in_subrule(<decisionNumber>) do
  <@super.loopBody()>
end
>>


@positiveClosureBlockLoop.decisionBody() ::= <<
in_decision(<decisionNumber>) do
  <@super.decisionBody()>
end
>>


@positiveClosureBlockLoop.earlyExitException() ::= <<
@debug_listener.recognition_exception(eee)
>>


@closureBlock.loopBody() ::= <<
in_subrule(<decisionNumber>) do
  <@super.loopBody()>
end
>>


@closureBlockLoop.decisionBody() ::= <<
in_decision(<decisionNumber>) do
  <@super.decisionBody()>
end
>>


@altSwitchCase.prealt() ::= "<enterAlt(altNum)>"  // altNum is arg of altSwitchCase


element(e) ::= <<
@debug_listener.location(<e.line>, <e.pos>) // e is arg of element
<super.element(e)>
>>


@matchSet.mismatchedSetException() ::= "@debug_listener.recognition_exception(mse)"


@dfaState.noViableAltException() ::= <<
nvae = NoViableAlternative( "<description>", <decisionNumber>, <stateNumber> )
@debug_listener.recognition_exception( nvae )
raise( nvae )<\n>
>>

@dfaStateSwitch.noViableAltException() ::= <<
nvae = NoViableAlternative( "<description>", <decisionNumber>, <stateNumber> )
@debug_listener.recognition_exception( nvae )
raise( nvae )<\n>
>>

dfaDecision(decisionNumber,description) ::= <<
begin
  @state.cyclic_decision = true
  <super.dfaDecision(...)>
rescue ANTLR3::Error::NoViableAlternative => nvae
  @debug_listener.recognition_exception(nvae)
  raise
end
>>


@cyclicDFA.errorMethod() ::= <<
def error(nvae)
  @recognizer.debug_listener.recognition_exception(nvae)
  super
end
>>
/** Force predicate validation to trigger an event */
evalPredicate(pred,description) ::= <<
predicate?("<description>") { <pred> }
>>


