home *** CD-ROM | disk | FTP | other *** search
- /*------------------------------------------------------------------
- * Copyright (C)
- * 1996, 1997, 1998 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.
- *
- * Bronikov@inreach.com
- *
- *------------------------------------------------------------------
- *
- * VERSION 1.06 DATE 20 AUG 1998
- *
- *------------------------------------------------------------------
- *
- * UPDATES
- *
- * 1.06 Correction of Java 1.1 syntax
- * 1.05 Yet more Java 1.1
- * <qualified name>.<allocation expression>
- * 1.04 More Java 1.1 features:
- * <class name>.this
- * <type name>.class
- * 1.03 Added Java 1.1 features:
- * inner classes,
- * anonymous classes,
- * non-static initializer blocks,
- * array initialization by new operator
- * 1.02 Corrected cast expression syntax
- * 1.01 All shift/reduce conflicts, except dangling else, resolved
- *
- *------------------------------------------------------------------
- *
- * 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.
- * Some of the compilers that I have tested will allow simultaneous
- * use of identically named type and variable in the same scope
- * depending on context.
- *
- * 4) Change lexical definition to change '[' optionally followed by
- * any number of white-space characters immediately followed by ']'
- * to OP_DIM token. I defined this token as [\[]{white_space}*[\]]
- * in the lexer.
- *
- *------------------------------------------------------------------
- *
- * UNRESOLVED SHIFT/REDUCE CONFLICTS
- *
- * Dangling else in if-then-else
- *
- *------------------------------------------------------------------
- */
-
- %token DOPEN "\(";
- %token DCLOSE "\)";
- %token COPEN "\{";
- %token CCLOSE "\}";
- %token BOPEN "\[";
- %token BCLOSE "\]";
- %token SEMICOLON "\;";
- %token COMMA "\,";
- %right DOT "\.";
-
- %token OP_EQ "==";
- %token OP_LE "\<=";
- %token OP_GE "\>=";
- %token OP_NE "!=";
- %token OP_LOR "\|\|";
- %token OP_LAND "&&";
- %token OP_INC "\+\+";
- %token OP_DEC "\-\-";
- %token OP_SHR "\>\>";
- %token OP_SHL "\<\<";
- %token OP_SHRR "\>\>\>";
- %token ASS_OP "\+= | \-= | \*= | /= | &= | \|= | \^= | \%= | \<\<= | \>\>= | \>\>\>=";
-
- %right EQ "\=";
- %token GT "\>";
- %token LT "\<";
- %token NOT "\!";
- %token TILDE "\~";
- %token QM "\?";
- %token COLON "\:";
- %token PLUS "\+";
- %token MINUS "\-";
- %token MULT "\*";
- %token DIV "\/";
- %token AND "\&";
- %token OR "\|";
- %token XOR "\^";
- %token MOD "\%";
-
- %token BOOLLIT "true|false";
-
- %token ABSTRACT "abstract";
- %token DO "do";
- %token IMPLEMENTS "implements";
- %token PACKAGE "package";
- %token THROW "throw";
- %token BOOLEAN "boolean";
- %token DOUBLE "double";
- %token IMPORT "import";
- %token PRIVATE "private";
- %token THROWS "throws";
- %token BREAK "break";
-
- %right ELSE "else";
-
- %token INNER "inner";
- %token PROTECTED "protected";
- %token TRANSIENT "transient";
- %token BYTE "byte";
- %token EXTENDS "extends";
- %token INSTANCEOF "instanceof";
- %token PUBLIC "public";
- %token TRY "try";
- %token CASE "case";
- %token FINAL "final";
- %token INT "int";
- %token REST "rest";
- %token VAR "var";
- %token CAST "cast";
- %token FINALLY "finally";
- %token INTERFACE "interface";
- %token RETURN "return";
- %token VOID "void";
- %token CATCH "catch";
- %token FLOAT "float";
- %token LONG "long";
- %token SHORT "short";
- %token VOLATILE "volatile";
- %token CHAR "char";
- %token FOR "for";
- %token NATIVE "native";
- %token STATIC "static";
- %token WHILE "while";
- %token CLASS "class";
- %token FUTURE "future";
- %token NEW "new";
- %token SUPER "super";
- %token CONST "const";
- %token GENERIC "generic";
- %token NULL "null";
- %token SWITCH "switch";
- %token CONTINUE "continue";
- %token GOTO "goto";
- %token OPERATOR "operator";
- %token SYNCHRONIZED "synchronized";
- %token DEFAULT "default";
- %token IF "if";
- %token OUTER "outer";
- %token THIS "this";
-
- %ab HexDigit "[0-9a-fA-F]";
- %ab Digit "[0-9]";
- %ab OctalDigit "[0-7]";
- %ab TetraDigit "[0-3]";
- %ab NonZeroDigit "[1-9]";
- %ab Letter "[a-zA-Z_]";
- %ab AnyButSlash "[^\/]";
- %ab AnyButAstr "[^\*]";
- %ab UniEsc "[\1b]";
-
- %ab OctEscape1 "\\ <OctalDigit>";
- %ab OctEscape2 "\\ <OctalDigit><OctalDigit>";
- %ab OctEscape3 "\\ <TetraDigit><OctalDigit><OctalDigit>";
- %ab OctEscape "(<OctEscape1>|<OctEscape2>|<OctEscape3>)";
-
- %ab Escape "[\\]([rnbft\\\'\"])";
- %ab ULetter "(<Letter>|<UniEsc>)";
- %ab Identifier "<ULetter>(<ULetter>|<Digit>)*";
-
- %ab IntSuffix "(l|L)";
- %ab DecimalNum "<NonZeroDigit><Digit>*<IntSuffix>?";
- %ab OctalNum "0 <OctalDigit>*<IntSuffix>?";
- %ab HexNum "0 (x|X) <HexDigit><HexDigit>*<IntSuffix>?";
- %ab IntegerLiteral "(<DecimalNum>|<OctalNum>|<HexNum>)";
-
- %ab Sign "(\+ | \-)";
- %ab FlSuffix "(f|F|d|D)";
- %ab SignedInt "<Sign>?<Digit>+";
- %ab Expo "(e|E)";
- %ab ExponentPart "<Expo><SignedInt>?";
- %ab Float1 "<Digit>+ \. (<Digit>+)?<ExponentPart>?<FlSuffix>?";
- %ab Float2 "\. <Digit>+<ExponentPart>?<FlSuffix>?";
- %ab Float3 "<Digit>+<ExponentPart><FlSuffix>?";
- %ab Float4 "<Digit>+<FlSuffix>";
- %ab FloatingPoint "(<Float1>|<Float2>|<Float3>|<Float4>)";
-
- %ab AnyChrChr "[^\\']";
- %ab AnyStrChr "[^\\\"]";
- %ab Character "\' (<Escape>|<OctEscape>|<AnyChrChr>) \'";
- %ab String "\" (<Escape>|<OctEscape>|<AnyStrChr>)* \"";
- %ab Numeric "(<IntegerLiteral>|<FloatingPoint>)";
-
- %token LITERAL "(<Numeric>|<Character>|<String>)";
-
- %token IDENTIFIER "([a-zA-Z_]|[\1b])(([a-zA-Z_]|[\1b])|[0-9])*";
-
-
- %token OP_DIM "\[ ([\r\n\t\ ]|( \/ \* ([^\*]| \* [^\/])* \* \/ |
- \/ \/ (.*)))* \]";
-
- %token SPACES "(\ )+";
- %token TAB "\t";
-
- %token EOL "\r(\n)?|\n"; // eol
-
- %token JAVADOC "/ \* \* ([^\*]|[\*][^/])* \* /";
- %token MULTILINECOMMENT "/ \* ([^\*]|\*[^/])* \* /";
-
- %token SINGLELINECOMMENT "\/ \/ (.*)";
-
- %start CompilationUnit;
-
- %%
-
- TypeSpecifier
- : TypeName
- | TypeName Dims
- ;
-
- TypeName
- : PrimitiveType
- | QualifiedName %prec DOT
- ;
-
- ClassNameList
- : QualifiedName
- | ClassNameList COMMA QualifiedName
- ;
-
- PrimitiveType
- : BOOLEAN
- | CHAR
- | BYTE
- | SHORT
- | INT
- | LONG
- | FLOAT
- | DOUBLE
- | VOID
- ;
-
- SemiColons
- : SEMICOLON
- | SemiColons SEMICOLON
- ;
-
- CompilationUnit
- : ProgramFile
- ;
-
- ProgramFile
- : PackageStatement ImportStatements TypeDeclarations
- | PackageStatement ImportStatements
- | PackageStatement TypeDeclarations
- | ImportStatements TypeDeclarations
- | PackageStatement
- | ImportStatements
- | TypeDeclarations
- ;
-
- PackageStatement
- : PACKAGE QualifiedName SemiColons
- ;
-
- TypeDeclarations
- : TypeDeclarationOptSemi
- | TypeDeclarations TypeDeclarationOptSemi
- ;
-
- TypeDeclarationOptSemi
- : TypeDeclaration
- | TypeDeclaration SemiColons
- ;
-
- ImportStatements
- : ImportStatement
- | ImportStatements ImportStatement
- ;
-
- ImportStatement
- : IMPORT QualifiedName SemiColons
- | IMPORT QualifiedName DOT MULT SemiColons
- ;
-
- QualifiedName
- : IDENTIFIER
- | QualifiedName DOT IDENTIFIER
- ;
-
- TypeDeclaration
- : ClassHeader COPEN FieldDeclarations CCLOSE
- | ClassHeader COPEN CCLOSE
- | JAVADOC ClassHeader COPEN FieldDeclarations CCLOSE
- | JAVADOC ClassHeader COPEN CCLOSE
- ;
-
- ClassHeader
- : Modifiers ClassWord IDENTIFIER Extends Interfaces
- | Modifiers ClassWord IDENTIFIER Extends
- | Modifiers ClassWord IDENTIFIER Interfaces
- | ClassWord IDENTIFIER Extends Interfaces
- | Modifiers ClassWord IDENTIFIER
- | ClassWord IDENTIFIER Extends
- | ClassWord IDENTIFIER Interfaces
- | ClassWord IDENTIFIER
- ;
-
- Modifiers
- : Modifier
- | Modifiers Modifier
- ;
-
- Modifier
- : ABSTRACT
- | FINAL
- | PUBLIC
- | PROTECTED
- | PRIVATE
- | STATIC
- | TRANSIENT
- | VOLATILE
- | NATIVE
- | SYNCHRONIZED
- ;
-
- ClassWord
- : CLASS
- | INTERFACE
- ;
-
- Interfaces
- : IMPLEMENTS ClassNameList
- ;
-
- FieldDeclarations
- : FieldDeclarationOptSemi
- | FieldDeclarations FieldDeclarationOptSemi
- ;
-
- FieldDeclarationOptSemi
- : FieldDeclaration
- | FieldDeclaration SemiColons
- ;
-
- FieldDeclaration
- : FieldVariableDeclaration SEMICOLON
- | MethodDeclaration
- | ConstructorDeclaration
- | StaticInitializer
- | NonStaticInitializer
- | TypeDeclaration
- ;
-
- FieldVariableDeclaration
- : Modifiers TypeSpecifier VariableDeclarators
- | TypeSpecifier VariableDeclarators
- | JAVADOC Modifiers TypeSpecifier VariableDeclarators
- | JAVADOC TypeSpecifier VariableDeclarators
- ;
-
- VariableDeclarators
- : VariableDeclarator
- | VariableDeclarators COMMA VariableDeclarator
- ;
-
- VariableDeclarator
- : DeclaratorName
- | DeclaratorName EQ VariableInitializer
- ;
-
- VariableInitializer
- : Expression
- | COPEN CCLOSE
- | COPEN ArrayInitializers CCLOSE
- ;
-
- ArrayInitializers
- : VariableInitializer
- | ArrayInitializers COMMA VariableInitializer
- | ArrayInitializers COMMA
- ;
-
- MethodDeclaration
- : Modifiers TypeSpecifier MethodDeclarator Throws MethodBody
- | Modifiers TypeSpecifier MethodDeclarator MethodBody
- | TypeSpecifier MethodDeclarator Throws MethodBody
- | TypeSpecifier MethodDeclarator MethodBody
- | JAVADOC Modifiers TypeSpecifier MethodDeclarator Throws MethodBody
- | JAVADOC Modifiers TypeSpecifier MethodDeclarator MethodBody
- | JAVADOC TypeSpecifier MethodDeclarator Throws MethodBody
- | JAVADOC TypeSpecifier MethodDeclarator MethodBody
- ;
-
- MethodDeclarator
- : DeclaratorName DOPEN ParameterList DCLOSE
- | DeclaratorName DOPEN DCLOSE
- | MethodDeclarator OP_DIM
- ;
-
- ParameterList
- : Parameter
- | ParameterList COMMA Parameter
- ;
-
- Parameter
- : TypeSpecifier DeclaratorName
- | FINAL TypeSpecifier DeclaratorName
- ;
-
- DeclaratorName
- : IDENTIFIER
- | DeclaratorName OP_DIM
- ;
-
- Throws
- : THROWS ClassNameList
- ;
-
- MethodBody
- : Block
- | SEMICOLON
- ;
-
- ConstructorDeclaration
- : Modifiers ConstructorDeclarator Throws Block
- | Modifiers ConstructorDeclarator Block
- | ConstructorDeclarator Throws Block
- | ConstructorDeclarator Block
- | JAVADOC Modifiers ConstructorDeclarator Throws Block
- | JAVADOC Modifiers ConstructorDeclarator Block
- | JAVADOC ConstructorDeclarator Throws Block
- | JAVADOC ConstructorDeclarator Block
- ;
-
- ConstructorDeclarator
- : IDENTIFIER DOPEN ParameterList DCLOSE
- | IDENTIFIER DOPEN DCLOSE
- ;
-
- StaticInitializer
- : STATIC Block
- | JAVADOC STATIC Block
- ;
-
- NonStaticInitializer
- : Block
- ;
-
- Extends
- : EXTENDS TypeName
- | Extends COMMA TypeName
- ;
-
- Block
- : COPEN LocalVariableDeclarationsAndStatements CCLOSE
- | COPEN CCLOSE
- ;
-
- LocalVariableDeclarationsAndStatements
- : LocalVariableDeclarationOrStatement
- | LocalVariableDeclarationsAndStatements LocalVariableDeclarationOrStatement
- ;
-
- LocalVariableDeclarationOrStatement
- : LocalVariableDeclarationStatement
- | Statement
- ;
-
- LocalVariableDeclarationStatement
- : TypeSpecifier VariableDeclarators SEMICOLON
- | FINAL TypeSpecifier VariableDeclarators SEMICOLON
- ;
-
- Statement
- : EmptyStatement
- | LabelStatement
- | ExpressionStatement SEMICOLON
- | SelectionStatement
- | IterationStatement
- | JumpStatement
- | GuardingStatement
- | Block
- ;
-
- EmptyStatement
- : SEMICOLON
- ;
-
- LabelStatement
- : IDENTIFIER COLON
- | CASE ConstantExpression COLON
- | DEFAULT COLON
- ;
-
- ExpressionStatement
- : Expression
- ;
-
- SelectionStatement
- : IF DOPEN Expression DCLOSE Statement %prec ELSE
- | IF DOPEN Expression DCLOSE Statement ELSE Statement %prec ELSE
- | SWITCH DOPEN Expression DCLOSE Block
- ;
-
- IterationStatement
- : WHILE DOPEN Expression DCLOSE Statement
- | DO Statement WHILE DOPEN Expression DCLOSE SEMICOLON
- | FOR DOPEN ForInit ForExpr ForIncr DCLOSE Statement
- | FOR DOPEN ForInit ForExpr DCLOSE Statement
- ;
-
- ForInit
- : ExpressionStatements SEMICOLON
- | LocalVariableDeclarationStatement
- | SEMICOLON
- ;
-
- ForExpr
- : Expression SEMICOLON
- | SEMICOLON
- ;
-
- ForIncr
- : ExpressionStatements
- ;
-
- ExpressionStatements
- : ExpressionStatement
- | ExpressionStatements COMMA ExpressionStatement
- ;
-
- JumpStatement
- : BREAK IDENTIFIER SEMICOLON
- | BREAK SEMICOLON
- | CONTINUE IDENTIFIER SEMICOLON
- | CONTINUE SEMICOLON
- | RETURN Expression SEMICOLON
- | RETURN SEMICOLON
- | THROW Expression SEMICOLON
- ;
-
- GuardingStatement
- : SYNCHRONIZED DOPEN Expression DCLOSE Statement
- | TRY Block Finally
- | TRY Block Catches
- | TRY Block Catches Finally
- ;
-
- Catches
- : Catch
- | Catches Catch
- ;
-
- Catch
- : CatchHeader Block
- ;
-
- CatchHeader
- : CATCH DOPEN TypeSpecifier IDENTIFIER DCLOSE
- | CATCH DOPEN TypeSpecifier DCLOSE
- ;
-
- Finally
- : FINALLY Block
- ;
-
- PrimaryExpression
- : QualifiedName %prec DOPEN
- | NotJustName
- ;
-
- NotJustName
- : SpecialName
- | NewAllocationExpression
- | ComplexPrimary
- ;
-
- ComplexPrimary
- : DOPEN Expression DCLOSE
- | ComplexPrimaryNoParenthesis
- ;
-
- ComplexPrimaryNoParenthesis
- : LITERAL
- | BOOLLIT
- | ArrayAccess
- | FieldAccess
- | MethodCall
- ;
-
- ArrayAccess
- : QualifiedName BOPEN Expression BCLOSE
- | ComplexPrimary BOPEN Expression BCLOSE
- ;
-
- FieldAccess
- : NotJustName DOT IDENTIFIER
- | RealPostfixExpression DOT IDENTIFIER
- | QualifiedName DOT THIS
- | QualifiedName DOT CLASS
- | PrimitiveType DOT CLASS
- ;
-
- MethodCall
- : MethodAccess DOPEN ArgumentList DCLOSE
- | MethodAccess DOPEN DCLOSE
- ;
-
- MethodAccess
- : ComplexPrimaryNoParenthesis
- | SpecialName
- | QualifiedName
- ;
-
- SpecialName
- : THIS
- | SUPER
- | NULL
- ;
-
- ArgumentList
- : Expression
- | ArgumentList COMMA Expression
- ;
-
- NewAllocationExpression
- : PlainNewAllocationExpression
- | QualifiedName DOT PlainNewAllocationExpression
- ;
-
- PlainNewAllocationExpression
- : ArrayAllocationExpression
- | ClassAllocationExpression
- | ArrayAllocationExpression COPEN CCLOSE
- | ClassAllocationExpression COPEN CCLOSE
- | ArrayAllocationExpression COPEN ArrayInitializers CCLOSE
- | ClassAllocationExpression COPEN FieldDeclarations CCLOSE
- ;
-
- ClassAllocationExpression
- : NEW TypeName DOPEN ArgumentList DCLOSE
- | NEW TypeName DOPEN DCLOSE
- ;
-
- ArrayAllocationExpression
- : NEW TypeName DimExprs Dims
- | NEW TypeName DimExprs
- | NEW TypeName Dims
- ;
-
- DimExprs
- : DimExpr
- | DimExprs DimExpr
- ;
-
- DimExpr
- : BOPEN Expression BCLOSE
- ;
-
- Dims
- : OP_DIM
- | Dims OP_DIM
- ;
-
- PostfixExpression
- : PrimaryExpression
- | RealPostfixExpression
- ;
-
- RealPostfixExpression
- : PostfixExpression OP_INC
- | PostfixExpression OP_DEC
- ;
-
- UnaryExpression
- : OP_INC UnaryExpression
- | OP_DEC UnaryExpression
- | ArithmeticUnaryOperator CastExpression
- | LogicalUnaryExpression
- ;
-
- LogicalUnaryExpression
- : PostfixExpression
- | LogicalUnaryOperator UnaryExpression
- ;
-
- LogicalUnaryOperator
- : TILDE
- | NOT
- ;
-
- ArithmeticUnaryOperator
- : PLUS
- | MINUS
- ;
-
- CastExpression
- : UnaryExpression
- | DOPEN PrimitiveTypeExpression DCLOSE CastExpression
- | DOPEN ClassTypeExpression DCLOSE CastExpression
- | DOPEN Expression DCLOSE LogicalUnaryExpression
- ;
-
- PrimitiveTypeExpression
- : PrimitiveType
- | PrimitiveType Dims
- ;
-
- ClassTypeExpression
- : QualifiedName Dims
- ;
-
- MultiplicativeExpression
- : CastExpression
- | MultiplicativeExpression MULT CastExpression
- | MultiplicativeExpression DIV CastExpression
- | MultiplicativeExpression MOD CastExpression
- ;
-
- AdditiveExpression
- : MultiplicativeExpression
- | AdditiveExpression PLUS MultiplicativeExpression
- | AdditiveExpression MINUS MultiplicativeExpression
- ;
-
- ShiftExpression
- : AdditiveExpression
- | ShiftExpression OP_SHL AdditiveExpression
- | ShiftExpression OP_SHR AdditiveExpression
- | ShiftExpression OP_SHRR AdditiveExpression
- ;
-
- RelationalExpression
- : ShiftExpression
- | RelationalExpression LT ShiftExpression
- | RelationalExpression GT 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 AND EqualityExpression
- ;
-
- ExclusiveOrExpression
- : AndExpression
- | ExclusiveOrExpression XOR AndExpression
- ;
-
- InclusiveOrExpression
- : ExclusiveOrExpression
- | InclusiveOrExpression OR ExclusiveOrExpression
- ;
-
- ConditionalAndExpression
- : InclusiveOrExpression
- | ConditionalAndExpression OP_LAND InclusiveOrExpression
- ;
-
- ConditionalOrExpression
- : ConditionalAndExpression
- | ConditionalOrExpression OP_LOR ConditionalAndExpression
- ;
-
- ConditionalExpression
- : ConditionalOrExpression
- | ConditionalOrExpression QM Expression COLON ConditionalExpression
- ;
-
- AssignmentExpression
- : ConditionalExpression
- | UnaryExpression AssignmentOperator AssignmentExpression
- ;
-
- AssignmentOperator
- : EQ
- | ASS_OP
- ;
-
- Expression
- : AssignmentExpression
- ;
-
- ConstantExpression
- : ConditionalExpression
- ;
-
-
-