📄 cpp_parser.g
字号:
/*
* PUBLIC DOMAIN PCCTS-BASED C++ GRAMMAR (cplusplus.g, stat.g, expr.g)
*
* Authors: Sumana Srinivasan, NeXT Inc.; sumana_srinivasan@next.com
* Terence Parr, Parr Research Corporation; parrt@parr-research.com
* Russell Quong, Purdue University; quong@ecn.purdue.edu
*
* VERSION 1.2
*
* SOFTWARE RIGHTS
*
* This file is a part of the ANTLR-based C++ grammar and is free
* software. We do not reserve any LEGAL rights to its use or
* distribution, but you may NOT claim ownership or authorship of this
* grammar or support code. An individual or company may otherwise do
* whatever they wish with the grammar distributed herewith including the
* incorporation of the grammar or the output generated by ANTLR into
* commerical software. You may redistribute in source or binary form
* without payment of royalties to us as long as this header remains
* in all source distributions.
*
* We encourage users to develop parsers/tools using this grammar.
* In return, we ask that credit is given to us for developing this
* grammar. By "credit", we mean that if you incorporate our grammar or
* the generated code into one of your programs (commercial product,
* research project, or otherwise) that you acknowledge this fact in the
* documentation, research report, etc.... In addition, you should say nice
* things about us at every opportunity.
*
* As long as these guidelines are kept, we expect to continue enhancing
* this grammar. Feel free to send us enhancements, fixes, bug reports,
* suggestions, or general words of encouragement at parrt@parr-research.com.
*
* NeXT Computer Inc.
* 900 Chesapeake Dr.
* Redwood City, CA 94555
* 12/02/1994
*
* Restructured for public consumption by Terence Parr late February, 1995.
*
* DISCLAIMER: we make no guarantees that this grammar works, makes sense,
* or can be used to do anything useful.
*/
/* 2001-2002
* Version 1.0
* This C++ grammar file has been converted from PCCTS to run under
* ANTLR to generate lexer and parser in C++ code by
* Jianguo Zuo and David Wigg at
* The Centre for Systems and Software Engineering
* London South Bank University
* London, UK.
*
*/
/* 2003
* Version 2.0 was published by David Wigg in September 2003
*/
/* 2004
* Version 3.0 July 2004
* This is version 3.0 of the C++ grammar definition for ANTLR to
* generate lexer and parser in C++ code updated by
* David Wigg at
* The Centre for Systems and Software Engineering
* London South Bank University
* London, UK.
*/
/* 2005
* Version 3.1 November 2005
* Updated by David Wigg at London South Bank University
*
*/
/* 2007
* Version 3.2 November 2007
* Updated by David Wigg at London South Bank University
*
* wiggjd@bcs.ac.uk
* blackse@lsbu.ac.uk
*
* See MyReadMe.txt for further information
*
* This file is best viewed in courier font with tabs set to 4 spaces
*/
header "pre_include_hpp"
{// pre_include_hpp
}
header "post_include_hpp"
{// post_include_hpp
}
header "pre_include_cpp"
{// pre_include_cpp
}
header "post_include_cpp"
{// post_include_cpp
}
header
{
// File generated from CPP_parser.g
// Version 3.2 November 2007
// This file is best viewed in courier font with tabs set to 4 spaces
//
// The statements in this block appear in both CPPLexer.hpp and CPPParser.hpp
#include "antlr/CharScanner.hpp"
#include "CPPDictionary.hpp"
// Following externs declared here to be available for users
// Declared and set in CPPParser.cpp
extern int lineNo; // current line
extern bool in_user_file; // true = in principal file, false = in an include file
// Declared and set in CPPLexer.cpp
extern bool in_user_file_deferred;
extern int deferredLineCount; // used to accumulate line numbers in comments etc.
extern char principal_file[128]; // Name of user file
extern int principal_line; // Principal file's line number
extern int principal_last_set; // Where principal file's line number was last set
// in preprocessed *.i file
extern char current_included_file[128]; // Name of current include file
extern int include_line; // Included file's line number
extern int include_last_set; // Where included file's line number was last set
// in preprocessed *.i file
// The statements in this block appear in both CPPLexer.hpp and CPPParser.hpp
}
options
{
language = "Cpp";
}
{
// File generated from CPP_parser.g
// Version 3.2 November 2007
// This file is best viewed in courier font with tabs set to 4 spaces
//
// The statements in this block appear only in CPPParser.cpp
int statementTrace = 2; // Used to control selected (level) tracing (see support.cpp)
// 1 Shows which external and member statements selected
// 2 Shows above plus all declarations/definitions
// 3 reserved for future use
// 4 and above available for user
void CPPParser::init()
{
antlrTrace(false); // This is a dynamic trace facility for use with -traceParser etc.
// It requires modification in LLkParser.cpp and LLkParser.hpp
// (Copies of these modified files are supplied with this code)
// otherwise it should be commented out (see MyReadMe.txt)
// true shows antlr trace (or can be set and reset during parsing)
// false stops showing antlr trace
// Provided the parser is always generated with -traceParser this
// facility allows trace output to be turned on or off just by changing
// the setting here from false to true or vice versa and then
// recompiling and linking CPPParser only thus avoiding the need
// to use antlr.Tool to re-generate the lexer and parser again
// with (or without) -traceParser each time before recompiling.
// Antlr trace can also be turned on and off dynamically using
// antlrTrace_on or antlrTrace_off statements inserted into the
// source code being parsed (See antlrTrace_on and antlrTrace_off below).
// Creates a dictionary to hold symbols with 4001 buckets, 200 scopes and 800,000 characters
// These can be changed to suit the size of program(s) being parsed
symbols = new CPPDictionary(4001, 200, 800000);
// Set template parameter scope - Not used at present
templateParameterScope = symbols->getCurrentScopeIndex(); // Set template parameter scope to 0
symbols->saveScope(); // Advance currentScope from 0 to 1
// Set "external" scope for all types
externalScope = symbols->getCurrentScopeIndex(); // Set "external" scope to 1 for types
// Declare predefined scope "std" in external scope
CPPSymbol *a = new CPPSymbol("std", CPPSymbol::otTypedef);
symbols->define("std", a);
symbols->saveScope(); // Advance currentScope from 1 to 2 (and higher) for all other symbols
// treated as locals
// Global flags to allow for nested declarations
_td = false; // For typedef
_fd = false; // For friend
_sc = scInvalid; // For StorageClass
_tq = tqInvalid; // For TypeQualifier
_ts = tsInvalid; // For TypeSpecifier
_fs = fsInvalid; // For FunctionSpecifier
functionDefinition = 0;
qualifierPrefix[0] = '\0';
enclosingClass = "";
assign_stmt_RHS_found = 0;
in_parameter_list = false;
K_and_R = false; // used to distinguish old K & R parameter definitions
in_return = false;
is_address = false;
is_pointer = false;
} // End of CPPParser::init()
int lineNo = 0;
bool in_user_file; // true = in principal file, false = in an include file
// Set from in_user_file_deferred by external_declaration in CPP_parser.g
// The statements in this block appear only in CPPParser.cpp
}
class CPPParser extends Parser;
options
{
k = 2;
exportVocab = STDC;
buildAST =false;
codeGenMakeSwitchThreshold = 2;
codeGenBitsetTestThreshold = 3;
}
{ // These declarations go into CPPParser.hpp
public:
#define CPPParser_MaxQualifiedItemSize 500
// These codes are not stored with symbol names in CPPSymbol,
// but they are available for development
// Can't bitwise-OR enum elements together, this must be an int; damn!
typedef unsigned long TypeSpecifier; // note: must be at least 16 bits
#define tsInvalid 0x0
#define tsVOID 0x1
#define tsCHAR 0x2
#define tsSHORT 0x4
#define tsINT 0x8
#define tsLONG 0x10
#define tsFLOAT 0x20
#define tsDOUBLE 0x40
#define tsSIGNED 0x80
#define tsUNSIGNED 0x100
#define tsTYPEID 0x200
#define tsSTRUCT 0x400
#define tsENUM 0x800
#define tsUNION 0x1000
#define tsCLASS 0x2000
#define tsWCHAR_T 0x4000
#define tsBOOL 0x8000
enum TypeQualifier
{
tqInvalid=0, tqCONST=1, tqVOLATILE
};
enum StorageClass
{
scInvalid=0, scAUTO=1, scREGISTER,
scSTATIC, scEXTERN, scMUTABLE
};
enum FunctionSpecifier
{
fsInvalid=0,
fsVIRTUAL, fsINLINE, fsEXPLICIT, fsFRIEND
};
typedef int QualifiedItem;
#define qiInvalid 0x0
#define qiType 0x1 // includes enum, class, typedefs, namespace
#define qiDtor 0x2
#define qiCtor 0x4
#define qiOperator 0x8
#define qiPtrMember 0x10
#define qiVar 0x20
#define qiFun 0x40
protected:
// Symbol table management stuff
CPPDictionary *symbols;
int templateParameterScope;
int externalScope;
int anyType;
int anyNonType;
bool _td; // For typedef
bool _fd; // For friend
StorageClass _sc; // For storage class
TypeQualifier _tq; // For type qualifier
TypeSpecifier _ts; // For type specifier
FunctionSpecifier _fs; // For declaration specifier
int functionDefinition; // 0 = Function definition not being parsed
// 1 = Parsing function name
// 2 = Parsing function parameter list
// 3 = Parsing function block
char qualifierPrefix[CPPParser_MaxQualifiedItemSize+1];
char *enclosingClass;
int assign_stmt_RHS_found;
bool in_parameter_list;
bool K_and_R; // used to distinguish old K & R parameter definitions
bool in_return;
bool is_address;
bool is_pointer;
// Limit lookahead for qualifiedItemIs()
enum
{
MaxTemplateTokenScan = 200
};
public:
void init();
protected:
// Semantic interface in Support.cpp;
// You could subclass and redefine these functions
// so you don't have to mess with the grammar itself.
// Symbol stuff
virtual int qualifiedItemIsOneOf(QualifiedItem qiFlags, int lookahead_offset=0);
virtual QualifiedItem qualifiedItemIs(int lookahead_offset=0);
virtual int skipTemplateQualifiers(int& kInOut);
virtual int skipNestedParens(int& kInOut);
virtual int scopedItem(int k=1);
virtual int finalQualifier(const int k=1);
virtual int isTypeName(const char *s);
virtual int isClassName(const char *s);
virtual void end_of_stmt();
// Scoping stuff
virtual void enterNewLocalScope();
virtual void exitLocalScope();
virtual void enterExternalScope();
virtual void exitExternalScope();
// Aggregate stuff
virtual void classForwardDeclaration(const char *, TypeSpecifier, FunctionSpecifier);
virtual void beginClassDefinition(const char *, TypeSpecifier);
virtual void endClassDefinition();
virtual void beginEnumDefinition(const char *);
virtual void endEnumDefinition();
virtual void enumElement(const char *);
// Declaration and definition stuff
virtual void declarationSpecifier(bool,bool,StorageClass,TypeQualifier,TypeSpecifier,FunctionSpecifier);
virtual void beginDeclaration();
virtual void endDeclaration();
virtual void beginConstructorDeclaration(const char *);
virtual void endConstructorDeclaration();
virtual void beginDestructorDeclaration(const char *);
virtual void endDestructorDeclaration();
virtual void beginParameterDeclaration();
virtual void beginFieldDeclaration();
virtual void beginFunctionDefinition();
virtual void endFunctionDefinition();
virtual void functionParameterList();
virtual void functionEndParameterList(const int def);
virtual void beginConstructorDefinition();
virtual void endConstructorDefinition();
virtual void beginDestructorDefinition();
virtual void endDestructorDefinition();
// Declarator stuff
virtual void declaratorID(const char *, QualifiedItem); // This stores new symbol with its type.
virtual void declaratorArray();
virtual void declaratorParameterList(const int def);
virtual void declaratorEndParameterList(const int def);
// template stuff
virtual void templateTypeParameter(const char *);
virtual void beginTemplateDeclaration();
virtual void endTemplateDeclaration();
virtual void beginTemplateDefinition();
virtual void endTemplateDefinition();
virtual void beginTemplateParameterList();
virtual void endTemplateParameterList();
// exception stuff
virtual void exceptionBeginHandler();
virtual void exceptionEndHandler();
virtual void panic(const char *);
// myCode functions ready for overriding in MyCode subclass
// Include application code functions here
virtual void myCode_pre_processing(int, char *[]);
virtual void myCode_post_processing();
virtual void myCode_end_of_stmt();
virtual void myCode_function_direct_declarator(const char *);
}
translation_unit
: {enterExternalScope();}
(external_declaration)* EOF
{exitExternalScope();}
;
//external_declaration Note: These comment lines are provided to assist searching for productions
external_declaration
{
char *s;
lineNo = LT(1)->getLine();
K_and_R = false;
FunctionSpecifier fs = fsInvalid; // inline,virtual,explicit
in_user_file = in_user_file_deferred;
}
:
(
// Template explicit specialisation
("template" LESSTHAN GREATERTHAN)=>
{if(statementTrace>=1)
printf("%d external_declaration template explicit-specialisation\n",LT(1)->getLine());
}
"template" LESSTHAN GREATERTHAN external_declaration
|
// All typedefs
("typedef")=>
(
("typedef" "enum")=>
{if(statementTrace>=1)
printf("%d external_declaration Typedef enum type\n",LT(1)->getLine());
}
"typedef" enum_specifier {_td = true;} (init_declarator_list)? SEMICOLON {end_of_stmt();}
|
(declaration_specifiers function_declarator[0] SEMICOLON)=> // DW 11/02/05 This may not be possible
{if(statementTrace>=1)
printf("%d external_declaration Typedef function type\n",LT(1)->getLine());
}
declaration
|
(declaration_specifiers (init_declarator_list)? SEMICOLON)=>
{if(statementTrace>=1)
printf("%d external_declaration Typedef variable type\n",LT(1)->getLine());
}
declaration
|
("typedef" class_specifier)=>
{if(statementTrace>=1)
printf("%d external_declaration Typedef class type\n",LT(1)->getLine());
}
"typedef" class_decl_or_def[fs] {_td = true;} (init_declarator_list)? SEMICOLON {end_of_stmt();}
)
|
// Class template declaration or definition
(template_head (fs = function_specifier)* class_specifier)=>
{if (statementTrace>=1)
printf("%d external_declaration Templated class decl or def\n",LT(1)->getLine());
}
template_head (fs = function_specifier)* class_decl_or_def[fs] (init_declarator_list)? SEMICOLON {end_of_stmt();} // declaration
|
// Enum definition (don't want to backtrack over this in other alts)
("enum" (ID)? LCURLY)=>
{if (statementTrace>=1)
printf("%d external_declaration Enum definition\n",LT(1)->getLine());
}
enum_specifier (init_declarator_list)? SEMICOLON {end_of_stmt();}
|
// Destructor definition (templated or non-templated)
((template_head)? dtor_head[1] LCURLY)=>
{if (statementTrace>=1)
printf("%d external_declaration Destructor definition\n",LT(1)->getLine());
}
(template_head)? dtor_head[1] dtor_body
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -