// KDevelop support by Roberto Raggi (roberto@kdevelop.org) header "pre_include_hpp" { #include #include "JavaAST.h" #include #include #include #include } header "post_include_hpp" { #include #include } options { language="Cpp"; } /** Java 1.2 AST Recognizer Grammar * * Author: * Terence Parr parrt@magelang.com * * Version tracking now done with following ID: * * $Id$ * * This grammar is in the PUBLIC DOMAIN * * BUGS */ class JavaStoreWalker extends TreeParser; options { importVocab=Java; defaultErrorHandler = true; ASTLabelType = "RefJavaAST"; } { private: QStringList m_currentScope; CodeModel* m_model; FileDom m_file; QValueStack m_currentClass; int m_currentAccess; int m_anon; ANTLR_USE_NAMESPACE(antlr)JavaASTFactory ast_factory; public: void setCodeModel( CodeModel* model ) { m_model = model; } void setFile( FileDom file ) { m_file = file; } void init() { m_currentScope.clear(); m_currentAccess = CodeModelItem::Public; m_anon = 0; initializeASTFactory (ast_factory); setASTFactory (&ast_factory); } } compilationUnit { TQString package; TQString imp; QStringList imports; } : { init(); } (package=packageDefinition)? (imp=importDefinition { imports << imp; } )* (typeDefinition)* ; packageDefinition returns [ TQString id ] : #( PACKAGE_DEF id=identifier ) ; importDefinition returns [ TQString id ] : #( IMPORT id=identifierStar ) ; typeDefinition { QStringList bases; TQString className; ClassDom klass; QStringList m;} : #(CLASS_DEF m=modifiers IDENT { klass = m_model->create(); TQString name = TQString::fromUtf8( #IDENT->getText().c_str(), #IDENT->getText().length() ); QStringList path = QStringList::split( ".", name ); className = path.back(); klass->setName( path.back() ); klass->setScope( m_currentScope ); klass->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() ); /// @todo klass->setEndPositon() klass->setFileName( m_file->name() ); if( m_currentClass.top() ) m_currentClass.top()->addClass( klass ); else m_file->addClass( klass ); } bases=extendsClause { for( QStringList::Iterator it = bases.begin(); it != bases.end(); ++it ) klass->addBaseClass( *it ); } implementsClause { m_currentClass.push( klass ); m_currentScope.push_back( className ); } objBlock[klass] { m_currentClass.pop(); m_currentScope.pop_back(); } ) | #(INTERFACE_DEF m=modifiers IDENT { klass = m_model->create(); TQString name = TQString::fromUtf8( #IDENT->getText().c_str(), #IDENT->getText().length() ); QStringList path = QStringList::split( ".", name ); className = path.back(); klass->setName( path.back() ); klass->setScope( m_currentScope ); klass->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() ); /// @todo klass->setEndPositon() klass->setFileName( m_file->name() ); if( m_currentClass.top() ) m_currentClass.top()->addClass( klass ); else m_file->addClass( klass ); } bases=extendsClause { m_currentClass.push( klass ); m_currentScope.push_back( className ); } interfaceBlock[klass] { m_currentClass.pop(); m_currentScope.pop_back(); } ) ; typeSpec returns [ TQString tp ] : #(TYPE tp=typeSpecArray) ; typeSpecArray returns [ TQString tp ] : #( ARRAY_DECLARATOR tp=typeSpecArray ) { tp += "[]"; } | tp=type ; type returns [ TQString tp ] : tp=identifier | b:builtInType { tp = #b->getText().c_str(); } ; builtInType : "void" | "boolean" | "byte" | "char" | "short" | "int" | "float" | "long" | "double" ; modifiers returns [ QStringList l ] : #( MODIFIERS (m:modifier { l << #m->getText().c_str(); } )* ) ; modifier : "private" | "public" | "protected" | "static" | "transient" | "final" | "abstract" | "native" | "threadsafe" | "synchronized" | "const" | "volatile" ; extendsClause returns [ QStringList l ] { TQString id; } : #(EXTENDS_CLAUSE (id=identifier { l << id; } )* ) ; implementsClause returns [ QStringList l ] { TQString id; } : #(IMPLEMENTS_CLAUSE (id=identifier { l << id; } )* ) ; interfaceBlock [ ClassDom klass ] { FunctionDom meth; VariableDom attr; } : #( OBJBLOCK ( meth=methodDecl { } | attr=variableDef { } )* ) ; objBlock [ ClassDom klass ] { FunctionDom meth; VariableDom attr; } : #( OBJBLOCK ( meth=ctorDef { klass->addFunction( meth ); } | meth=methodDef { klass->addFunction( meth ); } | attr=variableDef { klass->addVariable( attr ); } | typeDefinition | #(STATIC_INIT slist) | #(INSTANCE_INIT slist) )* ) ; ctorDef returns [ FunctionDom meth ] { QStringList m; meth = m_model->create(); meth->setFileName( m_file->name() ); } : #(CTOR_DEF m=modifiers methodHead[meth] slist ) { if( m.contains("public") ) meth->setAccess( CodeModelItem::Public ); else if( m.contains("protected") ) meth->setAccess( CodeModelItem::Protected ); else meth->setAccess( CodeModelItem::Private ); } ; methodDecl returns [ FunctionDom meth ] { QStringList m; TQString tp; meth = m_model->create(); meth->setFileName( m_file->name() ); } : #(METHOD_DEF m=modifiers tp=typeSpec methodHead[meth]) { meth->setResultType( tp ); if( m.contains("public") ) meth->setAccess( CodeModelItem::Public ); else if( m.contains("protected") ) meth->setAccess( CodeModelItem::Protected ); else meth->setAccess( CodeModelItem::Private ); } ; methodDef returns [ FunctionDom meth ] { QStringList m; TQString tp; meth = m_model->create(); meth->setFileName( m_file->name() ); } : #(METHOD_DEF m=modifiers tp=typeSpec methodHead[meth] (slist)?) { meth->setResultType( tp ); if( m.contains("public") ) meth->setAccess( CodeModelItem::Public ); else if( m.contains("protected") ) meth->setAccess( CodeModelItem::Protected ); else meth->setAccess( CodeModelItem::Private ); } ; variableDef returns [ VariableDom attr ] { QStringList m; TQString tp; attr = m_model->create(); attr->setFileName( m_file->name() ); } : #(VARIABLE_DEF m=modifiers tp=typeSpec variableDeclarator[attr] varInitializer) { attr->setType( tp ); if( m.contains("public") ) attr->setAccess( CodeModelItem::Public ); else if( m.contains("protected") ) attr->setAccess( CodeModelItem::Protected ); else attr->setAccess( CodeModelItem::Private ); attr->setStatic( m.contains("static") ); } ; parameterDef returns [ ArgumentDom arg ] { TQString tp; arg = m_model->create(); } : #(PARAMETER_DEF modifiers tp=typeSpec IDENT ) { arg->setType( tp ); arg->setName( #IDENT->getText().c_str() ); } ; objectinitializer : #(INSTANCE_INIT slist) ; variableDeclarator [ VariableDom attr ] : IDENT { attr->setName( #IDENT->getText().c_str() ); attr->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() ); } | LBRACK variableDeclarator[attr] ; varInitializer : #(ASSIGN initializer) | ; initializer : expression | arrayInitializer ; arrayInitializer : #(ARRAY_INIT (initializer)*) ; methodHead [ FunctionDom meth ] { ArgumentDom arg; } : IDENT #( PARAMETERS (arg=parameterDef { meth->addArgument(arg); } )* ) (throwsClause)? { meth->setName( #IDENT->getText().c_str() ); meth->setScope( m_currentScope ); meth->setStartPosition( #IDENT->getLine(), #IDENT->getColumn() ); } ; throwsClause : #( "throws" (identifier)* ) ; identifier returns [ TQString id ] : IDENT { id = #IDENT->getText().c_str(); } | #( DOT id=identifier IDENT ) { id += TQString(".") + #IDENT->getText().c_str(); } ; identifierStar returns [ TQString id ] : IDENT { id = #IDENT->getText().c_str(); } | #( DOT id=identifier (STAR { id += TQString(".") + #STAR->getText().c_str(); } | IDENT { id += TQString(".") + #IDENT->getText().c_str(); }) ) ; slist : #( SLIST (stat)* ) ; stat: typeDefinition | variableDef | expression | #(LABELED_STAT IDENT stat) | #("if" expression stat (stat)? ) | #( "for" #(FOR_INIT (variableDef | elist)?) #(FOR_CONDITION (expression)?) #(FOR_ITERATOR (elist)?) stat ) | #("while" expression stat) | #("do" stat expression) | #("break" (IDENT)? ) | #("continue" (IDENT)? ) | #("return" (expression)? ) | #("switch" expression (caseGroup)*) | #("throw" expression) | #("synchronized" expression stat) | tryBlock | slist // nested SLIST | EMPTY_STAT ; caseGroup : #(CASE_GROUP (#("case" expression) | "default")+ slist) ; tryBlock : #( "try" slist (handler)* (#("finally" slist))? ) ; handler : #( "catch" parameterDef slist ) ; elist : #( ELIST (expression)* ) ; expression : #(EXPR expr) ; expr: #(QUESTION expr expr expr) // trinary operator | #(ASSIGN expr expr) // binary operators... | #(PLUS_ASSIGN expr expr) | #(MINUS_ASSIGN expr expr) | #(STAR_ASSIGN expr expr) | #(DIV_ASSIGN expr expr) | #(MOD_ASSIGN expr expr) | #(SR_ASSIGN expr expr) | #(BSR_ASSIGN expr expr) | #(SL_ASSIGN expr expr) | #(BAND_ASSIGN expr expr) | #(BXOR_ASSIGN expr expr) | #(BOR_ASSIGN expr expr) | #(LOR expr expr) | #(LAND expr expr) | #(BOR expr expr) | #(BXOR expr expr) | #(BAND expr expr) | #(NOT_EQUAL expr expr) | #(EQUAL expr expr) | #(LT_ expr expr) | #(GT expr expr) | #(LE expr expr) | #(GE expr expr) | #(SL expr expr) | #(SR expr expr) | #(BSR expr expr) | #(PLUS expr expr) | #(MINUS expr expr) | #(DIV expr expr) | #(MOD expr expr) | #(STAR expr expr) | #(INC expr) | #(DEC expr) | #(POST_INC expr) | #(POST_DEC expr) | #(BNOT expr) | #(LNOT expr) | #("instanceof" expr expr) | #(UNARY_MINUS expr) | #(UNARY_PLUS expr) | primaryExpression ; primaryExpression : IDENT | #( DOT ( expr ( IDENT | arrayIndex | "this" | "class" | #( "new" IDENT elist ) ) | #(ARRAY_DECLARATOR type) | builtInType ("class")? ) ) | arrayIndex | #(METHOD_CALL primaryExpression elist) | #(TYPECAST typeSpec expr) | newExpression | constant | "super" | "true" | "false" | "this" | "null" | typeSpec // type name used with instanceof ; arrayIndex : #(INDEX_OP primaryExpression expression) ; constant : NUM_INT | CHAR_LITERAL | STRING_LITERAL | NUM_FLOAT ; newExpression : #( "new" type ( newArrayDeclarator (arrayInitializer)? | elist ) ) ; newArrayDeclarator : #( ARRAY_DECLARATOR (newArrayDeclarator)? (expression)? ) ;