%{ /*------------------------------------------------------------------ * Copyright (C) 1996 Dmitri Bronnikov, All rights reserved. * * THIS GRAMMAR IS PROVIDED "AS IS" WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR NON-INFRINGMENT. * * This grammar can be used by anyone without any restrictions. * * Dmitri Bronnikov * 21485 Green Hill Rd * Farmington Hills, MI, 48335 * Bronikov@ic.net * *------------------------------------------------------------------ * * VERSION 1.04 DATE 11 JULY 1996 * *------------------------------------------------------------------ * * PARSING CONFLICTS RESOLVED * * Some Shift/Reduce conflicts have been resolved at the expense of * the grammar defines a superset of the language. The following * actions have to be performed to complete program syntax checking: * * 1) Check that modifiers applied to a class, interface, field, * or constructor are allowed in respectively a class, inteface, * field or constructor declaration. For example, a class * declaration should not allow other modifiers than abstract, * final and public. * * 2) For an expression statement, check it is either increment, or * decrement, or assignment expression. * * 3) Check that type expression in a cast operator indicates a type. * * 4) '[' optionally followed by any number of white-space characters * immediately followed by ']' should be either defined in lexer, * or intercepted and reaplced by OP_DIM token. * * OP_DIM [\[]{white_space}*[\]] * *------------------------------------------------------------------ * * CONFLICTS REPORTED BY YACC * * The only conflict reported by YACC is the if-then-else shift/reduce * conflict which is traditionally (and intentionally) left unresolved * *------------------------------------------------------------------ */ %} %token ABSTRACT %token BOOLEAN BREAK BYTE BYVALUE %token CASE CAST CATCH CHAR CLASS CONST CONTINUE %token DEFAULT DO DOUBLE %token ELSE EXTENDS %token FINAL FINALLY FLOAT FOR FUTURE %token GENERIC GOTO %token IF IMPLEMENTS IMPORT INNER INSTANCEOF INT INTERFACE %token LONG %token NATIVE NEW NULL %token OPERATOR OUTER %token PACKAGE PRIVATE PROTECTED PUBLIC %token REST RETURN %token SHORT STATIC SUPER SWITCH SYNCHRONIZED %token THIS THROW THROWS TRANSIENT TRY %token VAR VOID VOLATILE %token WHILE %token OP_INC OP_DEC %token OP_SHL OP_SHR OP_SHRR %token OP_GE OP_LE OP_EQ OP_NE %token OP_LAND OP_LOR %token OP_DIM %token ASS_MUL ASS_DIV ASS_MOD ASS_ADD ASS_SUB %token ASS_SHL ASS_SHR ASS_SHRR ASS_AND ASS_XOR ASS_OR %token IDENTIFIER LITERAL %start CompilationUnit %% TypeSpecifier : TypeName | TypeSpecifier OP_DIM ; TypeName : PrimitiveType | QualifiedName ; TypeNameList : TypeName | TypeNameList ',' TypeName ; PrimitiveType : BOOLEAN | CHAR | BYTE | SHORT | INT | LONG | FLOAT | DOUBLE | VOID ; CompilationUnit : PackageStatement ImportStatements TypeDeclarations | PackageStatement ImportStatements | PackageStatement TypeDeclarations | ImportStatements TypeDeclarations | PackageStatement | ImportStatements | TypeDeclarations ; PackageStatement : PACKAGE QualifiedName ';' ; TypeDeclarations : TypeDeclaration | TypeDeclarations TypeDeclaration ; TypeDeclaration : ClassDeclaration | InterfaceDeclaration ; ImportStatements : ImportStatement | ImportStatements ImportStatement ; ImportStatement : IMPORT QualifiedName ';' | IMPORT QualifiedName '.' '*' ';' ; QualifiedName : IDENTIFIER | QualifiedName '.' IDENTIFIER ; ClassDeclaration : Modifiers CLASS IDENTIFIER Super Interfaces ClassBody | Modifiers CLASS IDENTIFIER Super ClassBody | Modifiers CLASS IDENTIFIER Interfaces ClassBody | CLASS IDENTIFIER Super Interfaces ClassBody | Modifiers CLASS IDENTIFIER ClassBody | CLASS IDENTIFIER Super ClassBody | CLASS IDENTIFIER Interfaces ClassBody | CLASS IDENTIFIER ClassBody ; Modifiers : Modifier | Modifiers Modifier ; Modifier : ABSTRACT | FINAL | PUBLIC | PROTECTED | PRIVATE | STATIC | TRANSIENT | VOLATILE | NATIVE | SYNCHRONIZED ; Super : EXTENDS TypeNameList ; Interfaces : IMPLEMENTS TypeNameList ; ClassBody : '{' FieldDeclarations '}' | '{' '}' ; FieldDeclarations : FieldDeclaration | FieldDeclarations FieldDeclaration ; FieldDeclaration : FieldVariableDeclaration ';' | MethodDeclaration | ConstructorDeclaration | StaticInitializer ; FieldVariableDeclaration : Modifiers TypeSpecifier VariableDeclarators | TypeSpecifier VariableDeclarators ; VariableDeclarators : VariableDeclarator | VariableDeclarators ',' VariableDeclarator ; VariableDeclarator : DeclaratorName | DeclaratorName '=' VariableInitializer ; VariableInitializer : Expression | '{' '}' | '{' ArrayInitializers '}' ; ArrayInitializers : VariableInitializer | ArrayInitializers ',' VariableInitializer | ArrayInitializers ',' ; MethodDeclaration : Modifiers TypeSpecifier MethodDeclarator Throws MethodBody | Modifiers TypeSpecifier MethodDeclarator MethodBody | TypeSpecifier MethodDeclarator Throws MethodBody | TypeSpecifier MethodDeclarator MethodBody ; MethodDeclarator : DeclaratorName '(' ParameterList ')' | DeclaratorName '(' ')' | MethodDeclarator OP_DIM ; ParameterList : Parameter | ParameterList ',' Parameter ; Parameter : TypeSpecifier DeclaratorName ; DeclaratorName : IDENTIFIER | DeclaratorName OP_DIM ; Throws : THROWS TypeNameList ; MethodBody : Block | ';' ; ConstructorDeclaration : Modifiers ConstructorDeclarator Throws Block | Modifiers ConstructorDeclarator Block | ConstructorDeclarator Throws Block | ConstructorDeclarator Block ; ConstructorDeclarator : TypeName '(' ParameterList ')' | TypeName '(' ')' ; StaticInitializer : STATIC Block ; InterfaceDeclaration : Modifiers INTERFACE IDENTIFIER ExtendsInterfaces InterfaceBody | Modifiers INTERFACE IDENTIFIER InterfaceBody | INTERFACE IDENTIFIER ExtendsInterfaces InterfaceBody | INTERFACE IDENTIFIER InterfaceBody ; ExtendsInterfaces : EXTENDS TypeName | ExtendsInterfaces ',' TypeName ; InterfaceBody : '{' FieldDeclarations '}' ; Block : '{' LocalVariableDeclarationsAndStatements '}' | '{' '}' ; LocalVariableDeclarationsAndStatements : LocalVariableDeclarationOrStatement | LocalVariableDeclarationsAndStatements LocalVariableDeclarationOrStatement ; LocalVariableDeclarationOrStatement : LocalVariableDeclarationStatement | Statement ; LocalVariableDeclarationStatement : TypeSpecifier VariableDeclarators ';' ; Statement : EmptyStatement | LabeledStatement | ExpressionStatement ';' | SelectionStatement | IterationStatement | JumpStatement | GuardingStatement | Block ; EmptyStatement : ';' ; LabeledStatement : IDENTIFIER ':' LocalVariableDeclarationOrStatement | CASE ConstantExpression ':' LocalVariableDeclarationOrStatement | DEFAULT ':' LocalVariableDeclarationOrStatement ; ExpressionStatement : Expression ; SelectionStatement : IF '(' Expression ')' Statement | IF '(' Expression ')' Statement ELSE Statement | SWITCH '(' Expression ')' Block ; IterationStatement : WHILE '(' Expression ')' Statement | DO Statement WHILE '(' Expression ')' ';' | FOR '(' ForInit ForExpr ForIncr ')' Statement | FOR '(' ForInit ForExpr ')' Statement ; ForInit : ExpressionStatements ';' | LocalVariableDeclarationStatement | ';' ; ForExpr : Expression ';' | ';' ; ForIncr : ExpressionStatements ; ExpressionStatements : ExpressionStatement | ExpressionStatements ',' ExpressionStatement ; JumpStatement : BREAK IDENTIFIER ';' | BREAK ';' | CONTINUE IDENTIFIER ';' | CONTINUE ';' | RETURN Expression ';' | RETURN ';' | THROW Expression ';' ; GuardingStatement : SYNCHRONIZED '(' Expression ')' Statement | TRY Block Finally | TRY Block Catches | TRY Block Catches Finally ; Catches : Catch | Catches Catch ; Catch : CATCH '(' TypeSpecifier IDENTIFIER ')' Block | CATCH '(' TypeSpecifier ')' Block ; Finally : FINALLY Block ; PrimaryExpression : QualifiedName | NotJustName ; NotJustName : SpecialName | AllocationExpression | ComplexPrimary ; ComplexPrimary : '(' Expression ')' | ComplexPrimaryNoParenthesis ; ComplexPrimaryNoParenthesis : LITERAL | ArrayAccess | FieldAccess | MethodCall ; ArrayAccess : QualifiedName '[' Expression ']' | ComplexPrimary '[' Expression ']' ; FieldAccess : NotJustName '.' IDENTIFIER | ReallyPostfixExpression '.' IDENTIFIER ; MethodCall : MethodAccess '(' ArgumentList ')' | MethodAccess '(' ')' ; MethodAccess : ComplexPrimaryNoParenthesis | QualifiedName | SpecialName ; SpecialName : THIS | SUPER | NULL ; ArgumentList : Expression | ArgumentList ',' Expression ; AllocationExpression : NEW TypeName '(' ArgumentList ')' | NEW TypeName '(' ')' | NEW TypeName DimExprs Dims | NEW TypeName DimExprs ; DimExprs : DimExpr | DimExprs DimExpr ; DimExpr : '[' Expression ']' ; Dims : OP_DIM | Dims OP_DIM ; PostfixExpression : PrimaryExpression | ReallyPostfixExpression ; ReallyPostfixExpression : PostfixExpression OP_INC | PostfixExpression OP_DEC ; UnaryExpression : OP_INC UnaryExpression | OP_DEC UnaryExpression | ArithmeticUnaryOperator CastExpression | LogicalUnaryExpression ; LogicalUnaryExpression : PostfixExpression | LogicalUnaryOperator UnaryExpression ; LogicalUnaryOperator : '~' | '!' ; ArithmeticUnaryOperator : '+' | '-' ; CastExpression : UnaryExpression | '(' PrimitiveType ')' CastExpression | '(' Expression ')' LogicalUnaryExpression ; MultiplicativeExpression : CastExpression | MultiplicativeExpression '*' CastExpression | MultiplicativeExpression '/' CastExpression | MultiplicativeExpression '%' CastExpression ; AdditiveExpression : MultiplicativeExpression | AdditiveExpression '+' MultiplicativeExpression | AdditiveExpression '-' MultiplicativeExpression ; ShiftExpression : AdditiveExpression | ShiftExpression OP_SHL AdditiveExpression | ShiftExpression OP_SHR AdditiveExpression | ShiftExpression OP_SHRR AdditiveExpression ; RelationalExpression : ShiftExpression | RelationalExpression '<' ShiftExpression | RelationalExpression '>' ShiftExpression | RelationalExpression OP_LE ShiftExpression | RelationalExpression OP_GE ShiftExpression | RelationalExpression INSTANCEOF TypeSpecifier ; EqualityExpression : RelationalExpression | EqualityExpression OP_EQ RelationalExpression | EqualityExpression OP_NE RelationalExpression ; AndExpression : EqualityExpression | AndExpression '&' EqualityExpression ; ExclusiveOrExpression : AndExpression | ExclusiveOrExpression '^' AndExpression ; InclusiveOrExpression : ExclusiveOrExpression | InclusiveOrExpression '|' ExclusiveOrExpression ; ConditionalAndExpression : InclusiveOrExpression | ConditionalAndExpression OP_LAND InclusiveOrExpression ; ConditionalOrExpression : ConditionalAndExpression | ConditionalOrExpression OP_LOR ConditionalAndExpression ; ConditionalExpression : ConditionalOrExpression | ConditionalOrExpression '?' Expression ':' ConditionalExpression ; AssignmentExpression : ConditionalExpression | UnaryExpression AssignmentOperator AssignmentExpression ; AssignmentOperator : '=' | ASS_MUL | ASS_DIV | ASS_MOD | ASS_ADD | ASS_SUB | ASS_SHL | ASS_SHR | ASS_SHRR | ASS_AND | ASS_XOR | ASS_OR ; Expression : AssignmentExpression ; ConstantExpression : ConditionalExpression ; %%