Home | History | Annotate | Download | only in Python
      1 /*
      2  [The "BSD license"]
      3  Copyright (c) 2005-2009 Terence Parr
      4  All rights reserved.
      5 
      6  Redistribution and use in source and binary forms, with or without
      7  modification, are permitted provided that the following conditions
      8  are met:
      9  1. Redistributions of source code must retain the above copyright
     10     notice, this list of conditions and the following disclaimer.
     11  2. Redistributions in binary form must reproduce the above copyright
     12     notice, this list of conditions and the following disclaimer in the
     13     documentation and/or other materials provided with the distribution.
     14  3. The name of the author may not be used to endorse or promote products
     15     derived from this software without specific prior written permission.
     16 
     17  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 */
     28 /** Template overrides to add debugging to normal Python output;
     29  *  If ASTs are built, then you'll also get ASTDbg.stg loaded.
     30  */
     31 
     32 @outputFile.imports() ::= <<
     33 <@super.imports()>
     34 from antlr3.debug import *
     35 >>
     36 
     37 @genericParser.args() ::= <<
     38 debug_socket = kwargs.pop('debug_socket', None)
     39 port = kwargs.pop('port', None)
     40 >>
     41 
     42 @genericParser.init() ::= <<
     43 self.ruleLevel = 0
     44 
     45 if self._dbg is None:
     46     <createListenerAndHandshake()>
     47 
     48 >>
     49 
     50 createListenerAndHandshake() ::= <<
     51 <if(TREE_PARSER)>
     52 proxy = DebugEventSocketProxy(self, adaptor=self.input.getTreeAdaptor(),
     53                               debug=debug_socket, port=port)<\n>
     54 <else>
     55 proxy = DebugEventSocketProxy(self, debug=debug_socket, port=port)<\n>
     56 <endif>
     57 self.setDebugListener(proxy)
     58 proxy.handshake()
     59 
     60 >>
     61 
     62 @genericParser.members() ::= <<
     63 <if(grammar.grammarIsRoot)>
     64 ruleNames = [
     65     "invalidRule", <grammar.allImportedRules:{rST | "<rST.name>"}; wrap="\n    ", separator=", ">
     66     ]<\n>
     67 <endif>
     68 decisionCanBacktrack = [
     69     False, # invalid decision
     70     <grammar.decisions:{d | <if(d.dfa.hasSynPred)>True<else>False<endif>}; wrap="\n    ", separator=", ">
     71     ]
     72 <if(grammar.grammarIsRoot)> <! grammar imports other grammar(s) !>
     73 def getRuleLevel(self):
     74     return self.ruleLevel
     75 
     76 def incRuleLevel(self):
     77     self.ruleLevel += 1
     78 
     79 def decRuleLevel(self):
     80     self.ruleLevel -= 1
     81 
     82 <if(profile)>
     83     <ctorForProfilingRootGrammar()>
     84 <else>
     85     <ctorForRootGrammar()>
     86 <endif>
     87 <ctorForPredefinedListener()>
     88 <else> <! imported grammar !>
     89 def getRuleLevel(self):
     90     return <grammar.delegators:{g| <g:delegateName()>}>.getRuleLevel()
     91 
     92 def incRuleLevel(self):
     93     <grammar.delegators:{g| <g:delegateName()>}>.incRuleLevel()
     94 
     95 def decRuleLevel(self):
     96     <grammar.delegators:{g| <g:delegateName()>}>.decRuleLevel()
     97 
     98 <ctorForDelegateGrammar()>
     99 <endif>
    100 <if(profile)>
    101 FIXME(2)
    102 public boolean alreadyParsedRule(IntStream input, int ruleIndex) {
    103     ((Profiler)self._dbg).examineRuleMemoization(input, ruleIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames[ruleIndex]);
    104     return super.alreadyParsedRule(input, ruleIndex);
    105 }<\n>
    106 FIXME(3)
    107 public void memoize(IntStream input,
    108                     int ruleIndex,
    109                     int ruleStartIndex)
    110 {
    111     ((Profiler)self._dbg).memoize(input, ruleIndex, ruleStartIndex, <grammar.composite.rootGrammar.recognizerName>.ruleNames[ruleIndex]);
    112     super.memoize(input, ruleIndex, ruleStartIndex);
    113 }<\n>
    114 <endif>
    115 def evalPredicate(self, result, predicate):
    116     self._dbg.semanticPredicate(result, predicate)
    117     return result
    118 <\n>
    119 >>
    120 
    121 ctorForRootGrammar() ::= <<
    122 <! bug: can't use <@super.members()> cut-n-paste instead !>
    123 <! Same except we add port number and profile stuff if root grammar !>
    124 <!
    125 public <name>(<inputStreamType> input) {
    126     this(input, DebugEventSocketProxy.DEFAULT_DEBUGGER_PORT, new RecognizerSharedState());
    127 }
    128 public <name>(<inputStreamType> input, int port, RecognizerSharedState state) {
    129     super(input, state);
    130     <parserCtorBody()>
    131     <createListenerAndHandshake()>
    132     <grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, self._dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
    133     <@finally()>
    134 }<\n>
    135 !>
    136 >>
    137 
    138 ctorForProfilingRootGrammar() ::= <<
    139 <! bug: can't use <@super.members()> cut-n-paste instead !>
    140 public <name>(<inputStreamType> input) {
    141     this(input, new Profiler(null), new RecognizerSharedState());
    142 }
    143 public <name>(<inputStreamType> input, DebugEventListener self.dbg, RecognizerSharedState state) {
    144     super(input, self.dbg, state);
    145     Profiler p = (Profiler)self.dbg;
    146     p.setParser(this);
    147     <parserCtorBody()>
    148     <grammar.directDelegates:
    149      {g|<g:delegateName()> = new <g.recognizerName>(input, self.dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
    150     <@finally()>
    151 }
    152 <\n>
    153 >>
    154 
    155 /** Basically we don't want to set any dbg listeners are root will have it. */
    156 ctorForDelegateGrammar() ::= <<
    157 <!
    158 public <name>(<inputStreamType> input, DebugEventListener self.dbg, RecognizerSharedState state<grammar.delegators:{g|, <g.recognizerName> <g:delegateName()>}>) {
    159     super(input, dbg, state);
    160     <parserCtorBody()>
    161     <grammar.directDelegates:
    162      {g|<g:delegateName()> = new <g.recognizerName>(input, this, this.state<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
    163 }<\n>
    164 !>
    165 >>
    166 
    167 ctorForPredefinedListener() ::= <<
    168 <!
    169 public <name>(<inputStreamType> input, DebugEventListener dbg) {
    170     <@superClassRef>super(input, dbg, new RecognizerSharedState());<@end>
    171 <if(profile)>
    172     Profiler p = (Profiler)dbg;
    173     p.setParser(this);
    174 <endif>
    175     <parserCtorBody()>
    176     <grammar.directDelegates:{g|<g:delegateName()> = new <g.recognizerName>(input, self._dbg, this.state, this<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n">
    177     <@finally()>
    178 }<\n>
    179 !>
    180 >>
    181 
    182 @genericParser.superClassName() ::= "Debug<@super.superClassName()>"
    183 
    184 @rule.body() ::= <<
    185 try:
    186     self._dbg.enterRule(self.getGrammarFileName(), "<ruleName>")
    187     if self.getRuleLevel() == 0:
    188         self._dbg.commence();
    189     self.incRuleLevel()
    190     <! ST uses zero-based columns, we want one-base !>
    191     self._dbg.location(<ruleDescriptor.tree.line>, <ruleDescriptor.tree.charPositionInLine>+1)
    192 
    193     <@super.body()>
    194 
    195     self._dbg.location(<ruleDescriptor.EORNode.line>, <ruleDescriptor.EORNode.charPositionInLine>+1)
    196 finally:
    197     self._dbg.exitRule(self.getGrammarFileName(), "<ruleName>")
    198     self.decRuleLevel()
    199     if self.getRuleLevel() == 0:
    200          self._dbg.terminate()
    201 
    202 >>
    203 
    204 @synpred.start() ::= "self._dbg.beginBacktrack(self._state.backtracking)"
    205 
    206 @synpred.stop() ::= "self._dbg.endBacktrack(self._state.backtracking, success)"
    207 
    208 // Common debug event triggers used by region overrides below
    209 
    210 enterSubRule() ::=
    211     "try { self._dbg.enterSubRule(<decisionNumber>);<\n>"
    212 
    213 exitSubRule() ::=
    214     "} finally {self._dbg.exitSubRule(<decisionNumber>);}<\n>"
    215 
    216 enterDecision() ::=
    217     "try { self._dbg.enterDecision(<decisionNumber>);<\n>"
    218 
    219 exitDecision() ::=
    220     "} finally {self._dbg.exitDecision(<decisionNumber>);}<\n>"
    221 
    222 enterAlt(n) ::= "self._dbg.enterAlt(<n>)<\n>"
    223 
    224 // Region overrides that tell various constructs to add debugging triggers
    225 
    226 @block.body() ::= <<
    227 try:
    228     self._dbg.enterSubRule(<decisionNumber>)
    229     <@super.body()>
    230 finally:
    231     self._dbg.exitSubRule(<decisionNumber>)
    232 >>
    233 
    234 @blockBody.decision() ::= <<
    235 try:
    236     self._dbg.enterDecision(
    237         <decisionNumber>, self.decisionCanBacktrack[<decisionNumber>])
    238     <@super.decision()>
    239 finally:
    240     self._dbg.exitDecision(<decisionNumber>)
    241 >>
    242 
    243 @ruleBlock.decision() ::= <<
    244 try:
    245     self._dbg.enterDecision(
    246         <decisionNumber>, self.decisionCanBacktrack[<decisionNumber>])
    247     <@super.decision()>
    248 finally:
    249     self._dbg.exitDecision(<decisionNumber>)
    250 >>
    251 
    252 @ruleBlockSingleAlt.prealt() ::= "<enterAlt(n=\"1\")>"
    253 
    254 @blockSingleAlt.prealt() ::= "<enterAlt(n=\"1\")>"
    255 
    256 @positiveClosureBlock.loopBody() ::= <<
    257 try:
    258     self._dbg.enterSubRule(<decisionNumber>)
    259     <@super.loopBody()>
    260 finally:
    261     self._dbg.exitSubRule(<decisionNumber>)<\n>
    262 >>
    263 
    264 @positiveClosureBlockLoop.decisionBody() ::= <<
    265 try:
    266     self._dbg.enterDecision(
    267         <decisionNumber>, self.decisionCanBacktrack[<decisionNumber>])
    268     <@super.decisionBody()>
    269 finally:
    270     self._dbg.exitDecision(<decisionNumber>)
    271 >>
    272 
    273 @positiveClosureBlockLoop.earlyExitException() ::=
    274     "self._dbg.recognitionException(eee)<\n>"
    275 
    276 @closureBlock.loopBody() ::= <<
    277 try:
    278     self._dbg.enterSubRule(<decisionNumber>)
    279     <@super.loopBody()>
    280 finally:
    281     self._dbg.exitSubRule(<decisionNumber>)<\n>
    282 >>
    283 
    284 @closureBlockLoop.decisionBody() ::= <<
    285 try:
    286     self._dbg.enterDecision(
    287         <decisionNumber>, self.decisionCanBacktrack[<decisionNumber>])
    288     <@super.decisionBody()>
    289 finally:
    290     self._dbg.exitDecision(<decisionNumber>)
    291 >>
    292 
    293 @altSwitchCase.prealt() ::= "<enterAlt(altNum)>"
    294 
    295 @element.prematch() ::=
    296     "self._dbg.location(<e.line>, <e.pos>)"
    297 
    298 @matchSet.mismatchedSetException() ::=
    299     "self._dbg.recognitionException(mse)"
    300 
    301 @dfaState.noViableAltException() ::= "self._dbg.recognitionException(nvae)"
    302 
    303 @dfaStateSwitch.noViableAltException() ::= "self._dbg.recognitionException(nvae)"
    304 
    305 dfaDecision(decisionNumber,description) ::= <<
    306 try:
    307     self.isCyclicDecision = True
    308     <super.dfaDecision(...)>
    309 
    310 except NoViableAltException, nvae:
    311     self._dbg.recognitionException(nvae)
    312     raise
    313 
    314 >>
    315 
    316 @cyclicDFA.errorMethod() ::= <<
    317 def error(self, nvae):
    318     self._dbg.recognitionException(nvae)
    319 
    320 >>
    321 
    322 /** Force predicate validation to trigger an event */
    323 evalPredicate(pred,description) ::= <<
    324 self.evalPredicate(<pred>,"<description>")
    325 >>
    326