1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [The "BSD license"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver http://www.temporal-wave.com 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver http://www.linkedin.com/in/jimidle 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver All rights reserved. 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Redistribution and use in source and binary forms, with or without 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modification, are permitted provided that the following conditions 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver are met: 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1. Redistributions of source code must retain the above copyright 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2. Redistributions in binary form must reproduce the above copyright 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer in the 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver documentation and/or other materials provided with the distribution. 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3. The name of the author may not be used to endorse or promote products 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver derived from this software without specific prior written permission. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/ 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This code generating template and the associated C runtime was produced by: 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Jim Idle jimi|hereisanat|idle|dotgoeshere|ws. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If it causes the destruction of the Universe, it will be pretty cool so long as 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I am in a different one at the time. 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 38324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercTypeInitMap ::= [ 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "int" : "0", // Integers start out being 0 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "long" : "0", // Longs start out being 0 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "float" : "0.0", // Floats start out being 0 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "double" : "0.0", // Doubles start out being 0 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ANTLR3_BOOLEAN" : "ANTLR3_FALSE", // Booleans start out being Antlr C for false 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "byte" : "0", // Bytes start out being 0 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "short" : "0", // Shorts start out being 0 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "char" : "0" // Chars start out being 0 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver] 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 49324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverleadIn(type) ::= 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<< 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This <type> file was generated by $ANTLR version <ANTLRVersion> 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - From the grammar source file : <fileName> 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - On : <generatedTimestamp> 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - for the lexer : <name>Lexer 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - for the parser : <name>Parser 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - for the tree parser : <name>TreeParser 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Editing it, at least manually, is not wise. 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws. 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The overall file structure of a recognizer; stores methods for rules 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and cyclic DFAs plus support code. 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 76324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroutputFile( LEXER, 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PARSER, 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TREE_PARSER, 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver actionScope, 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver actions, 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver docComment, 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver recognizer, 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver name, 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens, 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenNames, 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rules, 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cyclicDFAs, 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bitsets, 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buildTemplate, 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buildAST, 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rewriteMode, 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver profile, 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver backtracking, 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver synpreds, 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver memoize, 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numRules, 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fileName, 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLRVersion, 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generatedTimestamp, 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver trace, 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver scopes, 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver superClass, 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver literals 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) ::= 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<< 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<leadIn("C source")> 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/ 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD license"] 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).header)> 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================================================= 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is what the grammar programmer asked us to put at the top of every file. 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header> 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Header action. 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ============================================================================= 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------- 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Include the ANTLR3 generated header file. 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "<name>.h" 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).postinclude> 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------- */ 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<docComment> 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(literals)> 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** String literals used by <name> that we must do things like MATCHS() with. 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * C will normally just lay down 8 bit characters, and you can use L"xxx" to 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * get wchar_t, but wchar_t is 16 bits on Windows, which is not UTF32 and so 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * we perform this little trick of defining the literals as arrays of UINT32 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and passing in the address of these. 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<literals:{it | static ANTLR3_UCHAR lit_<i>[] = <it>;}; separator="\n"> 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* MACROS that hide the C interface implementations from the 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * generated code, which makes it a little more understandable to the human eye. 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I am very much against using C pre-processor macros for function calls and bits 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of code as you cannot see what is happening when single stepping in debuggers 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and so on. The exception (in my book at least) is for generated code, where you are 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * not maintaining it, but may wish to read and understand it. If you single step it, you know that input() 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * hides some indirect calls, but is always referring to the input stream. This is 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the runtime interfaces without changing the generated code too often, without 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * confusing the reader of the generated output, who may not wish to know the gory 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * details of the interface inheritance. 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CTX ctx 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Aids in accessing scopes for grammar programmers 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef SCOPE_TYPE 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef SCOPE_STACK 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef SCOPE_TOP 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SCOPE_TYPE(scope) p<name>_##scope##_SCOPE 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SCOPE_STACK(scope) p<name>_##scope##Stack 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SCOPE_TOP(scope) ctx->p<name>_##scope##Top 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SCOPE_SIZE(scope) ctx->p<name>_##scope##Stack_limit 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i)) 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Macros for accessing things in a lexer 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef LEXER 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RECOGNIZER 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RULEMEMO 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef GETCHARINDEX 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef GETLINE 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef GETCHARPOSITIONINLINE 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EMIT 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EMITNEW 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MATCHC 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MATCHS 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MATCHRANGE 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef LTOKEN 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HASFAILED 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FAILEDFLAG 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef INPUT 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef STRSTREAM 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef LA 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HASEXCEPTION 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EXCEPTION 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef CONSTRUCTEX 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef CONSUME 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef LRECOVER 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MARK 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef REWIND 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef REWINDLAST 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef BACKTRACKING 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MATCHANY 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MEMOIZE 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HAVEPARSEDRULE 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef GETTEXT 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef INDEX 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef SEEK 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PUSHSTREAM 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef POPSTREAM 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef SETTEXT 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef SETTEXT8 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LEXER ctx->pLexer 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RECOGNIZER LEXER->rec 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LEXSTATE RECOGNIZER->state 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define TOKSOURCE LEXSTATE->tokSource 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define GETCHARINDEX() LEXER->getCharIndex(LEXER) 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define GETLINE() LEXER->getLine(LEXER) 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define GETTEXT() LEXER->getText(LEXER) 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define GETCHARPOSITIONINLINE() LEXER->getCharPositionInLine(LEXER) 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define EMIT() LEXSTATE->type = _type; LEXER->emit(LEXER) 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define EMITNEW(t) LEXER->emitNew(LEXER, t) 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MATCHC(c) LEXER->matchc(LEXER, c) 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MATCHS(s) LEXER->matchs(LEXER, s) 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MATCHRANGE(c1,c2) LEXER->matchRange(LEXER, c1, c2) 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MATCHANY() LEXER->matchAny(LEXER) 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LTOKEN LEXSTATE->token 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HASFAILED() (LEXSTATE->failed == ANTLR3_TRUE) 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define BACKTRACKING LEXSTATE->backtracking 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FAILEDFLAG LEXSTATE->failed 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define INPUT LEXER->input 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define STRSTREAM INPUT 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define ISTREAM INPUT->istream 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define INDEX() ISTREAM->index(ISTREAM) 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SEEK(n) ISTREAM->seek(ISTREAM, n) 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define EOF_TOKEN &(LEXSTATE->tokSource->eofToken) 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HASEXCEPTION() (LEXSTATE->error == ANTLR3_TRUE) 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define EXCEPTION LEXSTATE->exception 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER) 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LRECOVER() LEXER->recover(LEXER) 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MARK() ISTREAM->mark(ISTREAM) 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define REWIND(m) ISTREAM->rewind(ISTREAM, m) 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define REWINDLAST() ISTREAM->rewindLast(ISTREAM) 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MEMOIZE(ri,si) RECOGNIZER->memoize(RECOGNIZER, ri, si) 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r) 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PUSHSTREAM(str) LEXER->pushCharStream(LEXER, str) 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define POPSTREAM() LEXER->popCharStream(LEXER) 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SETTEXT(str) LEXSTATE->text = str 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SKIP() LEXSTATE->token = &(TOKSOURCE->skipToken) 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define USER1 LEXSTATE->user1 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define USER2 LEXSTATE->user2 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define USER3 LEXSTATE->user3 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CUSTOM LEXSTATE->custom 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RULEMEMO LEXSTATE->ruleMemo 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define DBG RECOGNIZER->debugger 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* If we have been told we can rely on the standard 8 bit or UTF16 input 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * stream, then we can define our macros to use the direct pointers 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in the input object, which is much faster than indirect calls. This 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is really only significant to lexers with a lot of fragment rules (which 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * do not place LA(1) in a temporary at the moment) and even then 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * only if there is a lot of input (order of say 1M or so). 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#if defined(ANTLR3_INLINE_INPUT_8BIT) || defined(ANTLR3_INLINE_INPUT_UTF16) 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# ifdef ANTLR3_INLINE_INPUT_8BIT 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 8 bit character set */ 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# define NEXTCHAR ((pANTLR3_UINT8)(INPUT->nextChar)) 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# define DATAP ((pANTLR3_UINT8)(INPUT->data)) 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# else 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# define NEXTCHAR ((pANTLR3_UINT16)(INPUT->nextChar)) 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# define DATAP ((pANTLR3_UINT16)(INPUT->data)) 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# endif 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# define LA(n) ((NEXTCHAR + n) > (DATAP + INPUT->sizeBuf) ? ANTLR3_CHARSTREAM_EOF : (ANTLR3_UCHAR)(*(NEXTCHAR + n - 1))) 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# define CONSUME() \\ 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ \\ 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (NEXTCHAR \< (DATAP + INPUT->sizeBuf)) \\ 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { \\ 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INPUT->charPositionInLine++; \\ 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((ANTLR3_UCHAR)(*NEXTCHAR) == INPUT->newlineChar) \\ 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { \\ 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INPUT->line++; \\ 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INPUT->charPositionInLine = 0; \\ 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INPUT->currentLine = (void *)(NEXTCHAR + 1); \\ 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } \\ 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INPUT->nextChar = (void *)(NEXTCHAR + 1); \\ 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } \\ 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Pick up the input character by calling the input stream implementation. 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CONSUME() INPUT->istream->consume(INPUT->istream) 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LA(n) INPUT->istream->_LA(INPUT->istream, n) 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Macros for accessing things in the parser 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PARSER 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RECOGNIZER 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HAVEPARSEDRULE 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MEMOIZE 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef INPUT 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef STRSTREAM 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HASEXCEPTION 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EXCEPTION 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MATCHT 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MATCHANYT 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FOLLOWSTACK 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FOLLOWPUSH 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FOLLOWPOP 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PRECOVER 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PREPORTERROR 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef LA 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef LT 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef CONSTRUCTEX 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef CONSUME 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MARK 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef REWIND 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef REWINDLAST 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PERRORRECOVERY 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HASFAILED 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FAILEDFLAG 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RECOVERFROMMISMATCHEDSET 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RECOVERFROMMISMATCHEDELEMENT 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef INDEX 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef ADAPTOR 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef SEEK 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RULEMEMO 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef DBG 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PARSER ctx->pParser 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RECOGNIZER PARSER->rec 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PSRSTATE RECOGNIZER->state 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r) 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MEMOIZE(ri,si) RECOGNIZER->memoize(RECOGNIZER, ri, si) 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define INPUT PARSER->tstream 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define STRSTREAM INPUT 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define ISTREAM INPUT->istream 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define INDEX() ISTREAM->index(INPUT->istream) 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HASEXCEPTION() (PSRSTATE->error == ANTLR3_TRUE) 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define EXCEPTION PSRSTATE->exception 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MATCHT(t, fs) RECOGNIZER->match(RECOGNIZER, t, fs) 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MATCHANYT() RECOGNIZER->matchAny(RECOGNIZER) 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FOLLOWSTACK PSRSTATE->following 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef SKIP_FOLLOW_SETS 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FOLLOWPUSH(x) 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FOLLOWPOP() 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FOLLOWPUSH(x) FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL) 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FOLLOWPOP() FOLLOWSTACK->pop(FOLLOWSTACK) 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PRECOVER() RECOGNIZER->recover(RECOGNIZER) 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PREPORTERROR() RECOGNIZER->reportError(RECOGNIZER) 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LA(n) INPUT->istream->_LA(ISTREAM, n) 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LT(n) INPUT->_LT(INPUT, n) 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER) 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CONSUME() ISTREAM->consume(ISTREAM) 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MARK() ISTREAM->mark(ISTREAM) 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define REWIND(m) ISTREAM->rewind(ISTREAM, m) 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define REWINDLAST() ISTREAM->rewindLast(ISTREAM) 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SEEK(n) ISTREAM->seek(ISTREAM, n) 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PERRORRECOVERY PSRSTATE->errorRecovery 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FAILEDFLAG PSRSTATE->failed 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HASFAILED() (FAILEDFLAG == ANTLR3_TRUE) 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define BACKTRACKING PSRSTATE->backtracking 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RECOVERFROMMISMATCHEDSET(s) RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s) 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RECOVERFROMMISMATCHEDELEMENT(e) RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s) 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define ADAPTOR ctx->adaptor 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RULEMEMO PSRSTATE->ruleMemo 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define DBG RECOGNIZER->debugger 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Macros for accessing things in the parser 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PARSER 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RECOGNIZER 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HAVEPARSEDRULE 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef INPUT 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef STRSTREAM 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HASEXCEPTION 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EXCEPTION 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MATCHT 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MATCHANYT 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FOLLOWSTACK 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FOLLOWPUSH 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FOLLOWPOP 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PRECOVER 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PREPORTERROR 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef LA 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef LT 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef CONSTRUCTEX 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef CONSUME 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MARK 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef REWIND 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef REWINDLAST 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef PERRORRECOVERY 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HASFAILED 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef FAILEDFLAG 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RECOVERFROMMISMATCHEDSET 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RECOVERFROMMISMATCHEDELEMENT 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef BACKTRACKING 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef ADAPTOR 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RULEMEMO 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef SEEK 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef INDEX 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef DBG 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PARSER ctx->pTreeParser 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RECOGNIZER PARSER->rec 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PSRSTATE RECOGNIZER->state 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r) 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define INPUT PARSER->ctnstream 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define ISTREAM INPUT->tnstream->istream 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define STRSTREAM INPUT->tnstream 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HASEXCEPTION() (PSRSTATE->error == ANTLR3_TRUE) 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define EXCEPTION PSRSTATE->exception 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MATCHT(t, fs) RECOGNIZER->match(RECOGNIZER, t, fs) 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MATCHANYT() RECOGNIZER->matchAny(RECOGNIZER) 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FOLLOWSTACK PSRSTATE->following 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FOLLOWPUSH(x) FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL) 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FOLLOWPOP() FOLLOWSTACK->pop(FOLLOWSTACK) 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PRECOVER() RECOGNIZER->recover(RECOGNIZER) 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PREPORTERROR() RECOGNIZER->reportError(RECOGNIZER) 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LA(n) ISTREAM->_LA(ISTREAM, n) 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define LT(n) INPUT->tnstream->_LT(INPUT->tnstream, n) 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER) 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define CONSUME() ISTREAM->consume(ISTREAM) 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MARK() ISTREAM->mark(ISTREAM) 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define REWIND(m) ISTREAM->rewind(ISTREAM, m) 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define REWINDLAST() ISTREAM->rewindLast(ISTREAM) 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define PERRORRECOVERY PSRSTATE->errorRecovery 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define FAILEDFLAG PSRSTATE->failed 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HASFAILED() (FAILEDFLAG == ANTLR3_TRUE) 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define BACKTRACKING PSRSTATE->backtracking 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RECOVERFROMMISMATCHEDSET(s) RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s) 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RECOVERFROMMISMATCHEDELEMENT(e) RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s) 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define ADAPTOR INPUT->adaptor 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RULEMEMO PSRSTATE->ruleMemo 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SEEK(n) ISTREAM->seek(ISTREAM, n) 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define INDEX() ISTREAM->index(ISTREAM) 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define DBG RECOGNIZER->debugger 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* The 4 tokens defined below may well clash with your own #defines or token types. If so 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * then for the present you must use different names for your defines as these are hard coded 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in the code generator. It would be better not to use such names internally, and maybe 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * we can change this in a forthcoming release. I deliberately do not #undef these 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * here as this will at least give you a redefined error somewhere if they clash. 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define UP ANTLR3_TOKEN_UP 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define DOWN ANTLR3_TOKEN_DOWN 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define EOR ANTLR3_TOKEN_EOR 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define INVALID ANTLR3_TOKEN_INVALID 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================================================= 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Functions to create and destroy scopes. First come the rule scopes, followed 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * by the global declared scopes. 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules: {r |<if(r.ruleDescriptor.ruleScope)> 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScopeFuncDecl(scope=r.ruleDescriptor.ruleScope)> 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScopeFuncs(scope=r.ruleDescriptor.ruleScope)> 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}> 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.scopes:{it | <if(it.isDynamicGlobalScope)> 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<globalAttributeScopeFuncDecl(it)> 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<globalAttributeScopeFuncs(it)> 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}> 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================================================= */ 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================================================= 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Start of recognizer 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer> 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of code 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ============================================================================= 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 528324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderFileExtension() ::= ".h" 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 530324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderFile( LEXER, 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PARSER, 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TREE_PARSER, 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver actionScope, 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver actions, 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver docComment, 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver recognizer, 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver name, 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens, 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenNames, 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rules, 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cyclicDFAs, 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bitsets, 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buildTemplate, 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buildAST, 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rewriteMode, 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver profile, 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver backtracking, 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver synpreds, 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver memoize, 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numRules, 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fileName, 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLRVersion, 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generatedTimestamp, 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver trace, 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver scopes, 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver superClass, 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver literals 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) ::= 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<< 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<leadIn("C header")> 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The parser <mainName()> 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The lexer <mainName()> 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The tree parser <mainName()> 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas the callable functions (rules) shown below, 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which will invoke the code for the associated rule in the source grammar 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * assuming that the input stream is pointing to a token/text stream that could begin 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this rule. 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For instance if you call the first (topmost) rule in a parser grammar, you will 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * get the results of a full parse, but calling a rule half way through the grammar will 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * allow you to pass part of a full token stream to the parser, such as for syntax checking 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in editors and so on. 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The parser entry points are called indirectly (by function pointer to function) via 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a parser context typedef p<name>, which is returned from a call to <name>New(). 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * As this is a generated lexer, it is unlikely you will call it 'manually'. However 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the methods are provided anyway. 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The methods in p<name> are as follows: 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <rules:{r | <if(!r.ruleDescriptor.isSynPred)> - <headerReturnType(ruleDescriptor=r.ruleDescriptor,...)> p<name>-><r.ruleDescriptor.name>(p<name>)<endif>}; separator="\n * "> 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The return type for any particular rule is of course determined by the source 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar file. 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD license"] 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef _<name>_H 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define _<name>_H 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).preincludes> 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================================================= 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Standard antlr3 C runtime definitions 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include \<antlr3.h> 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of standard antlr 3 runtime definitions 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ============================================================================= 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).includes> 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern "C" { 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Forward declare the context typedef so that we can use it before it is 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// properly defined. Delegators and delegates (from import statements) are 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// interdependent and their context structures contain pointers to each other 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C only allows such things to be declared if you pre-declare the typedef. 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct <name>_Ctx_struct <name>, * p<name>; 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegates)> 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Include delegate definition header files 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.grammar.delegates: {g|#include \<<g.recognizerName>.h>}; separator="\n"> 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.(actionScope).header> 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Disable: Unreferenced parameter, - Rules with parameters that are not used 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually) 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// initialized but unused variable - tree rewrite variables declared but not needed 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Unreferenced local variable - lexer rule declares but does not always use _type 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// potentially unitialized variable used - retval always returned from a rule 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// and the codegen must generate some of these warnings by necessity, apart from 4100, which is 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// usually generated when a parser rule is given a parameter that it does not use. Mostly though 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// this is a matter of orthogonality hence I disable that one. 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4100 ) 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4101 ) 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4127 ) 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4189 ) 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4505 ) 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4701 ) 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)> 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ======================== 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * BACKTRACKING IS ENABLED 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ======================== 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r |<headerReturnScope(ruleDescriptor=r.ruleDescriptor,...)>}> 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)><globalAttributeScopeDecl(it)><endif>}> 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r |<ruleAttributeScopeDecl(scope=r.ruleDescriptor.ruleScope)>}> 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegators)> 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Include delegator definition header files 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.grammar.delegators: {g|#include \<<g.recognizerName>.h>}; separator="\n"> 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Context tracking structure for <mainName()> 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstruct <name>_Ctx_struct 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Built in ANTLR3 context tracker contains all the generic elements 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * required for context tracking. 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_PARSER pParser; 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_LEXER pLexer; 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_TREE_PARSER pTreeParser; 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegates)> 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <recognizer.grammar.delegates: 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|p<g.recognizerName> <g:delegateName()>;}; separator="\n"> 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegators)> 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <recognizer.grammar.delegators: 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|p<g.recognizerName> <g:delegateName()>;}; separator="\n"> 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it | <if(it.isDynamicGlobalScope)> 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <globalAttributeScopeDef(it)> 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}; separator="\n\n"> 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules: {r |<if(r.ruleDescriptor.ruleScope)> 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleAttributeScopeDef(scope=r.ruleDescriptor.ruleScope)> 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}> 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <rules:{r | <if(!r.ruleDescriptor.isSynPred)><headerReturnType(ruleDescriptor=r.ruleDescriptor)> (*m<r.ruleDescriptor.name>) (struct <name>_Ctx_struct * ctx<if(r.ruleDescriptor.parameterScope)>, <endif><r.ruleDescriptor.parameterScope:parameterScope()>);<endif>}; separator="\n"> 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)> 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <rules:{r | <headerReturnType(ruleDescriptor=r.ruleDescriptor)> (*<r.ruleDescriptor.name>) (struct <name>_Ctx_struct * ctx<if(r.ruleDescriptor.parameterScope)>, <endif><r.ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n"> 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! generate rule/method definitions for imported rules so they 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver appear to be defined in this recognizer. !> 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Delegated rules 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.grammar.delegatedRules:{ruleDescriptor| 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <headerReturnType(ruleDescriptor)> (*<ruleDescriptor.name>)(struct <name>_Ctx_struct * ctx<if(ruleDescriptor.parameterScope)>, <endif><ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n"> 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const char * (*getGrammarFileName)(); 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*reset) (struct <name>_Ctx_struct * ctx); 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*free) (struct <name>_Ctx_struct * ctx); 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@members> 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@end> 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <actions.(actionScope).context> 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Function protoypes for the constructor functions that external translation units 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// such as delegators and delegates may wish to call. 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 752324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> <name>New (<inputType()> instream<recognizer.grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>); 753324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> <name>NewSSD (<inputType()> instream, pANTLR3_RECOGNIZER_SHARED_STATE state<recognizer.grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>); 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!recognizer.grammar.grammarIsRoot)> 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern pANTLR3_UINT8 <recognizer.grammar.composite.rootGrammar.recognizerName>TokenNames[]; 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Symbolic definitions of all the tokens that the <grammarType()> will work with. 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \{ 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Antlr will define EOF, but we can't use that as it it is too common in 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in C header files and that would be confusing. There is no way to filter this out at the moment 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * so we just undef it here for now. That isn't the value we get back from C recognizers 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * anyway. We are looking for ANTLR3_TOKEN_EOF. 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef EOF 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EOF 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef Tokens 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef Tokens 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokens:{it | #define <it.name> <it.type>}; separator="\n"> 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef EOF 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef EOF 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define EOF ANTLR3_TOKEN_EOF 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef TOKENSOURCE 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of token definitions for <name> 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ============================================================================= 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \} */ 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* END - Note:Keep extra line feed to satisfy UNIX systems */ 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 798324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinputType() ::=<< 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 800324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_INPUT_STREAM 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 803324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_COMMON_TOKEN_STREAM 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 806324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_COMMON_TREE_NODE_STREAM 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 810324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergrammarType() ::= << 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree parser 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 822324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermainName() ::= << 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name> 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name> 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name> 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 834324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderReturnScope(ruleDescriptor) ::= "<returnScope(...)>" 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 836324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverheaderReturnType(ruleDescriptor) ::= << 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)> 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <returnType()> 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <returnType()> 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Produce the lexer output 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlexer( grammar, 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver name, 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens, 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver scopes, 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rules, 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numRules, 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver filterMode, 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver superClass, 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver labelType="pANTLR3_COMMON_TOKEN") ::= << 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)> 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Forward declare implementation function for ANTLR3_TOKEN_SOURCE interface when 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this is a filter mode lexer. 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN <name>NextToken (pANTLR3_TOKEN_SOURCE toksource); 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Override the normal MEMOIZE and HAVEALREADYPARSED macros as this is a filtering 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * lexer. In filter mode, the memoizing and backtracking are gated at BACKTRACKING > 1 rather 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * than just BACKTRACKING. In some cases this might generate code akin to: 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * if (BACKTRACKING) if (BACKTRACKING > 1) memoize. 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * However, I assume that the C compilers/optimizers are smart enough to work this one out 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * these days - Jim 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef MEMOIZE 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define MEMOIZE(ri,si) if (BACKTRACKING>1) { RECOGNIZER->memoize(RECOGNIZER, ri, si) } 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef HAVEPARSEDRULE 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define HAVEPARSEDRULE(r) if (BACKTRACKING>1) { RECOGNIZER->alreadyParsedRule(RECOGNIZER, r) } 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Forward declare the locally static matching functions we have generated and any predicate functions. 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r | static ANTLR3_INLINE <headerReturnType(ruleDescriptor=r.ruleDescriptor)> <if(!r.ruleDescriptor.isSynPred)>m<endif><r.ruleDescriptor.name> (p<name> ctx<if(r.ruleDescriptor.parameterScope)>, <endif><r.ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n"> 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void <name>Free(p<name> ctx); 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Lexer matching rules end. 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ========================================================================= 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScope(it)><endif>}> 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actions.lexer.members> 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>Free (p<name> ctx) 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (RULEMEMO != NULL) 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RULEMEMO->free(RULEMEMO); 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RULEMEMO = NULL; 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)> 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Free the lexers that we delegated to 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // functions to. NULL the state so we only free it once. 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <grammar.directDelegates: 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|ctx-><g:delegateName()>->pLexer->rec->state = NULL; 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx-><g:delegateName()>->free(ctx-><g:delegateName()>);}; separator="\n"> 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LEXER->free(LEXER); 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(ctx); 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>Reset (p<name> ctx) 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RECOGNIZER->reset(RECOGNIZER); 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Name of the grammar file that generated this code 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const char fileName[] = "<fileName>"; 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Return the name of the grammar file that generated this code. 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const char * getGrammarFileName() 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return fileName; 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)> 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <filteringNextToken()> 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Create a new lexer called <name> 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] instream Pointer to an initialized input stream 940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return 941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - Success p<name> initialized for the lex start 942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - Fail NULL 943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 944324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> <name>New 945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(<inputType()> instream<grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>) 946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // See if we can create a new lexer with the standard constructor 948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return <name>NewSSD(instream, NULL<grammar.delegators:{g|, <g:delegateName()>}>); 950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Create a new lexer called <name> 953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] instream Pointer to an initialized input stream 955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[state] state Previously created shared recognizer stat 956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return 957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - Success p<name> initialized for the lex start 958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - Fail NULL 959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 960324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> <name>NewSSD 961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state<grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>) 962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p<name> ctx; // Context structure we will build and return 964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx = (p<name>) ANTLR3_CALLOC(1, sizeof(<name>)); 966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ctx == NULL) 968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Failed to allocate memory for lexer context 970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* ------------------------------------------------------------------- 974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Memory for basic structure is allocated, now to fill in 975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in base ANTLR3 structures. We initialize the function pointers 976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for the standard ANTLR3 lexer function set, but upon return 977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * from here, the programmer may set the pointers to provide custom 978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * implementations of each function. 979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * We don't use the macros defined in <name>.h here so you can get a sense 981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of what goes where. 982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create a base lexer, using the supplied input stream 985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pLexer = antlr3LexerNewStream(ANTLR3_SIZE_HINT, instream, state); 987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Check that we allocated the memory correctly 989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ctx->pLexer == NULL) 991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(ctx); 993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> 996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)> 997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create a LIST for recording rule memos. 998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pLexer->rec->ruleMemo = antlr3IntTrieNew(15); /* 16 bit depth is enough for 32768 rules! */ 1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install the implementation of our <name> interface 1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <rules:{r | <if(!r.ruleDescriptor.isSynPred)>ctx->m<r.ruleDescriptor.name> = m<r.ruleDescriptor.name>;<endif>}; separator="\n"> 1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** When the nextToken() call is made to this lexer's pANTLR3_TOKEN_SOURCE 1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * it will call mTokens() in this generated code, and will pass it the ctx 1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * pointer of this lexer, not the context of the base lexer, so store that now. 1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pLexer->ctx = ctx; 1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /**Install the token matching function 1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pLexer->mTokens = (void (*) (void *))(mTokens); 1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->getGrammarFileName = getGrammarFileName; 1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->free = <name>Free; 1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->reset = <name>Reset; 1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)> 1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Initialize the lexers that we are going to delegate some 1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // functions to. 1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <grammar.directDelegates: 1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|ctx-><g:delegateName()> = <g.recognizerName>NewSSD(instream, ctx->pLexer->rec->state, ctx<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n"> 1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegators)> 1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Install the pointers back to lexers that will delegate us to perform certain functions 1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // for them. 1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <grammar.delegators: 1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|ctx-><g:delegateName()> = <g:delegateName()>;}; separator="\n"> 1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(filterMode)> 1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* We have filter mode turned on, so install the filtering nextToken function 1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pLexer->rec->state->tokSource->nextToken = <name>NextToken; 1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <actions.lexer.apifuncs> 1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Return the newly built lexer to the caller 1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ctx; 1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(cyclicDFAs)> 1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DFA tables for the lexer 1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !> 1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * End of DFA tables for the lexer 1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Functions to match the lexer grammar defined tokens from the input stream 1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n\n"> 1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Lexer matching rules end. 1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ========================================================================= 1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(synpreds)> 1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Lexer syntactic predicates 1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{p | <lexerSynpred(predname=p)>}> 1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Lexer syntactic predicates end. 1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ========================================================================= 1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Lexer code 1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ================================================ 1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ================================================ 1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1087324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringNextToken() ::= << 1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An override of the lexer's nextToken() method that backtracks over mTokens() looking 1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for matches in lexer filterMode. No error can be generated upon error; just rewind, consume 1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a token and then try again. BACKTRACKING needs to be set as well. 1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Make rule memoization happen only at levels above 1 as we start mTokens 1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * at BACKTRACKING==1. 1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN 1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>NextToken(pANTLR3_TOKEN_SOURCE toksource) 1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_LEXER lexer; 1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_RECOGNIZER_SHARED_STATE state; 1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = (pANTLR3_LEXER)(toksource->super); 1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state = lexer->rec->state; 1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Get rid of any previous token (token factory takes care of 1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * any deallocation when this token is finally used up. 1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state ->token = NULL; 1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state ->error = ANTLR3_FALSE; /* Start out without an exception */ 1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state ->failed = ANTLR3_FALSE; 1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Record the start of the token in our input stream. 1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->tokenStartCharIndex = lexer->input->istream->index(lexer->input->istream); 1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->tokenStartCharPositionInLine = lexer->input->getCharPositionInLine(lexer->input); 1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->tokenStartLine = lexer->input->getLine(lexer->input); 1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->text = NULL; 1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Now call the matching rules and see if we can generate a new token 1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (;;) 1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (lexer->input->istream->_LA(lexer->input->istream, 1) == ANTLR3_CHARSTREAM_EOF) 1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Reached the end of the stream, nothing more to do. 1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN teof = &(toksource->eofToken); 1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver teof->setStartIndex (teof, lexer->getCharIndex(lexer)); 1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver teof->setStopIndex (teof, lexer->getCharIndex(lexer)); 1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver teof->setLine (teof, lexer->getLine(lexer)); 1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return teof; 1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->token = NULL; 1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->error = ANTLR3_FALSE; /* Start out without an exception */ 1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_MARKER m; 1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver m = lexer->input->istream->mark(lexer->input->istream); 1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->backtracking = 1; /* No exceptions */ 1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->failed = ANTLR3_FALSE; 1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Call the generated lexer, see if it can get a new token together. 1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer->mTokens(lexer->ctx); 1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state->backtracking = 0; 1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <! mTokens backtracks with synpred at BACKTRACKING==2 1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver and we set the synpredgate to allow actions at level 1. !> 1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (state->failed == ANTLR3_TRUE) 1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer->input->istream->rewind(lexer->input->istream, m); 1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer->input->istream->consume(lexer->input->istream); <! advance one char and try again !> 1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer->emit(lexer); /* Assemble the token and emit it to the stream */ 1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return state->token; 1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1166324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveractionGate() ::= "BACKTRACKING==0" 1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1168324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfilteringActionGate() ::= "BACKTRACKING==1" 1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a parser */ 1171324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergenericParser( grammar, 1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver name, 1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver scopes, 1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens, 1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenNames, 1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rules, 1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numRules, 1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bitsets, 1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inputStreamType, 1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver superClass, 1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver labelType, 1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver members, 1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rewriteElementType, filterMode, 1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType="pANTLR3_BASE_TREE" 1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) ::= << 1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)> 1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Table of all token names in symbolic order, mainly used for 1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * error reporting. 1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1192324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_UINT8 <name>TokenNames[<length(tokenNames)>+4] 1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver = { 1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (pANTLR3_UINT8) "\<invalid>", /* String to print to indicate an invalid token */ 1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (pANTLR3_UINT8) "\<EOR>", 1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (pANTLR3_UINT8) "\<DOWN>", 1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (pANTLR3_UINT8) "\<UP>", 1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <tokenNames:{it |(pANTLR3_UINT8) <it>}; separator=",\n"> 1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@members> 1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@end> 1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r |<ruleAttributeScopeFuncMacro(scope=r.ruleDescriptor.ruleScope)>}> 1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScopeFuncMacro(it)><endif>}> 1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Forward declare the locally static matching functions we have generated. 1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules:{r | static <headerReturnType(ruleDescriptor=r.ruleDescriptor)> <r.ruleDescriptor.name> (p<name> ctx<if(r.ruleDescriptor.parameterScope)>, <endif><r.ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n"> 1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void <name>Free(p<name> ctx); 1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void <name>Reset (p<name> ctx); 1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)> 1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! generate rule/method definitions for imported rules so they 1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver appear to be defined in this recognizer. !> 1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(recognizer.grammar.delegatedRules)> 1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Delegated rules 1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<recognizer.grammar.delegatedRules:{ruleDescriptor|static <headerReturnType(ruleDescriptor)> <ruleDescriptor.name>(p<name> ctx<if(ruleDescriptor.parameterScope)>, <endif><ruleDescriptor.parameterScope:parameterScope()>);}; separator="\n"> 1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* For use in tree output where we are accumulating rule labels via label += ruleRef 1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * we need a function that knows how to free a return scope when the list is destroyed. 1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro. 1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void ANTLR3_CDECL freeScope(void * scope) 1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(scope); 1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Name of the grammar file that generated this code 1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const char fileName[] = "<fileName>"; 1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Return the name of the grammar file that generated this code. 1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const char * getGrammarFileName() 1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return fileName; 1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Create a new <name> parser and return a context for it. 1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] instream Pointer to an input stream interface. 1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return Pointer to new parser context upon success. 1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1250324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> 1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>New (<inputStreamType> instream<grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>) 1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // See if we can create a new parser with the standard constructor 1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return <name>NewSSD(instream, NULL<grammar.delegators:{g|, <g:delegateName()>}>); 1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Create a new <name> parser and return a context for it. 1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param[in] instream Pointer to an input stream interface. 1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return Pointer to new parser context upon success. 1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1264324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API p<name> 1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>NewSSD (<inputStreamType> instream, pANTLR3_RECOGNIZER_SHARED_STATE state<grammar.delegators:{g|, p<g.recognizerName> <g:delegateName()>}>) 1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p<name> ctx; /* Context structure we will build and return */ 1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx = (p<name>) ANTLR3_CALLOC(1, sizeof(<name>)); 1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ctx == NULL) 1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Failed to allocate memory for parser context 1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* ------------------------------------------------------------------- 1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Memory for basic structure is allocated, now to fill in 1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the base ANTLR3 structures. We initialize the function pointers 1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for the standard ANTLR3 parser function set, but upon return 1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * from here, the programmer may set the pointers to provide custom 1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * implementations of each function. 1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * We don't use the macros defined in <name>.h here, in order that you can get a sense 1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of what goes where. 1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create a base parser/recognizer, using the supplied token stream 1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pParser = antlr3ParserNewStream(ANTLR3_SIZE_HINT, instream->tstream, state); 1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create a base Tree parser/recognizer, using the supplied tree node stream 1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pTreeParser = antlr3TreeParserNewStream(ANTLR3_SIZE_HINT, instream, state); 1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install the implementation of our <name> interface 1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <rules:{r | ctx-><r.ruleDescriptor.name> = <r.ruleDescriptor.name>;}; separator="\n"> 1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegatedRules)> 1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Install the delegated methods so that they appear to be a part of this 1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // parser 1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <grammar.delegatedRules:{ruleDescriptor | ctx-><ruleDescriptor.name> = <ruleDescriptor.name>;}; separator="\n"> 1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->free = <name>Free; 1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->reset = <name>Reset; 1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->getGrammarFileName = getGrammarFileName; 1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install the scope pushing methods. 1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <rules: {r |<if(r.ruleDescriptor.ruleScope)> 1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleAttributeScope(scope=r.ruleDescriptor.ruleScope)><\n> 1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}> 1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <recognizer.scopes:{it |<if(it.isDynamicGlobalScope)> 1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<globalAttributeScope(it)><\n> 1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif>}> 1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@apifuncs> 1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@end> 1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)> 1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Initialize the parsers that we are going to delegate some 1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // functions to. 1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <grammar.directDelegates: 1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|ctx-><g:delegateName()> = <g.recognizerName>NewSSD(instream, PSRSTATE, ctx<grammar.delegators:{g|, <g:delegateName()>}>);}; separator="\n"> 1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegators)> 1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Install the pointers back to parsers that will delegate us to perform certain functions 1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // for them. 1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <grammar.delegators: 1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g|ctx-><g:delegateName()> = <g:delegateName()>;}; separator="\n"> 1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <actions.parser.apifuncs> 1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <actions.treeparser.apifuncs> 1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> 1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)> 1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create a LIST for recording rule memos. 1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RULEMEMO = antlr3IntTrieNew(15); /* 16 bit depth is enough for 32768 rules! */<\n> 1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install the token table 1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PSRSTATE->tokenNames = <grammar.composite.rootGrammar.recognizerName>TokenNames; 1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@debugStuff()> 1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Return the newly built parser to the caller 1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ctx; 1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>Reset (p<name> ctx) 1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RECOGNIZER->reset(RECOGNIZER); 1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Free the parser resources 1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static void 1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <name>Free(p<name> ctx) 1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Free any scope memory 1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <rules: {r |<if(r.ruleDescriptor.ruleScope)><ruleAttributeScopeFree(scope=r.ruleDescriptor.ruleScope)><\n><endif>}> 1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <recognizer.scopes:{it |<if(it.isDynamicGlobalScope)><globalAttributeScopeFree(it)><\n><endif>}> 1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@cleanup> 1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@end> 1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.directDelegates)> 1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Free the parsers that we delegated to 1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // functions to.NULL the state so we only free it once. 1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <grammar.directDelegates: 1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {g| ctx-><g:delegateName()>-><if(TREE_PARSER)>pTreeParser<else>pParser<endif>->rec->state = NULL; 1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx-><g:delegateName()>->free(ctx-><g:delegateName()>);}; separator="\n"> 1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> 1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.grammarIsRoot)> 1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (RULEMEMO != NULL) 1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RULEMEMO->free(RULEMEMO); 1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RULEMEMO = NULL; 1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Free this parser 1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pTreeParser->free(ctx->pTreeParser);<\n> 1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx->pParser->free(ctx->pParser);<\n> 1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(ctx); 1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Everything is released, so we can return 1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 1407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Return token names used by this <grammarType()> 1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The returned pointer is used as an index into the token names table (using the token 1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * number as the index). 1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \return Pointer to first char * in the table. 1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_UINT8 *getTokenNames() 1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return <grammar.composite.rootGrammar.recognizerName>TokenNames; 1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <members> 1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Declare the bitsets 1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<bitsets:{it | <bitsetDeclare(name={FOLLOW_<it.name>_in_<it.inName><it.tokenIndex>}, 1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver words64=it.bits)>}> 1427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(cyclicDFAs)> 1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DFA tables for the parser 1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<cyclicDFAs:cyclicDFA()> <! dump tables for all DFA !> 1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ========================================================================= 1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * End of DFA tables for the parser 1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================== 1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Parsing rules 1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<rules; separator="\n\n"> 1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(grammar.delegatedRules)> 1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Delegated methods that appear to be a part of this 1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // parser 1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<grammar.delegatedRules:{ruleDescriptor| 1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <returnType()> <ruleDescriptor.name>(p<name> ctx<if(ruleDescriptor.parameterScope.attributes)>, <endif><ruleDescriptor.parameterScope:parameterScope()>) 1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(ruleDescriptor.hasReturnValue)>return <endif> ctx-><ruleDescriptor.grammar:delegateName()>-><ruleDescriptor.name>(ctx-><ruleDescriptor.grammar:delegateName()><if(ruleDescriptor.parameterScope.attributes)>, <endif><ruleDescriptor.parameterScope.attributes:{a|<a.name>}; separator=", ">); 1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver \}}; separator="\n"> 1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of parsing rules 1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ============================================== 1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ============================================== 1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Syntactic predicates 1461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpreds:{p | <synpred(predname=p)>}> 1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of syntactic predicates 1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ============================================== 1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser( grammar, 1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver name, 1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver scopes, 1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens, 1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenNames, 1478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rules, 1479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numRules, 1480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bitsets, 1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType, 1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver superClass="Parser", 1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver labelType="pANTLR3_COMMON_TOKEN", 1484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver members={<actions.parser.members>} 1485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) ::= << 1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="pANTLR3_COMMON_TOKEN_STREAM", rewriteElementType="TOKEN", ...)> 1487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a tree parser; same as parser except the input 1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * stream is a different type. 1491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1492324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertreeParser( grammar, 1493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver name, 1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver scopes, 1495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens, 1496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenNames, 1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver globalAction, 1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rules, 1499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numRules, 1500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bitsets, 1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver filterMode, 1502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver labelType={<ASTLabelType>}, 1503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType="pANTLR3_BASE_TREE", 1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver superClass="TreeParser", 1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver members={<actions.treeparser.members>} 1506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) ::= << 1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<genericParser(inputStreamType="pANTLR3_COMMON_TREE_NODE_STREAM", rewriteElementType="NODE", ...)> 1508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simpler version of a rule template that is specific to the imaginary 1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * rules created for syntactic predicates. As they never have return values 1512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * nor parameters etc..., just give simplest possible method. Don't do 1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * any of the normal memoization stuff in here either; it's a waste. 1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * As predicates cannot be inlined into the invoking rule, they need to 1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * be in a rule by themselves. 1516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1517324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversynpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::= 1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<< 1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR start <ruleName> 1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void <ruleName>_fragment(p<name> ctx <ruleDescriptor.parameterScope:parameterScope()>) 1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleLabelDefs()> 1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleLabelInitializations()> 1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(trace)> 1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_PRINTF("enter <ruleName> %d failed = %d, backtracking = %d\\n",LT(1),failed,BACKTRACKING); 1526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <block> 1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_PRINTF("exit <ruleName> %d, failed = %d, backtracking = %d\\n",LT(1),failed,BACKTRACKING); 1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <block> 1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleCleanUp()> 1533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end <ruleName> 1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversynpred(predname) ::= << 1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BOOLEAN <predname>(p<name> ctx) 1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_MARKER start; 1541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_BOOLEAN success; 1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BACKTRACKING++; 1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@start()> 1545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start = MARK(); 1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <predname>_fragment(ctx); // can never throw exception 1547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver success = !(FAILEDFLAG); 1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver REWIND(start); 1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@stop()> 1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BACKTRACKING--; 1551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAILEDFLAG = ANTLR3_FALSE; 1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return success; 1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n> 1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1556324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerSynpred(predname) ::= << 1557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<synpred(predname)> 1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1560324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleMemoization(rname) ::= << 1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> 1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( (BACKTRACKING>0) && (HAVEPARSEDRULE(<ruleDescriptor.index>)) ) 1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)> 1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver retval.start = 0;<\n> 1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <(ruleDescriptor.actions.after):execAfter()> 1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <finalCode(finalBlock=finally)> 1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)> 1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <scopeClean()><\n> 1573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return <ruleReturnValue()>; 1575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to test for failure and return from rule */ 1580324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercheckRuleBacktrackFailure() ::= << 1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (HASEXCEPTION()) 1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver goto rule<ruleDescriptor.name>Ex; 1584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)> 1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (HASFAILED()) 1587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <scopeClean()> 1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@debugClean()> 1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return <ruleReturnValue()>; 1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This rule has failed, exit indicating failure during backtrack */ 1596324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBacktrackFailure() ::= << 1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)> 1598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (BACKTRACKING>0) 1599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAILEDFLAG = <true_value()>; 1601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <scopeClean()> 1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return <ruleReturnValue()>; 1603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for a rule. This includes any return type 1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * data aggregates required for multiple return values. 1609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule(ruleName,ruleDescriptor,block,emptyRule,description,exceptions,finally,memoize) ::= << 1611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 1612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * $ANTLR start <ruleName> 1613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <fileName>:<description> 1614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic <returnType()> 1616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleName>(p<name> ctx<if(ruleDescriptor.parameterScope)>, <endif><ruleDescriptor.parameterScope:parameterScope()>) 1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(trace)>ANTLR3_PRINTF("enter <ruleName> %s failed=%d, backtracking=%d\n", LT(1), BACKTRACKING);<endif> 1619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDeclarations()> 1620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor.actions.declarations> 1621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleLabelDefs()> 1622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleInitializations()> 1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor.actions.init> 1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleMemoization(rname=ruleName)> 1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleLabelInitializations()> 1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@preamble()> 1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <block> 1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleCleanUp()> 1632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(exceptions)> 1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (HASEXCEPTION()) 1634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <exceptions:{e|<catch(decl=e.decl,action=e.action)><\n>}> 1636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 1638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <(ruleDescriptor.actions.after):execAfter()> 1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 1642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(!emptyRule)> 1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(actions.(actionScope).rulecatch)> 1644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <actions.(actionScope).rulecatch> 1645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <else> 1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (HASEXCEPTION()) 1647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PREPORTERROR(); 1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PRECOVER(); 1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@setErrorReturnValue()> 1651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(ruleDescriptor.actions.after)> 1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 1654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <(ruleDescriptor.actions.after):execAfter()> 1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }<\n> 1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <endif> 1658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <endif> 1659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <endif> 1660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(trace)>ANTLR3_PRINTF("exit <ruleName> %d failed=%s backtracking=%s\n", LT(1), failed, BACKTRACKING);<endif> 1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <memoize()> 1664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(finally)> 1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <finalCode(finalBlock=finally)> 1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <scopeClean()> 1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@postamble()> 1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return <ruleReturnValue()>; 1670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* $ANTLR end <ruleName> */ 1672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1674324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfinalCode(finalBlock) ::= << 1675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <finalBlock> 1677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercatch(decl,action) ::= << 1682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* catch(decl,action) 1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <e.action> 1686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1690324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleDeclarations() ::= << 1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<returnType()> retval;<\n> 1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a | 1695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<a.type> <a.name>; 1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}> 1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> 1699324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_UINT32 <ruleDescriptor.name>_StartIndex; 1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1703324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleInitializations() ::= << 1704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Initialize rule variables 1705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 1707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a | 1708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(a.initValue)>retval.<a.name> = <a.initValue>;<endif> 1709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}> 1710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 1711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.returnScope.attributes:{ a | 1712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(a.initValue)><a.name> = <a.initValue>;<endif> 1713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}> 1714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> 1716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.name>_StartIndex = INDEX();<\n> 1717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it |<scopeTop(it)> = <scopePush(it)>;}; separator="\n"> 1719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{it |<scopeTop(it.name)> = <scopePush(it.name)>;}; separator="\n"> 1720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1722324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDefs() ::= << 1723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels] 1724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |<labelType> <it.label.text>;}; separator="\n" 1725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels] 1727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |pANTLR3_VECTOR list_<it.label.text>;}; separator="\n" 1728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.ruleLabels,ruleDescriptor.ruleListLabels] 1730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :ruleLabelDef(); separator="\n" 1731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1734324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelInitializations() ::= << 1735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels,ruleDescriptor.tokenListLabels] 1736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |<it.label.text> = NULL;}; separator="\n" 1737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels,ruleDescriptor.ruleListLabels] 1739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |list_<it.label.text> = NULL;}; separator="\n" 1740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.ruleLabels,ruleDescriptor.ruleListLabels] 1742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :ruleLabelInitVal(); separator="\n" 1743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 1745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)> 1746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.start = LT(1); retval.stop = retval.start;<\n> 1747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1751324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelDefs() ::= << 1752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels, 1753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.tokenListLabels, 1754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleLabels] 1755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |<labelType> <it.label.text>;}; separator="\n" 1756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.charLabels:{it |ANTLR3_UINT32 <it.label.text>;}; separator="\n"> 1758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels, 1759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleListLabels, 1760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleListLabels] 1761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |pANTLR3_INT_TRIE list_<it.label.text>;}; separator="\n" 1762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1765324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelInit() ::= << 1766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels, 1767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.tokenListLabels, 1768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleLabels] 1769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |<it.label.text> = NULL;}; separator="\n" 1770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels, 1772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleListLabels, 1773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleListLabels] 1774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |list_<it.label.text> = antlr3IntTrieNew(31);}; separator="\n" 1775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1778324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelFree() ::= << 1779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenLabels, 1780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.tokenListLabels, 1781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleLabels] 1782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |<it.label.text> = NULL;}; separator="\n" 1783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<[ruleDescriptor.tokenListLabels, 1785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleListLabels, 1786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ruleDescriptor.ruleListLabels] 1787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver :{it |list_<it.label.text>->free(list_<it.label.text>);}; separator="\n" 1788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver> 1789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1791324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleReturnValue() ::= <% 1792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)> 1793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasReturnValue)> 1794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)> 1795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnName> 1796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 1797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval 1798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%> 1802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermemoize() ::= << 1804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(memoize)> 1805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)> 1806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( BACKTRACKING>0 ) { MEMOIZE(<ruleDescriptor.index>, <ruleDescriptor.name>_StartIndex); } 1807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1811324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleCleanUp() ::= << 1812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// This is where rules clean up and exit 1814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvergoto rule<ruleDescriptor.name>Ex; /* Prevent compiler warnings */ 1816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrule<ruleDescriptor.name>Ex: ; 1817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 1818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)> 1819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)> 1820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.stop = LT(-1);<\n> 1821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1826324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeClean() ::= << 1827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.useScopes:{it |<scopePop(it)>}; separator="\n"> 1828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.ruleScope:{it |<scopePop(it.name)>}; separator="\n"> 1829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate a rule in the lexer; naked blocks are used for 1832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * fragment rules, which do not produce tokens. 1833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1834324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRule(ruleName,nakedBlock,ruleDescriptor,block,memoize) ::= << 1835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Comes from: <block.description> 1836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Lexer rule generated by ANTLR3 1837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * $ANTLR start <ruleName> 1839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Looks to match the characters the constitute the token <ruleName> 1841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * from the attached input stream. 1842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \remark 1845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * - lexer->error == ANTLR3_TRUE if an exception was thrown. 1846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INLINE 1848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid m<ruleName>(p<name> ctx<if(ruleDescriptor.parameterScope)>, <endif><ruleDescriptor.parameterScope:parameterScope()>) 1849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 _type; 1851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDeclarations()> 1852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor.actions.declarations> 1853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <lexerRuleLabelDefs()> 1854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(trace)>System.out.println("enter <ruleName> '"+(char)LA(1)+"' line="+GETLINE()+":"+GETCHARPOSITIONINLINE()+" failed="+failed+" backtracking="+BACKTRACKING);<endif> 1855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nakedBlock)> 1857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleMemoization(rname=ruleName)> 1858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <lexerRuleLabelInit()> 1859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor.actions.init> 1860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <block><\n> 1862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 1863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleMemoization(rname=ruleName)> 1864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <lexerRuleLabelInit()> 1865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _type = <ruleName>; 1866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor.actions.init> 1868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <block> 1870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LEXSTATE->type = _type; 1871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 1872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(trace)> ANTLR3_FPRINTF(stderr, "exit <ruleName> '%c' line=%d:%d failed = %d, backtracking =%d\n",LA(1),GETLINE(),GETCHARPOSITIONINLINE(),failed,BACKTRACKING);<endif> 1873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleCleanUp()> 1874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <lexerRuleLabelFree()> 1875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <(ruleDescriptor.actions.after):execAfter()> 1876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <memoize> 1877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// $ANTLR end <ruleName> 1879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to generate code for the implicitly-defined lexer grammar rule 1882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * that chooses between lexer rules. 1883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1884324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokensRule(ruleName,nakedBlock,args,block,ruleDescriptor) ::= << 1885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This is the entry point in to the lexer from an object that 1886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * wants to generate the next token, such as a pCOMMON_TOKEN_STREAM 1887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 1889324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermTokens(p<name> ctx) 1890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <block><\n> 1892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver goto ruleTokensEx; /* Prevent compiler warnings */ 1894324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleTokensEx: ; 1895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// S U B R U L E S 1899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (...) subrule with multiple alternatives */ 1901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverblock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= << 1902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> 1904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int alt<decisionNumber>=<maxAlt>; 1906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <decls> 1907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@predecision()> 1908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <decision> 1909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@postdecision()> 1910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@prebranch()> 1911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (alt<decisionNumber>) 1912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <alts:{a | <altSwitchCase(i,a)>}> 1914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@postbranch()> 1916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A rule block with multiple alternatives */ 1920324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= << 1921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // <fileName>:<description> 1923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 alt<decisionNumber>; 1925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alt<decisionNumber>=<maxAlt>; 1927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <decls> 1929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@predecision()> 1930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <decision> 1931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@postdecision()> 1932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (alt<decisionNumber>) 1933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <alts:{a | <altSwitchCase(i,a)>}> 1935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1939324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleBlockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= << 1940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> 1941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls> 1942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()> 1943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts> 1944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()> 1945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A special case of a (...) subrule with a single alternative */ 1948324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverblockSingleAlt(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,description) ::= << 1949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> 1950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls> 1951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prealt()> 1952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<alts> 1953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postalt()> 1954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)+ block with 1 or more alternatives */ 1957324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= << 1958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> 1959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int cnt<decisionNumber>=0; 1961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <decls> 1962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@preloop()> 1963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (;;) 1965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int alt<decisionNumber>=<maxAlt>; 1967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@predecision()> 1968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <decision> 1969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@postdecision()> 1970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (alt<decisionNumber>) 1971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <alts:{a | <altSwitchCase(i,a)>}> 1973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 1974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( cnt<decisionNumber> >= 1 ) 1976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 1977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver goto loop<decisionNumber>; 1978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleBacktrackFailure()> 1980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <earlyExitEx()> 1981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@earlyExitException()> 1982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver goto rule<ruleDescriptor.name>Ex; 1983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cnt<decisionNumber>++; 1985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver loop<decisionNumber>: ; /* Jump to here if this rule does not match */ 1987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@postloop()> 1988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1991324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverearlyExitEx() ::= << 1992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* mismatchedSetEx() 1993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 1994324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCONSTRUCTEX(); 1995324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION; 1996324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME; 1997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n> 1998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 1999324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpositiveClosureBlockSingleAlt ::= positiveClosureBlock 2000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A (..)* block with 1 or more alternatives */ 2002324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlock(alts,decls,decision,enclosingBlockLevel,blockLevel,decisionNumber,maxK,maxAlt,description) ::= << 2003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> 2005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<decls> 2006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@preloop()> 2008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfor (;;) 2009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int alt<decisionNumber>=<maxAlt>; 2011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@predecision()> 2012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <decision> 2013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@postdecision()> 2014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (alt<decisionNumber>) 2015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <alts:{a | <altSwitchCase(i,a)>}> 2017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 2018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver goto loop<decisionNumber>; /* break out of the loop */ 2019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 2020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverloop<decisionNumber>: ; /* Jump out to here if this rule does not match */ 2023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@postloop()> 2024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2026324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverclosureBlockSingleAlt ::= closureBlock 2027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Optional blocks (x)? are translated to (x|) by antlr before code generation 2029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * so we can just use the normal block template 2030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2031324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlock ::= block 2032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2033324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveroptionalBlockSingleAlt ::= block 2034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A case in a switch that jumps to an alternative given the alternative 2036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * number. A DFA predicts the alternative and then a simple switch 2037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * does the jump to the code that actually matches that alternative. 2038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2039324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraltSwitchCase(altNum,alt) ::= << 2040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercase <altNum>: 2041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@prealt()> 2042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <alt> 2043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break;<\n> 2044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An alternative is just a list of elements; at outermost level */ 2047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= << 2048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// <fileName>:<description> 2049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@declarations()> 2051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@initializations()> 2052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <elements:element()> 2053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <rew> 2054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@cleanup()> 2055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// E L E M E N T S 2059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What to emit when there is no rewrite. For auto build 2060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * mode, does nothing. 2061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2062324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoRewrite(rewriteBlockLevel, treeLevel) ::= "" 2063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dump the elements one per line */ 2065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelement(e) ::= << 2066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@prematch()> 2067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<e.el><\n> 2068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a token optionally with a label in front */ 2071324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRef(token,label,elementIndex,terminalOptions) ::= << 2072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label> = (<labelType>)<endif> MATCHT(<token>, &FOLLOW_<token>_in_<ruleName><elementIndex>); 2073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID */ 2077324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenRefAndListLabel(token,label,elementIndex,terminalOptions) ::= << 2078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<tokenRef(...)> 2079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)> 2080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2082324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabel(label,elem) ::= << 2083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif (list_<label> == NULL) 2084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver list_<label>=ctx->vectors->newVector(ctx->vectors); 2086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlist_<label>->add(list_<label>, <elem>, NULL); 2088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character */ 2092324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRef(char,label) ::= << 2093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 2094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = LA(1);<\n> 2095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2096324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHC(<char>); 2097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match a character range */ 2101324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercharRangeRef(a,b,label) ::= << 2102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 2103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = LA(1);<\n> 2104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2105324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHRANGE(<a>, <b>); 2106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** For now, sets are interval tests and must be tested inline */ 2110324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSet(s,label,elementIndex,terminalOptions,postmatchCode="") ::= << 2111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 2112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 2113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>= LA(1);<\n> 2114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)LT(1);<\n> 2116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <s> ) 2119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CONSUME(); 2121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <postmatchCode> 2122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!LEXER)> 2123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERRORRECOVERY=ANTLR3_FALSE; 2124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(backtracking)>FAILEDFLAG=ANTLR3_FALSE;<\n><endif> 2126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverelse 2128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleBacktrackFailure()> 2130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <mismatchedSetEx()> 2131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@mismatchedSetException()> 2132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(LEXER)> 2133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LRECOVER(); 2134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! use following code to make it recover inline; 2136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_<ruleName><elementIndex>); 2137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver!> 2138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver goto rule<ruleDescriptor.name>Ex; 2140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n> 2141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2143324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermismatchedSetEx() ::= << 2144324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCONSTRUCTEX(); 2145324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION; 2146324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME; 2147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(PARSER)> 2148324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->expectingSet = NULL; 2149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<! use following code to make it recover inline; 2150324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->expectingSet = &FOLLOW_set_in_<ruleName><elementIndex>; 2151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver!> 2152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2155324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchRuleBlockSet ::= matchSet 2156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2157324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermatchSetAndListLabel(s,label,elementIndex,postmatchCode) ::= << 2158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<matchSet(...)> 2159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)> 2160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a string literal */ 2163324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerStringRef(string,label,elementIndex) ::= << 2164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 2165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>Start = GETCHARINDEX(); 2166324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHS(<string>); 2167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory); 2169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>->setType(<label>, ANTLR3_TOKEN_INVALID); 2170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>->setStartIndex(<label>, <label>Start); 2171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>->setStopIndex(<label>, GETCHARINDEX()-1); 2172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>->input = INPUT->tnstream->istream; 2173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2174324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHS(<string>); 2175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()><\n> 2176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwildcard(token,label,elementIndex,terminalOptions) ::= << 2180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 2181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label>=(<labelType>)LT(1);<\n> 2182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2183324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHANYT(); 2184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2187324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardAndListLabel(token,label,elementIndex,terminalOptions) ::= << 2188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcard(...)> 2189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)> 2190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match . wildcard in lexer */ 2193324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardChar(label, elementIndex) ::= << 2194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 2195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<label> = LA(1);<\n> 2196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2197324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHANY(); 2198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2201324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverwildcardCharListLabel(label, elementIndex) ::= << 2202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<wildcardChar(...)> 2203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)> 2204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Match a rule reference by invoking it possibly with arguments 2207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and a return value or values. The 'rule' argument was the 2208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * target rule name, but now is type Rule, whose toString is 2209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * same: the rule name. Now though you can access full rule 2210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * descriptor stuff. 2211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2212324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRef(rule,label,elementIndex,args,scope) ::= << 2213324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFOLLOWPUSH(FOLLOW_<rule.name>_in_<ruleName><elementIndex>); 2214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)><label>=<endif><if(scope)>ctx-><scope:delegateName()>-><endif><rule.name>(ctx<if(scope)>-><scope:delegateName()><endif><if(args)>, <args; separator=", "><endif>);<\n> 2215324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverFOLLOWPOP(); 2216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=r */ 2220324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= << 2221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleRef(...)> 2222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)> 2223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A lexer rule reference 2226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The 'rule' argument was the target rule name, but now 2227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is type Rule, whose toString is same: the rule name. 2228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Now though you can access full rule descriptor stuff. 2229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2230324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRef(rule,label,args,elementIndex,scope) ::= << 2231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* <description> */ 2232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 2233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_MARKER <label>Start<elementIndex> = GETCHARINDEX(); 2235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(scope)>ctx-><scope:delegateName()>-><endif>m<rule.name>(ctx<if(scope)>-><scope:delegateName()><endif> <if(args)>, <endif><args; separator=", ">); 2236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <checkRuleBacktrackFailure()> 2237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label> = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory); 2238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>->setType(<label>, ANTLR3_TOKEN_INVALID); 2239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>->setStartIndex(<label>, <label>Start<elementIndex>); 2240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>->setStopIndex(<label>, GETCHARINDEX()-1); 2241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>->input = INPUT; 2242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope)>ctx-><scope:delegateName()>-><endif>m<rule.name>(ctx<if(scope)>-><scope:delegateName()><endif> <if(args)>, <endif><args; separator=", ">); 2245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** i+=INT in lexer */ 2250324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleRefAndListLabel(rule,label,args,elementIndex,scope) ::= << 2251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<lexerRuleRef(...)> 2252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<listLabel(elem=label,...)> 2253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** EOF in the lexer */ 2256324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerMatchEOF(label,elementIndex) ::= << 2257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(label)> 2258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 <label>Start<elementIndex>; 2260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <labelType> <label>; 2261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>Start<elementIndex> = GETCHARINDEX(); 2262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MATCHC(ANTLR3_CHARSTREAM_EOF); 2263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <checkRuleBacktrackFailure()> 2264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label> = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory); 2265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>->setType(<label>, ANTLR3_TOKEN_EOF); 2266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>->setStartIndex(<label>, <label>Start<elementIndex>); 2267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>->setStopIndex(<label>, GETCHARINDEX()-1); 2268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <label>->input = INPUT->tnstream->istream; 2269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MATCHC(ANTLR3_CHARSTREAM_EOF); 2272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <checkRuleBacktrackFailure()> 2273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <endif> 2274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// used for left-recursive rules 2277324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleDefArg() ::= "int <recRuleArg()>" 2278324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleArg() ::= "_p" 2279324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleAltPredicate(ruleName,opPrec) ::= "<recRuleArg()> \<= <opPrec>" 2280324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetResultAction() ::= "root_0=$<ruleName>_primary.tree;" 2281324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecRuleSetReturnAction(src,name) ::= "$<name>=$<src>.<name>;" 2282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** match ^(root children) in tree parser */ 2284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertree(root, actionsAfterRoot, children, nullableChildList, enclosingTreeLevel, treeLevel) ::= << 2285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<root:element()> 2286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<actionsAfterRoot:element()> 2287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(nullableChildList)> 2288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( LA(1)==ANTLR3_TOKEN_DOWN ) { 2289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MATCHT(ANTLR3_TOKEN_DOWN, NULL); 2290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <checkRuleBacktrackFailure()> 2291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <children:element()> 2292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MATCHT(ANTLR3_TOKEN_UP, NULL); 2293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <checkRuleBacktrackFailure()> 2294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2296324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHT(ANTLR3_TOKEN_DOWN, NULL); 2297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<children:element()> 2299324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMATCHT(ANTLR3_TOKEN_UP, NULL); 2300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Every predicate is used as a validating predicate (even when it is 2305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * also hoisted into a prediction expression). 2306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2307324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvervalidateSemanticPredicate(pred,description) ::= << 2308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( !(<evalPredicate(...)>) ) 2309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleBacktrackFailure()> 2311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <newFPE(...)> 2312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2315324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewFPE() ::= << 2316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CONSTRUCTEX(); 2317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EXCEPTION->type = ANTLR3_FAILED_PREDICATE_EXCEPTION; 2318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EXCEPTION->message = (void *)"<description>"; 2319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EXCEPTION->ruleName = (void *)"<ruleName>"; 2320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <\n> 2321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d D F A (if-then-else) 2324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2325324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= << 2326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int LA<decisionNumber>_<stateNumber> = LA(<k>); 2329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <edges; separator="\nelse "> 2330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)> 2333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alt<decisionNumber>=<eotPredictsAlt>; 2334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleBacktrackFailure()> 2336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <newNVException()> 2338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver goto rule<ruleDescriptor.name>Ex; 2339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2345324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewNVException() ::= << 2346324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCONSTRUCTEX(); 2347324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION; 2348324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->message = (void *)"<description>"; 2349324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->decisionNum = <decisionNumber>; 2350324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverEXCEPTION->state = <stateNumber>; 2351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@noViableAltException()> 2352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<\n> 2353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Same as a normal DFA state except that we don't examine lookahead 2356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for the bypass alternative. It delays error detection but this 2357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is faster, smaller, and more what people expect. For (X)? people 2358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * expect "if ( LA(1)==X ) match(X);" and that's it. 2359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2360324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= << 2361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int LA<decisionNumber>_<stateNumber> = LA(<k>); 2363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <edges; separator="\nelse "> 2364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state that is actually the loopback decision of a closure 2368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * loop. If end-of-token (EOT) predicts any of the targets then it 2369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * should act like a default clause (i.e., no error can be generated). 2370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is used only in the lexer so that for ('a')* on the end of a rule 2371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * anything other than 'a' predicts exiting. 2372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2374324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateDecls()::= << 2375324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_UINT32 LA<decisionNumber>_<stateNumber>; 2376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2377324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= << 2378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState) 2380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int LA<decisionNumber>_<stateNumber> = LA(<k>); 2382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <edges; separator="\nelse "><\n> 2383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(eotPredictsAlt)> 2384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(!edges)> 2385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alt<decisionNumber>=<eotPredictsAlt>; <! if no edges, don't gen ELSE !> 2386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <else> 2387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alt<decisionNumber>=<eotPredictsAlt>; 2390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }<\n> 2391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <endif> 2392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <endif> 2393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An accept state indicates a unique alternative has been predicted */ 2397324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaAcceptState(alt) ::= "alt<decisionNumber>=<alt>;" 2398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A simple edge with an expression. If the expression is satisfied, 2400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * enter to the target state. To handle gated productions, we may 2401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * have to evaluate some predicates for this edge. 2402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2403324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdge(labelExpr, targetState, predicates) ::= << 2404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <if(predicates)>(<predicates>) && <endif>(<labelExpr>)) 2405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <targetState> 2407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// F i x e d D F A (switch case) 2411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A DFA state where a SWITCH may be generated. The code generator 2413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * decides if this is possible: CodeGenerator.canGenerateSwitch(). 2414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2415324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= << 2416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( LA(<k>) ) 2417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n"> 2419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault: 2421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)> 2422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alt<decisionNumber>=<eotPredictsAlt>; 2423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleBacktrackFailure()> 2425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <newNVException()> 2426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver goto rule<ruleDescriptor.name>Ex;<\n> 2427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n> 2429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2431324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaOptionalBlockStateSwitch(k,edges,eotPredictsAlt,description,stateNumber,semPredState) ::= << 2432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( LA(<k>) ) 2433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <edges; separator="\n"> 2435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n> 2436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2438324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaLoopbackStateSwitch(k, edges,eotPredictsAlt,description,stateNumber,semPredState) ::= << 2439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverswitch ( LA(<k>) ) 2440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<edges; separator="\n"><\n> 2442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(eotPredictsAlt)> 2443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdefault: 2444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alt<decisionNumber>=<eotPredictsAlt>; 2445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break;<\n> 2446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n> 2448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2450324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaEdgeSwitch(labels, targetState) ::= << 2451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<labels:{it |case <it>:}; separator="\n"> 2452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <targetState> 2454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 2456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// C y c l i c D F A 2459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** The code to initiate execution of a cyclic DFA; this is used 2461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in the rule to predict an alt just like the fixed DFA case. 2462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The <name> attribute is inherited via the parser, lexer, ... 2463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2464324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdfaDecision(decisionNumber,description) ::= << 2465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveralt<decisionNumber> = cdfa<decisionNumber>.predict(ctx, RECOGNIZER, ISTREAM, &cdfa<decisionNumber>); 2466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<checkRuleBacktrackFailure()> 2467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Dump DFA tables as static initialized arrays of shorts(16 bits)/characters(8 bits) 2470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which are then used to statically initialize the dfa structure, which means that there 2471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is no runtime initialization whatsoever, other than anything the C compiler might 2472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * need to generate. In general the C compiler will lay out memory such that there is no 2473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * runtime code required. 2474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2475324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFA(dfa) ::= << 2476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Static dfa state tables for Cyclic dfa: 2477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <dfa.description> 2478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_eot[<dfa.numberOfStates>] = 2480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.eot; wrap="\n", separator=", ", null="-1"> 2482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 2483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_eof[<dfa.numberOfStates>] = 2484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.eof; wrap="\n", separator=", ", null="-1"> 2486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 2487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_min[<dfa.numberOfStates>] = 2488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.min; wrap="\n", separator=", ", null="-1"> 2490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 2491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_max[<dfa.numberOfStates>] = 2492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.max; wrap="\n", separator=", ", null="-1"> 2494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 2495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_accept[<dfa.numberOfStates>] = 2496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.accept; wrap="\n", separator=", ", null="-1"> 2498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 2499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_special[<dfa.numberOfStates>] = 2500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.special; wrap="\n", separator=", ", null="-1"> 2502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 2503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Used when there is no transition table entry for a particular state */ 2505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define dfa<dfa.decisionNumber>_T_empty NULL 2506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<dfa.edgeTransitionClassMap.keys:{ table | 2508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 dfa<dfa.decisionNumber>_T<i0>[] = 2509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <table; separator=", ", wrap="\n", null="-1"> 2511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver \};<\n>}; null = ""> 2512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Transition tables are a table of sub tables, with some tables 2514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * reused for efficiency. 2515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic const ANTLR3_INT32 * const dfa<dfa.decisionNumber>_transitions[] = 2517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.transitionEdgeTables:{xref|dfa<dfa.decisionNumber>_T<xref>}; separator=", ", wrap="\n", null="NULL"> 2519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; 2520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)> 2522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INT32 dfa<dfa.decisionNumber>_sst(p<name> ctx, pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA dfa, ANTLR3_INT32 s) 2523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 _s; 2525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _s = s; 2527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (s) 2528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.specialStateSTs:{state | 2530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case <i0>: 2531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <state>}; separator="\n"> 2533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)> 2535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (BACKTRACKING > 0) 2536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAILEDFLAG = ANTLR3_TRUE; 2538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return -1; 2539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CONSTRUCTEX(); 2543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION; 2544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EXCEPTION->message = (void *)"<dfa.description>"; 2545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EXCEPTION->decisionNum = <dfa.decisionNumber>; 2546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EXCEPTION->state = _s; 2547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@noViableAltException()> 2548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return -1; 2549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<@errorMethod()> 2553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Declare tracking structure for Cyclic DFA <dfa.decisionNumber> 2555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic 2557324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_CYCLIC_DFA cdfa<dfa.decisionNumber> 2558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver = { 2559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <dfa.decisionNumber>, /* Decision number of this dfa */ 2560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Which decision this represents: */ 2561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (const pANTLR3_UCHAR)"<dfa.description>", 2562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(dfa.specialStateSTs)> 2563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (CDFA_SPECIAL_FUNC) dfa<dfa.decisionNumber>_sst, 2564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (CDFA_SPECIAL_FUNC) antlr3dfaspecialStateTransition, /* Default special state transition function */ 2566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3dfaspecialTransition, /* DFA specialTransition is currently just a default function in the runtime */ 2569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3dfapredict, /* DFA simulator function is in the runtime */ 2570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dfa<dfa.decisionNumber>_eot, /* EOT table */ 2571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dfa<dfa.decisionNumber>_eof, /* EOF table */ 2572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dfa<dfa.decisionNumber>_min, /* Minimum tokens for each state */ 2573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dfa<dfa.decisionNumber>_max, /* Maximum tokens for each state */ 2574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dfa<dfa.decisionNumber>_accept, /* Accept table */ 2575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dfa<dfa.decisionNumber>_special, /* Special transition states */ 2576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dfa<dfa.decisionNumber>_transitions /* Table of transition tables */ 2577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 2579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* End of Cyclic DFA <dfa.decisionNumber> 2580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * --------------------- 2581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A state in a cyclic DFA; it's a special state and part of a big switch on 2585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * state. 2586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2587324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= << 2588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 LA<decisionNumber>_<stateNumber>;<\n> 2590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_MARKER index<decisionNumber>_<stateNumber>;<\n> 2591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LA<decisionNumber>_<stateNumber> = LA(1);<\n> 2593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(semPredState)> <! get next lookahead symbol to test edges, then rewind !> 2594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index<decisionNumber>_<stateNumber> = INDEX();<\n> 2595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver REWINDLAST();<\n> 2596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <endif> 2597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = -1; 2598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <edges; separator="\nelse "> 2599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <if(semPredState)> <! return input cursor to state before we rewound !> 2600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEEK(index<decisionNumber>_<stateNumber>);<\n> 2601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <endif> 2602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( s>=0 ) 2603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return s; 2605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbreak; 2608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Just like a fixed DFA edge, test the lookahead and indicate what 2611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * state to jump to next if successful. 2612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2613324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates) ::= << 2614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <if(predicates)>(<predicates>) && <endif>(<labelExpr>) ) 2615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = <targetStateNumber>; 2617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n> 2618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An edge pointing at end-of-token; essentially matches any char; 2621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * always jump to the target. 2622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2623324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvereotDFAEdge(targetStateNumber,edgeNumber, predicates) ::= << 2624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = <targetStateNumber>;<\n> 2625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// D F A E X P R E S S I O N S 2629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2630324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverandPredicates(left,right) ::= "( (<left>) && (<right>) )" 2631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2632324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverorPredicates(operands) ::= "((<first(operands)>)<rest(operands):{o | ||(<o>)}>)" 2633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2634324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernotPredicate(pred) ::= "!( <evalPredicate(pred,{})> )" 2635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2636324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalPredicate(pred,description) ::= "(<pred>)" 2637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2638324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverevalSynPredicate(pred,description) ::= "<pred>(ctx)" 2639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2640324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadTest(atom,k,atomAsInt) ::= "LA<decisionNumber>_<stateNumber> == <atom>" 2641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable 2643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * somewhere. Must ask for the lookahead directly. 2644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2645324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadTest(atom,k,atomAsInt) ::= "LA(<k>) == <atom>" 2646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2647324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= <% 2648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver((LA<decisionNumber>_<stateNumber> >= <lower>) && (LA<decisionNumber>_<stateNumber> \<= <upper>)) 2649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%> 2650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2651324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::= "((LA(<k>) >= <lower>) && (LA(<k>) \<= <upper>))" 2652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2653324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTest(ranges) ::= "<ranges; separator=\" || \">" 2654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// A T T R I B U T E S 2656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2657324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermakeScopeSet() ::= << 2658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* makeScopeSet() 2659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Definition of the <scope.name> scope variable tracking 2661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * structure. An instance of this structure is created by calling 2662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <name>_<scope.name>Push(). 2663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct <scopeStruct(sname=scope.name,...)>_struct 2665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Function that the user may provide to be called when the 2667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * scope is destroyed (so you can free pANTLR3_HASH_TABLES and so on) 2668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param POinter to an instance of this typedef/struct 2670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (ANTLR3_CDECL *free) (struct <scopeStruct(sname=scope.name,...)>_struct * frame); 2672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* ============================================================================= 2674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Programmer defined variables... 2675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <scope.attributes:{it |<it.decl>;}; separator="\n"> 2677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* End of programmer defined variables 2679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ============================================================================= 2680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <scopeStruct(sname=scope.name,...)>, * <scopeType(sname=scope.name,...)>; 2683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2686324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeDecl(scope) ::= << 2687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeDecl(scope) 2689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<makeScopeSet(...)> 2691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2694324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeDecl(scope) ::= << 2695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeDecl(scope) 2697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<makeScopeSet(...)> 2699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2702324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeFuncDecl(scope) ::= 2703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<< 2704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeFuncDecl(scope) 2705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------------------------------------------- 2708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Function declaration for creating a <name>_<scope.name> scope set 2709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic <scopeType(sname=scope.name,...)> <scopePushName(sname=scope.name,...)>(p<name> ctx); 2711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void ANTLR3_CDECL <scope.name>Free(<scopeType(sname=scope.name)> scope); 2712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------------------------------------------- */ 2713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2717324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeFuncMacro(scope) ::= << 2718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeFuncMacro(scope) 2720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Function for popping the top value from a <scopeStack(sname=scope.name)> 2722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid 2724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopePopName(sname=scope.name,...)>(p<name> ctx) 2725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // First see if the user defined a function they want to be called when a 2727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // scope is popped/freed. 2728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If the user supplied the scope entries with a free function,then call it first 2730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (SCOPE_TOP(<scope.name>)->free != NULL) 2732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SCOPE_TOP(<scope.name>)->free(SCOPE_TOP(<scope.name>)); 2734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we decrement the scope's upper limit bound. We do not actually pop the scope as 2737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we want to reuse scope entries if we do continuous push and pops. Most scopes don't 2738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // next too far so we don't want to keep freeing and allocating them 2739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx-><scopeStack(sname=scope.name,...)>_limit--; 2741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SCOPE_TOP(<scope.name>) = (<scopeType(sname=scope.name)>)(ctx-><scopeStack(sname=scope.name,...)>->get(ctx-><bscopeStack(sname=scope.name,...)>, ctx-><scopeStack(sname=scope.name,...)>_limit - 1)); 2742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2746324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeFuncDecl(scope) ::= << 2747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeFuncDecl(scope) 2749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------------------------------------------- 2751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Function declarations for creating a <name>_<scope.name> scope set 2752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic <scopeType(sname=scope.name,...)> <scopePushName(sname=scope.name,...)>(p<name> ctx); 2754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void ANTLR3_CDECL <scope.name>Free(<scopeType(sname=scope.name)> scope); 2755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ----------------------------------------------------------------------------- */ 2756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2760324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeFuncMacro(scope) ::= << 2761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeFuncMacro(scope) 2763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Function for popping the top value from a <scopeStack(sname=scope.name,...)> 2765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid 2767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopePopName(sname=scope.name,...)>(p<name> ctx) 2768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // First see if the user defined a function they want to be called when a 2770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // scope is popped/freed. 2771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If the user supplied the scope entries with a free function,then call it first 2773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (SCOPE_TOP(<scope.name>)->free != NULL) 2775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SCOPE_TOP(<scope.name>)->free(SCOPE_TOP(<scope.name>)); 2777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we decrement the scope's upper limit bound. We do not actually pop the scope as 2780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we want to reuse scope entries if we do continuous push and pops. Most scopes don't 2781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // next too far so we don't want to keep freeing and allocating them 2782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx-><scopeStack(sname=scope.name,...)>_limit--; 2784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SCOPE_TOP(<scope.name>) = (<scopeType(sname=scope.name)>)(ctx-><scopeStack(sname=scope.name,...)>->get(ctx-><scopeStack(sname=scope.name,...)>, ctx-><scopeStack(sname=scope.name,...)>_limit - 1)); 2785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2790324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeDef(scope) ::= 2791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<< 2792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeDef(scope) 2793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Pointer to the <scope.name> stack for use by <scopePushName(sname=scope.name)>() 2796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and <scopePopName(sname=scope.name,...)>() 2797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2798324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_STACK <scopeStack(sname=scope.name)>; 2799324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_UINT32 <scopeStack(sname=scope.name)>_limit; 2800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Pointer to the top of the stack for the global scope <scopeStack(sname=scope.name)> 2801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeType(sname=scope.name,...)> (*<scopePushName(sname=scope.name,...)>)(struct <name>_Ctx_struct * ctx); 2803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeType(sname=scope.name,...)> <scopeTopDecl(sname=scope.name,...)>; 2804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2808324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeDef(scope) ::= << 2809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeDef(scope) 2811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Pointer to the <scope.name> stack for use by <scopePushName(sname=scope.name)>() 2813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and <scopePopName(sname=scope.name,...)>() 2814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2815324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_STACK <scopeStack(sname=scope.name,...)>; 2816324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_UINT32 <scopeStack(sname=scope.name,...)>_limit; 2817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeType(sname=scope.name,...)> (*<scopePushName(sname=scope.name,...)>)(struct <name>_Ctx_struct * ctx); 2818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeType(sname=scope.name,...)> <scopeTopDecl(sname=scope.name,...)>; 2819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2823324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeFuncs(scope) ::= << 2824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScopeFuncs(scope) 2826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attributeFuncs(scope)> 2828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2831324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeFuncs(scope) ::= << 2832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScopeFuncs(scope) 2834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attributeFuncs(scope)> 2836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2839324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScope(scope) ::= << 2840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScope(scope) 2842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopePushName(sname=scope.name,...)> = <scopePushName(sname=scope.name,...)>; 2844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)> = antlr3StackNew(0); 2845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>_limit = 0; 2846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeTop(sname=scope.name,...)> = NULL; 2847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2850324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScope(scope) ::= 2851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<< 2852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScope(scope) 2854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopePushName(sname=scope.name,...)> = <scopePushName(sname=scope.name,...)>; 2856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)> = antlr3StackNew(0); 2857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>_limit = 0; 2858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopeTop(sname=scope.name,...)> = NULL; 2859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2861324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverglobalAttributeScopeFree(scope) ::= << 2862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* globalAttributeScope(scope) 2864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>->free(ctx-><scopeStack(sname=scope.name,...)>); 2866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2869324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleAttributeScopeFree(scope) ::= 2870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<< 2871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* ruleAttributeScope(scope) 2873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeStack(sname=scope.name,...)>->free(ctx-><scopeStack(sname=scope.name,...)>); 2875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2878324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeTopDecl(sname) ::= << 2879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Top 2880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2882324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeTop(sname) ::= << 2883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverctx-><scopeTopDecl(sname=sname,...)> 2884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2886324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopePop(sname) ::= << 2887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopePopName(sname=sname,...)>(ctx); 2888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2890324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopePush(sname) ::= << 2891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Push(ctx) 2892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2894324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopePopName(sname) ::= << 2895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Pop 2896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2898324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopePushName(sname) ::= << 2899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Push 2900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2902324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeType(sname) ::= << 2903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>_SCOPE 2904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2906324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeStruct(sname) ::= << 2907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<name>_<sname>_SCOPE 2908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2910324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeStack(sname) ::= << 2911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverp<name>_<sname>Stack 2912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2914324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverattributeFuncs(scope) ::= << 2915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(scope.attributes)> 2916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* attributeFuncs(scope) 2917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void ANTLR3_CDECL <scope.name>Free(<scopeType(sname=scope.name)> scope) 2920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(scope); 2922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 2923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \brief Allocate initial memory for a <name> <scope.name> scope variable stack entry and 2925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * add it to the top of the stack. 2926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \remark 2928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * By default the structure is freed with ANTLR_FREE(), but you can use the 2929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the \@init action to install a pointer to a custom free() routine by 2930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * adding the code: 2931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code 2932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <scopeTop(sname=scope.name)>->free = myroutine; 2933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode 2934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * With lots of comments of course! The routine should be declared in 2936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \@members { } as: 2937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code 2938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * void ANTLR3_CDECL myfunc( <scopeType(sname=scope.name)> ptr). 2939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode 2940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * It should perform any custom freeing stuff that you need (call ANTLR_FREE3, not free() 2942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NB: It should not free the pointer it is given, which is the scope stack entry itself 2943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and will be freed by the function that calls your custom free routine. 2944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic <scopeType(sname=scope.name)> 2947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scopePushName(sname=scope.name)>(p<name> ctx) 2948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 2949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Pointer used to create a new set of attributes 2950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <scopeType(sname=scope.name)> newAttributes; 2952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Allocate the memory for a new structure if we need one. 2954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (ctx-><scopeStack(sname=scope.name)>->size(ctx-><scopeStack(sname=scope.name)>) > ctx-><scopeStack(sname=scope.name)>_limit) 2956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The current limit value was less than the number of scopes available on the stack so 2958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we can just reuse one. Our limit tracks the stack count, so the index of the entry we want 2959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // is one less than that, or conveniently, the current value of limit. 2960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newAttributes = (<scopeType(sname=scope.name)>)ctx-><scopeStack(sname=scope.name)>->get(ctx-><scopeStack(sname=scope.name)>, ctx-><scopeStack(sname=scope.name)>_limit); 2962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Need a new allocation 2966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newAttributes = (<scopeType(sname=scope.name)>) ANTLR3_MALLOC(sizeof(<scopeStruct(sname=scope.name)>)); 2968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newAttributes != NULL) 2969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 2970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Standard ANTLR3 library implementation 2971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx-><scopeStack(sname=scope.name)>->push(ctx-><scopeStack(sname=scope.name)>, newAttributes, (void (*)(void *))<scope.name>Free); 2973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 2975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Blank out any previous free pointer, the user might or might install a new one. 2977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newAttributes->free = NULL; 2979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Indicate the position in the available stack that the current level is at 2981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 2982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctx-><scopeStack(sname=scope.name)>_limit++; 2983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Return value is the pointer to the new entry, which may be used locally 2985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * without de-referencing via the context. 2986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 2987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newAttributes; 2988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}<\n> 2989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 2991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 2992324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnStructName(r) ::= "<r.name>_return" 2993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2994324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnType() ::= <% 2995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)> 2996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 2997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.grammar.recognizerName>_<ruleDescriptor:returnStructName()> 2998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 2999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasSingleReturnValue)> 3000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleDescriptor.singleValueReturnType> 3001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid 3003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3006324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_BOOLEAN 3007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%> 3009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Generate the C type associated with a single or multiple return 3011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * value(s). 3012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 3013324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelType(referencedRule) ::= <% 3014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)> 3015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.grammar.recognizerName>_<referencedRule.name>_return 3016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasSingleReturnValue)> 3018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<referencedRule.singleValueReturnType> 3019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid 3021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%> 3024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3025324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdelegateName(d) ::= << 3026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(d.label)><d.label><else>g<d.name><endif> 3027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Using a type to init value map, try to init a type; if not in table 3030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * must be an object, default value is "0". 3031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 3032324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverinitValue(typeName) ::= << 3033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver = <cTypeInitMap.(typeName)> 3034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a rule label */ 3037324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelDef(label) ::= << 3038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<ruleLabelType(referencedRule=label.referencedRule)> <label.label.text>; 3039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#undef RETURN_TYPE_<label.label.text> 3040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define RETURN_TYPE_<label.label.text> <ruleLabelType(referencedRule=label.referencedRule)><\n> 3041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Rule label default value */ 3043324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelInitVal(label) ::= << 3044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3046324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverASTLabelType() ::= "<if(recognizer.ASTLabelType)><recognizer.ASTLabelType><else>pANTLR3_BASE_TREE<endif>" 3047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Define a return struct for a rule if the code needs to access its 3049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * start/stop tokens, tree stuff, attributes, ... Leave a hole for 3050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * subgroups to stick in members. 3051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 3052324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnScope(scope) ::= << 3053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!ruleDescriptor.isSynPred)> 3054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 3055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct <ruleDescriptor.grammar.recognizerName>_<ruleDescriptor:returnStructName()>_struct 3056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 3057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(!TREE_PARSER)> 3058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees 3059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 3060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN start; 3061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN stop; 3062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <recognizer.ASTLabelType> start; 3064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <recognizer.ASTLabelType> stop; 3065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <@ruleReturnMembers()> 3067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor.returnScope.attributes:{it |<it.type> <it.name>;}; separator="\n"> 3068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 3069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <ruleDescriptor.grammar.recognizerName>_<ruleDescriptor:returnStructName()>;<\n><\n> 3070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3074324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterScope(scope) ::= << 3075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope.attributes:{it |<it.decl>}; separator=", "> 3076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3078324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterAttributeRef(attr) ::= "<attr.name>" 3079324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverparameterSetAttributeRef(attr,expr) ::= "<attr.name>=<expr>;" 3080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Note that the scopeAttributeRef does not have access to the 3082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar name directly 3083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 3084324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeAttributeRef(scope,attr,index,negIndex) ::= <% 3085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)> 3086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ((SCOPE_TYPE(<scope>))(ctx->SCOPE_STACK(<scope>)->get( ctx->SCOPE_STACK(<scope>), ctx->SCOPE_STACK(<scope>)->size(ctx->SCOPE_STACK(<scope>)) - <negIndex> - 1) ))-><attr.name> 3087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)> 3089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ((SCOPE_TYPE(<scope>))(ctx->SCOPE_STACK(<scope>)->get(ctx->SCOPE_STACK(<scope>), (ANTLR3_UINT32)<index> ) ))-><attr.name> 3090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (SCOPE_TOP(<scope>))-><attr.name> 3092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%> 3095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3096324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverscopeSetAttributeRef(scope,attr,expr,index,negIndex) ::= <% 3097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(negIndex)> 3098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ((SCOPE_TYPE(<scope>))(ctx->SCOPE_STACK(<scope>)->get( ctx->SCOPE_STACK(<scope>), ctx->SCOPE_STACK(<scope>)->size(ctx->SCOPE_STACK(<scope>)) - <negIndex> - 1) ))-><attr.name> = <expr>; 3099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(index)> 3101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ((SCOPE_TYPE(<scope>))(ctx->SCOPE_STACK(<scope>)->get(ctx->SCOPE_STACK(<scope>), (ANTLR3_UINT32)<index> ) ))-><attr.name> = <expr>; 3102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (SCOPE_TOP(<scope>))-><attr.name>=<expr>; 3104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%> 3107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** $x is either global scope or x is rule with dynamic scope; refers 3109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to stack itself not top of stack. This is useful for predicates 3110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * like {$function.size()>0 && $function::name.equals("foo")}? 3111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 3112324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisolatedDynamicScopeRef(scope) ::= "ctx->SCOPE_STACK(<scope>)" 3113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** reference an attribute of rule; might only have single return value */ 3115324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelRef(referencedRule,scope,attr) ::= << 3116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(referencedRule.hasMultipleReturnValues)> 3117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope>.<attr.name> 3118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<scope> 3120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3123324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnAttributeRef(ruleDescriptor,attr) ::= << 3124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 3125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name> 3126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name> 3128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3131324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreturnSetAttributeRef(ruleDescriptor,attr,expr) ::= << 3132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(ruleDescriptor.hasMultipleReturnValues)> 3133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverretval.<attr.name>=<expr>; 3134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<attr.name>=<expr>; 3136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to translate $tokenLabel */ 3140324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelRef(label) ::= "<label>" 3141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** ids+=ID {$ids} or e+=expr {$e} */ 3143324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlistLabelRef(label) ::= "list_<label>" 3144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// not sure the next are the right approach 3147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3148324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_text(scope,attr) ::= "(<scope>->getText(<scope>))" 3149324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_type(scope,attr) ::= "(<scope>->getType(<scope>))" 3150324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_line(scope,attr) ::= "(<scope>->getLine(<scope>))" 3151324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_pos(scope,attr) ::= "(<scope>->getCharPositionInLine(<scope>))" 3152324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_channel(scope,attr) ::= "(<scope>->getChannel(<scope>))" 3153324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_index(scope,attr) ::= "(<scope>->getTokenIndex(<scope>))" 3154324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_tree(scope,attr) ::= "(<scope>->tree)" 3155324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertokenLabelPropertyRef_int(scope,attr) ::= "(<scope>->getText(<scope>)->toInt32(<scope>->getText(<scope>)))" 3156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3157324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_start(scope,attr) ::= "(<scope>.start)" 3158324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_stop(scope,attr) ::= "(<scope>.stop)" 3159324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_tree(scope,attr) ::= "(<scope>.tree)" 3160324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_text(scope,attr) ::= << 3161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 3162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(STRSTREAM->toStringSS(STRSTREAM, <scope>.start, <scope>.start)) 3163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(STRSTREAM->toStringTT(STRSTREAM, <scope>.start, <scope>.stop)) 3165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3168324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleLabelPropertyRef_st(scope,attr) ::= "<scope>.st" 3169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Isolated $RULE ref ok in lexer as it's a Token */ 3171324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabel(label) ::= "<label>" 3172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3173324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_type(scope,attr) ::= "(<scope>->getType(<scope>))" 3174324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_line(scope,attr) ::= "(<scope>->getLine(<scope>))" 3175324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_pos(scope,attr) ::= "(<scope>->getCharPositionInLine(<scope>))" 3176324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_channel(scope,attr) ::= "(<scope>->getChannel(<scope>))" 3177324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_index(scope,attr) ::= "(<scope>->getTokenIndex(<scope>))" 3178324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRuleLabelPropertyRef_text(scope,attr) ::= "(<scope>->getText(<scope>))" 3179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Somebody may ref $template or $tree or $stop within a rule: 3181324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_start(scope,attr) ::= "retval.start" 3182324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_stop(scope,attr) ::= "retval.stop" 3183324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_tree(scope,attr) ::= "retval.tree" 3184324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_text(scope,attr) ::= << 3185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(TREE_PARSER)> 3186324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINPUT->toStringSS(INPUT, ADAPTOR->getTokenStartIndex(ADAPTOR, retval.start), ADAPTOR->getTokenStopIndex(ADAPTOR, retval.start)) 3187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3188324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverSTRSTREAM->toStringTT(STRSTREAM, retval.start, LT(-1)) 3189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3191324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrulePropertyRef_st(scope,attr) ::= "retval.st" 3192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3193324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_text(scope,attr) ::= "LEXER->getText(LEXER)" 3194324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_type(scope,attr) ::= "_type" 3195324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_line(scope,attr) ::= "LEXSTATE->tokenStartLine" 3196324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_pos(scope,attr) ::= "LEXSTATE->tokenStartCharPositionInLine" 3197324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_channel(scope,attr) ::= "LEXSTATE->channel" 3198324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_start(scope,attr) ::= "LEXSTATE->tokenStartCharIndex" 3199324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_stop(scope,attr) ::= "(LEXER->getCharIndex(LEXER)-1)" 3200324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_index(scope,attr) ::= "-1" // undefined token index in lexer 3201324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverlexerRulePropertyRef_int(scope,attr) ::= "LEXER->getText(LEXER)->toInt32(LEXER->getText(LEXER))" 3202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// setting $st and $tree is allowed in local rule. everything else is flagged as error 3205324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_tree(scope,attr,expr) ::= "retval.tree=<expr>;" 3206324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverruleSetPropertyRef_st(scope,attr,expr) ::= "retval.st=<expr>;" 3207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to deal with an @after for C targets. Because we cannot rely on 3210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * any garbage collection, after code is executed even in backtracking 3211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * mode. Must be documented clearly. 3212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 3213324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAfter(action) ::= << 3214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 3215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <action> 3216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 3217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How to execute an action (when not backtracking) */ 3220324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexecAction(action) ::= << 3221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(backtracking)> 3222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<if(actions.(actionScope).synpredgate)> 3223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( <actions.(actionScope).synpredgate> ) 3224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 3225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <action> 3226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 3227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif ( BACKTRACKING == 0 ) 3229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 3230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <action> 3231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 3232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<else> 3234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 3235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <action> 3236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 3237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver<endif> 3238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// M I S C (properties, etc...) 3241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3242324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbitsetDeclare(name, words64) ::= << 3243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Bitset defining follow set for error recovery in rule state: <name> */ 3245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BITWORD <name>_bits[] = { <words64:{it |ANTLR3_UINT64_LIT(<it>)}; separator=", "> }; 3246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BITSET_LIST <name> = { <name>_bits, <length(words64)> }; 3247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbitset(name, words64) ::= << 3250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3BitsetSetAPI(&<name>);<\n> 3251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver>> 3252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3253324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercodeFileExtension() ::= ".c" 3254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertrue_value() ::= "ANTLR3_TRUE" 3256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfalse_value() ::= "ANTLR3_FALSE" 3257