1
// KDevelop support by Roberto Raggi (roberto@kdevelop.org)
3
header "pre_include_hpp" {
8
#include <qstringlist.h>
9
#include <qvaluestack.h>
10
#include <qfileinfo.h>
13
header "post_include_hpp" {
14
#include <codemodel.h>
23
/** Java 1.2 AST Recognizer Grammar
26
* Terence Parr parrt@magelang.com
28
* Version tracking now done with following ID:
30
* $Id: java.store.g 255951 2003-10-03 17:00:32Z aclu $
32
* This grammar is in the PUBLIC DOMAIN
36
class JavaStoreWalker extends TreeParser;
40
defaultErrorHandler = true;
41
ASTLabelType = "RefJavaAST";
45
QStringList m_currentScope;
48
QValueStack<ClassDom> m_currentClass;
51
ANTLR_USE_NAMESPACE(antlr)JavaASTFactory ast_factory;
54
void setCodeModel( CodeModel* model )
59
void setFile( FileDom file )
66
m_currentScope.clear();
67
m_currentAccess = CodeModelItem::Public;
70
initializeASTFactory (ast_factory);
71
setASTFactory (&ast_factory);
75
compilationUnit { QString package; QString imp; QStringList imports; }
77
(package=packageDefinition)?
78
(imp=importDefinition { imports << imp; } )*
82
packageDefinition returns [ QString id ]
83
: #( PACKAGE_DEF id=identifier )
86
importDefinition returns [ QString id ]
87
: #( IMPORT id=identifierStar )
90
typeDefinition { QStringList bases; QString className; ClassDom klass; QStringList m;}
91
: #(CLASS_DEF m=modifiers IDENT
93
klass = m_model->create<ClassModel>();
94
QString name = QString::fromUtf8( #IDENT->getText().c_str(), #IDENT->getText().length() );
95
QStringList path = QStringList::split( ".", name );
96
className = path.back();
98
klass->setName( path.back() );
99
klass->setScope( m_currentScope );
100
klass->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() );
101
/// @todo klass->setEndPositon()
103
klass->setFileName( m_file->name() );
104
if( m_currentClass.top() )
105
m_currentClass.top()->addClass( klass );
107
m_file->addClass( klass );
111
for( QStringList::Iterator it = bases.begin(); it != bases.end(); ++it )
112
klass->addBaseClass( *it );
116
m_currentClass.push( klass );
117
m_currentScope.push_back( className );
121
m_currentClass.pop();
122
m_currentScope.pop_back();
125
| #(INTERFACE_DEF m=modifiers IDENT
127
klass = m_model->create<ClassModel>();
128
QString name = QString::fromUtf8( #IDENT->getText().c_str(), #IDENT->getText().length() );
129
QStringList path = QStringList::split( ".", name );
130
className = path.back();
132
klass->setName( path.back() );
133
klass->setScope( m_currentScope );
134
klass->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() );
135
/// @todo klass->setEndPositon()
137
klass->setFileName( m_file->name() );
139
if( m_currentClass.top() )
140
m_currentClass.top()->addClass( klass );
142
m_file->addClass( klass );
146
m_currentClass.push( klass );
147
m_currentScope.push_back( className );
149
interfaceBlock[klass]
151
m_currentClass.pop();
152
m_currentScope.pop_back();
157
typeSpec returns [ QString tp ]
158
: #(TYPE tp=typeSpecArray)
161
typeSpecArray returns [ QString tp ]
162
: #( ARRAY_DECLARATOR tp=typeSpecArray ) { tp += "[]"; }
166
type returns [ QString tp ]
168
| b:builtInType { tp = #b->getText().c_str(); }
183
modifiers returns [ QStringList l ]
184
: #( MODIFIERS (m:modifier { l << #m->getText().c_str(); } )* )
202
extendsClause returns [ QStringList l ] { QString id; }
203
: #(EXTENDS_CLAUSE (id=identifier { l << id; } )* )
206
implementsClause returns [ QStringList l ] { QString id; }
207
: #(IMPLEMENTS_CLAUSE (id=identifier { l << id; } )* )
210
interfaceBlock [ ClassDom klass ] { FunctionDom meth; VariableDom attr; }
221
objBlock [ ClassDom klass ] { FunctionDom meth; VariableDom attr; }
224
klass->addFunction( meth );
227
klass->addFunction( meth );
230
klass->addVariable( attr );
233
| #(STATIC_INIT slist)
234
| #(INSTANCE_INIT slist)
239
ctorDef returns [ FunctionDom meth ] {
241
meth = m_model->create<FunctionModel>();
242
meth->setFileName( m_file->name() );
245
m=modifiers methodHead[meth] slist
248
if( m.contains("public") )
249
meth->setAccess( CodeModelItem::Public );
250
else if( m.contains("protected") )
251
meth->setAccess( CodeModelItem::Protected );
253
meth->setAccess( CodeModelItem::Private );
257
methodDecl returns [ FunctionDom meth ] {
260
meth = m_model->create<FunctionModel>();
261
meth->setFileName( m_file->name() );
263
: #(METHOD_DEF m=modifiers tp=typeSpec methodHead[meth])
265
meth->setResultType( tp );
266
if( m.contains("public") )
267
meth->setAccess( CodeModelItem::Public );
268
else if( m.contains("protected") )
269
meth->setAccess( CodeModelItem::Protected );
271
meth->setAccess( CodeModelItem::Private );
275
methodDef returns [ FunctionDom meth ] {
278
meth = m_model->create<FunctionModel>();
279
meth->setFileName( m_file->name() );
281
: #(METHOD_DEF m=modifiers tp=typeSpec methodHead[meth] (slist)?)
283
meth->setResultType( tp );
284
if( m.contains("public") )
285
meth->setAccess( CodeModelItem::Public );
286
else if( m.contains("protected") )
287
meth->setAccess( CodeModelItem::Protected );
289
meth->setAccess( CodeModelItem::Private );
293
variableDef returns [ VariableDom attr ] {
296
attr = m_model->create<VariableModel>();
297
attr->setFileName( m_file->name() );
299
: #(VARIABLE_DEF m=modifiers tp=typeSpec variableDeclarator[attr] varInitializer)
302
if( m.contains("public") )
303
attr->setAccess( CodeModelItem::Public );
304
else if( m.contains("protected") )
305
attr->setAccess( CodeModelItem::Protected );
307
attr->setAccess( CodeModelItem::Private );
309
attr->setStatic( m.contains("static") );
313
parameterDef returns [ ArgumentDom arg ] {
315
arg = m_model->create<ArgumentModel>();
317
: #(PARAMETER_DEF modifiers tp=typeSpec IDENT )
320
arg->setName( #IDENT->getText().c_str() );
325
: #(INSTANCE_INIT slist)
328
variableDeclarator [ VariableDom attr ]
330
attr->setName( #IDENT->getText().c_str() );
331
attr->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() );
333
| LBRACK variableDeclarator[attr]
337
: #(ASSIGN initializer)
347
: #(ARRAY_INIT (initializer)*)
350
methodHead [ FunctionDom meth ] { ArgumentDom arg; }
351
: IDENT #( PARAMETERS (arg=parameterDef { meth->addArgument(arg); } )* ) (throwsClause)?
353
meth->setName( #IDENT->getText().c_str() );
354
meth->setScope( m_currentScope );
355
meth->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() );
360
: #( "throws" (identifier)* )
363
identifier returns [ QString id ]
365
id = #IDENT->getText().c_str();
367
| #( DOT id=identifier IDENT ) {
368
id += QString(".") + #IDENT->getText().c_str();
372
identifierStar returns [ QString id ]
374
id = #IDENT->getText().c_str();
376
| #( DOT id=identifier (STAR { id += QString(".") + #STAR->getText().c_str(); } |
377
IDENT { id += QString(".") + #IDENT->getText().c_str(); }) )
387
| #(LABELED_STAT IDENT stat)
388
| #("if" expression stat (stat)? )
390
#(FOR_INIT (variableDef | elist)?)
391
#(FOR_CONDITION (expression)?)
392
#(FOR_ITERATOR (elist)?)
395
| #("while" expression stat)
396
| #("do" stat expression)
397
| #("break" (IDENT)? )
398
| #("continue" (IDENT)? )
399
| #("return" (expression)? )
400
| #("switch" expression (caseGroup)*)
401
| #("throw" expression)
402
| #("synchronized" expression stat)
404
| slist // nested SLIST
409
: #(CASE_GROUP (#("case" expression) | "default")+ slist)
413
: #( "try" slist (handler)* (#("finally" slist))? )
417
: #( "catch" parameterDef slist )
421
: #( ELIST (expression)* )
428
expr: #(QUESTION expr expr expr) // trinary operator
429
| #(ASSIGN expr expr) // binary operators...
430
| #(PLUS_ASSIGN expr expr)
431
| #(MINUS_ASSIGN expr expr)
432
| #(STAR_ASSIGN expr expr)
433
| #(DIV_ASSIGN expr expr)
434
| #(MOD_ASSIGN expr expr)
435
| #(SR_ASSIGN expr expr)
436
| #(BSR_ASSIGN expr expr)
437
| #(SL_ASSIGN expr expr)
438
| #(BAND_ASSIGN expr expr)
439
| #(BXOR_ASSIGN expr expr)
440
| #(BOR_ASSIGN expr expr)
446
| #(NOT_EQUAL expr expr)
466
| #("instanceof" expr expr)
467
| #(UNARY_MINUS expr)
480
| #( "new" IDENT elist )
482
| #(ARRAY_DECLARATOR type)
483
| builtInType ("class")?
487
| #(METHOD_CALL primaryExpression elist)
488
| #(TYPECAST typeSpec expr)
496
| typeSpec // type name used with instanceof
500
: #(INDEX_OP primaryExpression expression)
512
( newArrayDeclarator (arrayInitializer)?
520
: #( ARRAY_DECLARATOR (newArrayDeclarator)? (expression)? )