1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \file 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The definition of all debugging events that a recognizer can trigger. 43447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \remark 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * From the java implementation by Terence Parr... 73447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * I did not create a separate AST debugging interface as it would create 83447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * lots of extra classes and DebugParser has a dbg var defined, which makes 93447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * it hard to change to ASTDebugEventListener. I looked hard at this issue 103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * and it is easier to understand as one monolithic event interface for all 113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * possible events. Hopefully, adding ST debugging stuff won't be bad. Leave 123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * for future. 4/26/2006. 133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef ANTLR3_DEBUG_EVENT_LISTENER_H 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define ANTLR3_DEBUG_EVENT_LISTENER_H 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3defs.h> 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3basetree.h> 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3commontoken.h> 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Default debugging port 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define DEFAULT_DEBUGGER_PORT 0xBFCC; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern "C" { 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The ANTLR3 debugging interface for communicating with ANLTR Works. Function comments 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * mostly taken from the Java version. 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct ANTLR3_DEBUG_EVENT_LISTENER_struct 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The port number which the debug listener should listen on for a connection 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 port; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The socket structure we receive after a successful accept on the serverSocket 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SOCKET socket; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** The version of the debugging protocol supported by the providing 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * instance of the debug event listener. 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int PROTOCOL_VERSION; 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The name of the grammar file that we are debugging 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING grammarFileName; 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Indicates whether we have already connected or not 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_BOOLEAN initialized; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Used to serialize the values of any particular token we need to 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// send back to the debugger. 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING tokenString; 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Allows the debug event system to access the adapter in use 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// by the recognizer, if this is a tree parser of some sort. 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE_ADAPTOR adaptor; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Wait for a connection from the debugger and initiate the 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// debugging session. 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_BOOLEAN (*handshake) (pANTLR3_DEBUG_EVENT_LISTENER delboy); 1013447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1023447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** The parser has just entered a rule. No decision has been made about 1033447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * which alt is predicted. This is fired AFTER init actions have been 1043447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * executed. Attributes are defined and available etc... 1053447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*enterRule) (pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * grammarFileName, const char * ruleName); 1073447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1083447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Because rules can have lots of alternatives, it is very useful to 1093447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * know which alt you are entering. This is 1..n for n alts. 1103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*enterAlt) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int alt); 1123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** This is the last thing executed before leaving a rule. It is 1143447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * executed even if an exception is thrown. This is triggered after 1153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * error reporting and recovery have occurred (unless the exception is 1163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * not caught in this rule). This implies an "exitAlt" event. 1173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*exitRule) (pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * grammarFileName, const char * ruleName); 1193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Track entry into any (...) subrule other EBNF construct 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*enterSubRule) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*exitSubRule) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber); 1253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Every decision, fixed k or arbitrary, has an enter/exit event 1273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * so that a GUI can easily track what LT/consume events are 1283447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * associated with prediction. You will see a single enter/exit 1293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * subrule but multiple enter/exit decision events, one for each 1303447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * loop iteration. 1313447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*enterDecision) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber); 1333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*exitDecision) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber); 1353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** An input token was consumed; matched by any kind of element. 1373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * Trigger after the token was matched by things like match(), matchAny(). 1383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*consumeToken) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t); 1403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** An off-channel input token was consumed. 1423447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * Trigger after the token was matched by things like match(), matchAny(). 1433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * (unless of course the hidden token is first stuff in the input stream). 1443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*consumeHiddenToken) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t); 1463447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Somebody (anybody) looked ahead. Note that this actually gets 1483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * triggered by both LA and LT calls. The debugger will want to know 1493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * which Token object was examined. Like consumeToken, this indicates 1503447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * what token was seen at that depth. A remote debugger cannot look 1513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * ahead into a file it doesn't have so LT events must pass the token 1523447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * even if the info is redundant. 1533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*LT) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int i, pANTLR3_COMMON_TOKEN t); 1553447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** The parser is going to look arbitrarily ahead; mark this location, 1573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * the token stream's marker is sent in case you need it. 1583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*mark) (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_MARKER marker); 1603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** After an arbitrarily long lookahead as with a cyclic DFA (or with 1623447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * any backtrack), this informs the debugger that stream should be 1633447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * rewound to the position associated with marker. 1643447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*rewind) (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_MARKER marker); 1663447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1673447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Rewind to the input position of the last marker. 1683447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * Used currently only after a cyclic DFA and just 1693447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * before starting a sem/syn predicate to get the 1703447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * input position back to the start of the decision. 1713447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * Do not "pop" the marker off the state. mark(i) 1723447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * and rewind(i) should balance still. 1733447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*rewindLast) (pANTLR3_DEBUG_EVENT_LISTENER delboy); 1753447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*beginBacktrack) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int level); 1773447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*endBacktrack) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int level, ANTLR3_BOOLEAN successful); 1793447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1803447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** To watch a parser move through the grammar, the parser needs to 1813447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * inform the debugger what line/charPos it is passing in the grammar. 1823447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * For now, this does not know how to switch from one grammar to the 1833447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * other and back for island grammars etc... 1843447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 1853447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * This should also allow breakpoints because the debugger can stop 1863447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * the parser whenever it hits this line/pos. 1873447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*location) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int line, int pos); 1893447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1903447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** A recognition exception occurred such as NoViableAltException. I made 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this a generic event so that I can alter the exception hierarchy later 1923447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * without having to alter all the debug objects. 1933447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 1943447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * Upon error, the stack of enter rule/subrule must be properly unwound. 1953447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * If no viable alt occurs it is within an enter/exit decision, which 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * also must be rewound. Even the rewind for each mark must be unwound. 1973447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * In the Java target this is pretty easy using try/finally, if a bit 1983447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * ugly in the generated code. The rewind is generated in DFA.predict() 1993447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * actually so no code needs to be generated for that. For languages 2003447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * w/o this "finally" feature (C++?), the target implementor will have 2013447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * to build an event stack or something. 2023447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 2033447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * Across a socket for remote debugging, only the RecognitionException 2043447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * data fields are transmitted. The token object or whatever that 2053447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * caused the problem was the last object referenced by LT. The 2063447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * immediately preceding LT event should hold the unexpected Token or 2073447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * char. 2083447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 2093447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * Here is a sample event trace for grammar: 2103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 2113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * b : C ({;}A|B) // {;} is there to prevent A|B becoming a set 2123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * | D 2133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * ; 2143447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 2153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * The sequence for this rule (with no viable alt in the subrule) for 2163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * input 'c c' (there are 3 tokens) is: 2173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 2183447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * commence 2193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * LT(1) 2203447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * enterRule b 2213447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * location 7 1 2223447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * enter decision 3 2233447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * LT(1) 2243447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * exit decision 3 2253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * enterAlt1 2263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * location 7 5 2273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * LT(1) 2283447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * consumeToken [c/<4>,1:0] 2293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * location 7 7 2303447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * enterSubRule 2 2313447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * enter decision 2 2323447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * LT(1) 2333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * LT(1) 2343447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * recognitionException NoViableAltException 2 1 2 2353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * exit decision 2 2363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * exitSubRule 2 2373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * beginResync 2383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * LT(1) 2393447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * consumeToken [c/<4>,1:1] 2403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * LT(1) 2413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * endResync 2423447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * LT(-1) 2433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * exitRule b 2443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * terminate 2453447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*recognitionException) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_EXCEPTION e); 2473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 2483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Indicates the recognizer is about to consume tokens to resynchronize 2493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * the parser. Any consume events from here until the recovered event 2503447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * are not part of the parse--they are dead tokens. 2513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*beginResync) (pANTLR3_DEBUG_EVENT_LISTENER delboy); 2533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 2543447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Indicates that the recognizer has finished consuming tokens in order 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to resynchronize. There may be multiple beginResync/endResync pairs 2563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * before the recognizer comes out of errorRecovery mode (in which 2573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * multiple errors are suppressed). This will be useful 2583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * in a gui where you want to probably grey out tokens that are consumed 2593447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * but not matched to anything in grammar. Anything between 2603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * a beginResync/endResync pair was tossed out by the parser. 2613447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*endResync) (pANTLR3_DEBUG_EVENT_LISTENER delboy); 2633447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** A semantic predicate was evaluate with this result and action text 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*semanticPredicate) (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_BOOLEAN result, const char * predicate); 2673447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 2683447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Announce that parsing has begun. Not technically useful except for 2693447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * sending events over a socket. A GUI for example will launch a thread 2703447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * to connect and communicate with a remote parser. The thread will want 2713447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * to notify the GUI when a connection is made. ANTLR parsers 2723447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * trigger this upon entry to the first rule (the ruleLevel is used to 2733447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * figure this out). 2743447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*commence) (pANTLR3_DEBUG_EVENT_LISTENER delboy); 2763447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 2773447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Parsing is over; successfully or not. Mostly useful for telling 2783447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * remote debugging listeners that it's time to quit. When the rule 2793447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * invocation level goes to zero at the end of a rule, we are done 2803447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * parsing. 2813447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*terminate) (pANTLR3_DEBUG_EVENT_LISTENER delboy); 2833447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Retrieve acknowledge response from the debugger. in fact this 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// response is never used at the moment. So we just read whatever 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// is in the socket buffer and throw it away. 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*ack) (pANTLR3_DEBUG_EVENT_LISTENER delboy); 2893447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 2903447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein // T r e e P a r s i n g 2913447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 2923447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Input for a tree parser is an AST, but we know nothing for sure 2933447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * about a node except its type and text (obtained from the adaptor). 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is the analog of the consumeToken method. The ID is usually 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the memory address of the node. 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If the type is UP or DOWN, then 2973447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * the ID is not really meaningful as it's fixed--there is 2983447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * just one UP node and one DOWN navigation node. 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Note that unlike the Java version, the node type of the C parsers 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is always fixed as pANTLR3_BASE_TREE because all such structures 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * contain a super pointer to their parent, which is generally COMMON_TREE and within 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * that there is a super pointer that can point to a user type that encapsulates it. 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Almost akin to saying that it is an interface pointer except we don't need to 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * know what the interface is in full, just those bits that are the base. 3063447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * @param t 3073447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*consumeNode) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t); 3093447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** The tree parser looked ahead. If the type is UP or DOWN, 3113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * then the ID is not really meaningful as it's fixed--there is 3123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * just one UP node and one DOWN navigation node. 3133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*LTT) (pANTLR3_DEBUG_EVENT_LISTENER delboy, int i, pANTLR3_BASE_TREE t); 3153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein // A S T E v e n t s 3183447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** A nil was created (even nil nodes have a unique ID... 3203447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * they are not "null" per se). As of 4/28/2006, this 3213447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * seems to be uniquely triggered when starting a new subtree 3223447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * such as when entering a subrule in automatic mode and when 3233447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * building a tree in rewrite mode. 3243447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * If you are receiving this event over a socket via 3263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * RemoteDebugEventSocketListener then only t.ID is set. 3273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*nilNode) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t); 3293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** If a syntax error occurs, recognizers bracket the error 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * with an error node if they are building ASTs. This event 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notifies the listener that this is the case 3333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*errorNode) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t); 3353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Announce a new node built from token elements such as type etc... 3373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * If you are receiving this event over a socket via 3393447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * RemoteDebugEventSocketListener then only t.ID, type, text are 3403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * set. 3413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*createNode) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t); 3433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Announce a new node built from an existing token. 3453447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3463447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * If you are receiving this event over a socket via 3473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * RemoteDebugEventSocketListener then only node.ID and token.tokenIndex 3483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * are set. 3493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*createNodeTok) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE node, pANTLR3_COMMON_TOKEN token); 3513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3523447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Make a node the new root of an existing root. See 3533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3543447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * Note: the newRootID parameter is possibly different 3553447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * than the TreeAdaptor.becomeRoot() newRoot parameter. 3563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * In our case, it will always be the result of calling 3573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * TreeAdaptor.becomeRoot() and not root_n or whatever. 3583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3593447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * The listener should assume that this event occurs 3603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * only when the current subrule (or rule) subtree is 3613447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * being reset to newRootID. 3623447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3633447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * If you are receiving this event over a socket via 3643447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * RemoteDebugEventSocketListener then only IDs are set. 3653447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3663447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * @see org.antlr.runtime.tree.TreeAdaptor.becomeRoot() 3673447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*becomeRoot) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot); 3693447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3703447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Make childID a child of rootID. 3713447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3723447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * If you are receiving this event over a socket via 3733447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * RemoteDebugEventSocketListener then only IDs are set. 3743447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3753447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * @see org.antlr.runtime.tree.TreeAdaptor.addChild() 3763447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*addChild) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE root, pANTLR3_BASE_TREE child); 3783447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3793447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein /** Set the token start/stop token index for a subtree root or node. 3803447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * 3813447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * If you are receiving this event over a socket via 3823447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein * RemoteDebugEventSocketListener then only t.ID is set. 3833447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*setTokenBoundaries) (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t, ANTLR3_MARKER tokenStartIndex, ANTLR3_MARKER tokenStopIndex); 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Free up the resources allocated to this structure 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*free) (pANTLR3_DEBUG_EVENT_LISTENER delboy); 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_DEBUG_EVENT_LISTENER; 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus 3943447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein} 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 399