Package schrodinger :: Package application :: Package desmond :: Package antlr3 :: Module debug :: Class DebugEventSocketProxy
[hide private]
[frames] | no frames]

Class DebugEventSocketProxy

        object --+    
                 |    
DebugEventListener --+
                     |
                    DebugEventSocketProxy

A proxy debug event listener that forwards events over a socket to a debugger (or any other listener) using a simple text-based protocol; one event per line. ANTLRWorks listens on server socket with a RemoteDebugEventSocketListener instance. These two objects must therefore be kept in sync. New events must be handled on both sides of socket.

Instance Methods [hide private]
 
__init__(self, recognizer, adaptor=None, port=None, debug=None)
x.__init__(...) initializes x; see help(type(x)) for signature
 
log(self, msg)
 
handshake(self)
 
write(self, msg)
 
ack(self)
 
transmit(self, event)
 
commence(self)
Announce that parsing has begun.
 
terminate(self)
Parsing is over; successfully or not.
 
enterRule(self, grammarFileName, ruleName)
The parser has just entered a rule.
 
enterAlt(self, alt)
Because rules can have lots of alternatives, it is very useful to know which alt you are entering.
 
exitRule(self, grammarFileName, ruleName)
This is the last thing executed before leaving a rule.
 
enterSubRule(self, decisionNumber)
Track entry into any (...) subrule other EBNF construct
 
exitSubRule(self, decisionNumber)
 
enterDecision(self, decisionNumber)
Every decision, fixed k or arbitrary, has an enter/exit event so that a GUI can easily track what LT/consume events are associated with prediction.
 
exitDecision(self, decisionNumber)
 
consumeToken(self, t)
An input token was consumed; matched by any kind of element.
 
consumeHiddenToken(self, t)
An off-channel input token was consumed.
 
LT(self, i, o)
The tree parser lookedahead.
 
LT_token(self, i, t)
 
mark(self, i)
The parser is going to look arbitrarily ahead; mark this location, the token stream's marker is sent in case you need it.
 
rewind(self, i=None)
After an arbitrairly long lookahead as with a cyclic DFA (or with any backtrack), this informs the debugger that stream should be rewound to the position associated with marker.
 
beginBacktrack(self, level)
 
endBacktrack(self, level, successful)
 
location(self, line, pos)
To watch a parser move through the grammar, the parser needs to inform the debugger what line/charPos it is passing in the grammar.
 
recognitionException(self, exc)
A recognition exception occurred such as NoViableAltException.
 
beginResync(self)
Indicates the recognizer is about to consume tokens to resynchronize the parser.
 
endResync(self)
Indicates that the recognizer has finished consuming tokens in order to resychronize.
 
semanticPredicate(self, result, predicate)
A semantic predicate was evaluate with this result and action text
 
consumeNode(self, t)
Input for a tree parser is an AST, but we know nothing for sure about a node except its type and text (obtained from the adaptor).
 
LT_tree(self, i, t)
 
serializeNode(self, buf, t)
 
nilNode(self, t)
A nil was created (even nil nodes have a unique ID...
 
errorNode(self, t)
Upon syntax error, recognizers bracket the error with an error node if they are building ASTs.
 
createNode(self, node, token=None)
Announce a new node built from token elements such as type etc...
 
becomeRoot(self, newRoot, oldRoot)
Make a node the new root of an existing root.
 
addChild(self, root, child)
Make childID a child of rootID.
 
setTokenBoundaries(self, t, tokenStartIndex, tokenStopIndex)
Set the token start/stop token index for a subtree root or node.
 
setTreeAdaptor(self, adaptor)
 
getTreeAdaptor(self)
 
serializeToken(self, t)
 
escapeNewlines(self, txt)

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__

Class Variables [hide private]
  DEFAULT_DEBUGGER_PORT = 49100

Inherited from DebugEventListener: PROTOCOL_VERSION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, recognizer, adaptor=None, port=None, debug=None)
(Constructor)

 

x.__init__(...) initializes x; see help(type(x)) for signature

Overrides: object.__init__
(inherited documentation)

commence(self)

 

Announce that parsing has begun. Not technically useful except for sending events over a socket. A GUI for example will launch a thread to connect and communicate with a remote parser. The thread will want to notify the GUI when a connection is made. ANTLR parsers trigger this upon entry to the first rule (the ruleLevel is used to figure this out).

Overrides: DebugEventListener.commence
(inherited documentation)

terminate(self)

 

Parsing is over; successfully or not. Mostly useful for telling remote debugging listeners that it's time to quit. When the rule invocation level goes to zero at the end of a rule, we are done parsing.

Overrides: DebugEventListener.terminate
(inherited documentation)

enterRule(self, grammarFileName, ruleName)

 

The parser has just entered a rule. No decision has been made about which alt is predicted. This is fired AFTER init actions have been executed. Attributes are defined and available etc... The grammarFileName allows composite grammars to jump around among multiple grammar files.

Overrides: DebugEventListener.enterRule
(inherited documentation)

enterAlt(self, alt)

 

Because rules can have lots of alternatives, it is very useful to know which alt you are entering. This is 1..n for n alts.

Overrides: DebugEventListener.enterAlt
(inherited documentation)

exitRule(self, grammarFileName, ruleName)

 

This is the last thing executed before leaving a rule. It is executed even if an exception is thrown. This is triggered after error reporting and recovery have occurred (unless the exception is not caught in this rule). This implies an "exitAlt" event. The grammarFileName allows composite grammars to jump around among multiple grammar files.

Overrides: DebugEventListener.exitRule
(inherited documentation)

enterSubRule(self, decisionNumber)

 

Track entry into any (...) subrule other EBNF construct

Overrides: DebugEventListener.enterSubRule
(inherited documentation)

exitSubRule(self, decisionNumber)

 
Overrides: DebugEventListener.exitSubRule

enterDecision(self, decisionNumber)

 

Every decision, fixed k or arbitrary, has an enter/exit event so that a GUI can easily track what LT/consume events are associated with prediction. You will see a single enter/exit subrule but multiple enter/exit decision events, one for each loop iteration.

Overrides: DebugEventListener.enterDecision
(inherited documentation)

exitDecision(self, decisionNumber)

 
Overrides: DebugEventListener.exitDecision

consumeToken(self, t)

 

An input token was consumed; matched by any kind of element. Trigger after the token was matched by things like match(), matchAny().

Overrides: DebugEventListener.consumeToken
(inherited documentation)

consumeHiddenToken(self, t)

 

An off-channel input token was consumed. Trigger after the token was matched by things like match(), matchAny(). (unless of course the hidden token is first stuff in the input stream).

Overrides: DebugEventListener.consumeHiddenToken
(inherited documentation)

LT(self, i, o)

 

The tree parser lookedahead. If the type is UP or DOWN, then the ID is not really meaningful as it's fixed--there is just one UP node and one DOWN navigation node.

Overrides: DebugEventListener.LT
(inherited documentation)

mark(self, i)

 

The parser is going to look arbitrarily ahead; mark this location, the token stream's marker is sent in case you need it.

Overrides: DebugEventListener.mark
(inherited documentation)

rewind(self, i=None)

 

After an arbitrairly long lookahead as with a cyclic DFA (or with any backtrack), this informs the debugger that stream should be rewound to the position associated with marker.

Overrides: DebugEventListener.rewind
(inherited documentation)

beginBacktrack(self, level)

 
Overrides: DebugEventListener.beginBacktrack

endBacktrack(self, level, successful)

 
Overrides: DebugEventListener.endBacktrack

location(self, line, pos)

 

To watch a parser move through the grammar, the parser needs to inform the debugger what line/charPos it is passing in the grammar. For now, this does not know how to switch from one grammar to the other and back for island grammars etc...

This should also allow breakpoints because the debugger can stop the parser whenever it hits this line/pos.

Overrides: DebugEventListener.location
(inherited documentation)

recognitionException(self, exc)

 
A recognition exception occurred such as NoViableAltException.  I made
this a generic event so that I can alter the exception hierachy later
without having to alter all the debug objects.

Upon error, the stack of enter rule/subrule must be properly unwound.
If no viable alt occurs it is within an enter/exit decision, which
also must be rewound.  Even the rewind for each mark must be unwount.
In the Java target this is pretty easy using try/finally, if a bit
ugly in the generated code.  The rewind is generated in DFA.predict()
actually so no code needs to be generated for that.  For languages
w/o this "finally" feature (C++?), the target implementor will have
to build an event stack or something.

Across a socket for remote debugging, only the RecognitionException
data fields are transmitted.  The token object or whatever that
caused the problem was the last object referenced by LT.  The
immediately preceding LT event should hold the unexpected Token or
char.

Here is a sample event trace for grammar:

b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
  | D
  ;

The sequence for this rule (with no viable alt in the subrule) for
input 'c c' (there are 3 tokens) is:

        commence
        LT(1)
        enterRule b
        location 7 1
        enter decision 3
        LT(1)
        exit decision 3
        enterAlt1
        location 7 5
        LT(1)
        consumeToken [c/<4>,1:0]
        location 7 7
        enterSubRule 2
        enter decision 2
        LT(1)
        LT(1)
        recognitionException NoViableAltException 2 1 2
        exit decision 2
        exitSubRule 2
        beginResync
        LT(1)
        consumeToken [c/<4>,1:1]
        LT(1)
        endResync
        LT(-1)
        exitRule b
        terminate

Overrides: DebugEventListener.recognitionException
(inherited documentation)

beginResync(self)

 

Indicates the recognizer is about to consume tokens to resynchronize the parser. Any consume events from here until the recovered event are not part of the parse--they are dead tokens.

Overrides: DebugEventListener.beginResync
(inherited documentation)

endResync(self)

 

Indicates that the recognizer has finished consuming tokens in order to resychronize. There may be multiple beginResync/endResync pairs before the recognizer comes out of errorRecovery mode (in which multiple errors are suppressed). This will be useful in a gui where you want to probably grey out tokens that are consumed but not matched to anything in grammar. Anything between a beginResync/endResync pair was tossed out by the parser.

Overrides: DebugEventListener.endResync
(inherited documentation)

semanticPredicate(self, result, predicate)

 

A semantic predicate was evaluate with this result and action text

Overrides: DebugEventListener.semanticPredicate
(inherited documentation)

consumeNode(self, t)

 

Input for a tree parser is an AST, but we know nothing for sure about a node except its type and text (obtained from the adaptor). This is the analog of the consumeToken method. Again, the ID is the hashCode usually of the node so it only works if hashCode is not implemented. If the type is UP or DOWN, then the ID is not really meaningful as it's fixed--there is just one UP node and one DOWN navigation node.

Overrides: DebugEventListener.consumeNode
(inherited documentation)

nilNode(self, t)

 

A nil was created (even nil nodes have a unique ID... they are not "null" per se). As of 4/28/2006, this seems to be uniquely triggered when starting a new subtree such as when entering a subrule in automatic mode and when building a tree in rewrite mode.

If you are receiving this event over a socket via RemoteDebugEventSocketListener then only t.ID is set.

Overrides: DebugEventListener.nilNode
(inherited documentation)

errorNode(self, t)

 

Upon syntax error, recognizers bracket the error with an error node if they are building ASTs.

Overrides: DebugEventListener.errorNode
(inherited documentation)

createNode(self, node, token=None)

 

Announce a new node built from token elements such as type etc...

If you are receiving this event over a socket via RemoteDebugEventSocketListener then only t.ID, type, text are set.

Overrides: DebugEventListener.createNode
(inherited documentation)

becomeRoot(self, newRoot, oldRoot)

 

Make a node the new root of an existing root.

Note: the newRootID parameter is possibly different than the TreeAdaptor.becomeRoot() newRoot parameter. In our case, it will always be the result of calling TreeAdaptor.becomeRoot() and not root_n or whatever.

The listener should assume that this event occurs only when the current subrule (or rule) subtree is being reset to newRootID.

If you are receiving this event over a socket via RemoteDebugEventSocketListener then only IDs are set.

@see antlr3.tree.TreeAdaptor.becomeRoot()

Overrides: DebugEventListener.becomeRoot
(inherited documentation)

addChild(self, root, child)

 

Make childID a child of rootID.

If you are receiving this event over a socket via RemoteDebugEventSocketListener then only IDs are set.

@see antlr3.tree.TreeAdaptor.addChild()

Overrides: DebugEventListener.addChild
(inherited documentation)

setTokenBoundaries(self, t, tokenStartIndex, tokenStopIndex)

 

Set the token start/stop token index for a subtree root or node.

If you are receiving this event over a socket via RemoteDebugEventSocketListener then only t.ID is set.

Overrides: DebugEventListener.setTokenBoundaries
(inherited documentation)