diff --git a/benchmarks/src/main/kotlin/org/Main.kt b/benchmarks/src/main/kotlin/org/Main.kt index 31b602b59..1c7b3e1c9 100644 --- a/benchmarks/src/main/kotlin/org/Main.kt +++ b/benchmarks/src/main/kotlin/org/Main.kt @@ -2,12 +2,52 @@ package org import org.ucfs.Java8 import org.ucfs.JavaToken +import org.ucfs.grammar.combinator.Grammar +import org.ucfs.grammar.combinator.extension.StringExtension.or +import org.ucfs.grammar.combinator.extension.StringExtension.times +import org.ucfs.grammar.combinator.regexp.Nt +import org.ucfs.input.LinearInputLabel import org.ucfs.parser.ParserGenerator import java.nio.file.Path -fun main() { +fun generate() { ParserGenerator( Java8::class.java, JavaToken::class.java ).generate(Path.of("benchmarks/src/main/kotlin/"), "org.ucfs") -} \ No newline at end of file + +} + +fun runGenerated() { + val fileContents = """ + /** + * Provides JUnit v3.x test runners. + */ + package junit.runner; + """.trimIndent() + var cnt = 0 + var sleepCnt = 2000 + while (true) { + val parser = org.ucfs.Java8Parser() + parser.input = getTokenStream(fileContents) + val res = parser.parse().first!! + cnt += 1 + } +} + +fun main() { + generate() +} + +fun run() { + class L : Grammar() { + val List by Nt().asStart() + val Elem by Nt("x" or List) + + init { + List /= "[" * Elem + } + } + val l = L() +} + diff --git a/benchmarks/src/main/kotlin/org/ucfs/Java8.kt b/benchmarks/src/main/kotlin/org/ucfs/Java8.kt index dc7684965..2560530d7 100644 --- a/benchmarks/src/main/kotlin/org/ucfs/Java8.kt +++ b/benchmarks/src/main/kotlin/org/ucfs/Java8.kt @@ -3,543 +3,541 @@ import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.regexp.* class Java8 : Grammar() { - var CompilationUnit by Nt() - var Identifier by Nt() - var Literal by Nt() - var Type by Nt() - var PrimitiveType by Nt() - var ReferenceType by Nt() - var Annotation by Nt() - var NumericType by Nt() - var IntegralType by Nt() - var FloatingPointType by Nt() - var ClassOrInterfaceType by Nt() - var TypeVariable by Nt() - var ArrayType by Nt() - var ClassType by Nt() - var InterfaceType by Nt() - var TypeArguments by Nt() - var Dims by Nt() - var TypeParameter by Nt() - var TypeParameterModifier by Nt() - var TypeBound by Nt() - var AdditionalBound by Nt() - var TypeArgumentList by Nt() - var TypeArgument by Nt() - var Wildcard by Nt() - var WildcardBounds by Nt() - var TypeName by Nt() - var PackageOrTypeName by Nt() - var ExpressionName by Nt() - var AmbiguousName by Nt() - var MethodName by Nt() - var PackageName by Nt() - var Result by Nt() - var PackageDeclaration by Nt() - var ImportDeclaration by Nt() - var TypeDeclaration by Nt() - var PackageModifier by Nt() - var SingleTypeImportDeclaration by Nt() - var TypeImportOnDemandDeclaration by Nt() - var SingleStaticImportDeclaration by Nt() - var StaticImportOnDemandDeclaration by Nt() - var ClassDeclaration by Nt() - var InterfaceDeclaration by Nt() - var Throws by Nt() - var NormalClassDeclaration by Nt() - var EnumDeclaration by Nt() - var ClassModifier by Nt() - var TypeParameters by Nt() - var Superclass by Nt() - var Superinterfaces by Nt() - var ClassBody by Nt() - var TypeParameterList by Nt() - var InterfaceTypeList by Nt() - var ClassBodyDeclaration by Nt() - var ClassMemberDeclaration by Nt() - var InstanceInitializer by Nt() - var StaticInitializer by Nt() - var ConstructorDeclaration by Nt() - var FieldDeclaration by Nt() - var MethodDeclaration by Nt() - var FieldModifier by Nt() - var UnannType by Nt() - var VariableDeclaratorList by Nt() - var VariableDeclarator by Nt() - var VariableDeclaratorId by Nt() - var VariableInitializer by Nt() - var Expression by Nt() - var ArrayInitializer by Nt() - var UnannPrimitiveType by Nt() - var UnannReferenceType by Nt() - var UnannClassOrInterfaceType by Nt() - var UnannTypeVariable by Nt() - var UnannArrayType by Nt() - var UnannClassType by Nt() - var UnannInterfaceType by Nt() - var MethodModifier by Nt() - var MethodHeader by Nt() - var MethodBody by Nt() - var MethodDeclarator by Nt() - var FormalParameterList by Nt() - var ReceiverParameter by Nt() - var FormalParameters by Nt() - var LastFormalParameter by Nt() - var FormalParameter by Nt() - var VariableModifier by Nt() - var ExceptionTypeList by Nt() - var ExceptionType by Nt() - var Block by Nt() - var ConstructorModifier by Nt() - var ConstructorDeclarator by Nt() - var ConstructorBody by Nt() - var SimpleTypeName by Nt() - var ExplicitConstructorInvocation by Nt() - var EnumBody by Nt() - var EnumConstantList by Nt() - var EnumConstant by Nt() - var EnumConstantModifier by Nt() - var EnumBodyDeclarations by Nt() - var BlockStatements by Nt() - var ArgumentList by Nt() - var Primary by Nt() - var NormalInterfaceDeclaration by Nt() - var InterfaceModifier by Nt() - var ExtendsInterfaces by Nt() - var InterfaceBody by Nt() - var InterfaceMemberDeclaration by Nt() - var ConstantDeclaration by Nt() - var ConstantModifier by Nt() - var AnnotationTypeDeclaration by Nt() - var AnnotationTypeBody by Nt() - var AnnotationTypeMemberDeclaration by Nt() - var AnnotationTypeElementDeclaration by Nt() - var DefaultValue by Nt() - var NormalAnnotation by Nt() - var ElementValuePairList by Nt() - var ElementValuePair by Nt() - var ElementValue by Nt() - var ElementValueArrayInitializer by Nt() - var ElementValueList by Nt() - var MarkerAnnotation by Nt() - var SingleElementAnnotation by Nt() - var InterfaceMethodDeclaration by Nt() - var AnnotationTypeElementModifier by Nt() - var ConditionalExpression by Nt() - var VariableInitializerList by Nt() - var BlockStatement by Nt() - var LocalVariableDeclarationStatement by Nt() - var LocalVariableDeclaration by Nt() - var Statement by Nt() - var StatementNoShortIf by Nt() - var StatementWithoutTrailingSubstatement by Nt() - var EmptyStatement by Nt() - var LabeledStatement by Nt() - var LabeledStatementNoShortIf by Nt() - var ExpressionStatement by Nt() - var StatementExpression by Nt() - var IfThenStatement by Nt() - var IfThenElseStatement by Nt() - var IfThenElseStatementNoShortIf by Nt() - var AssertStatement by Nt() - var SwitchStatement by Nt() - var SwitchBlock by Nt() - var SwitchBlockStatementGroup by Nt() - var SwitchLabels by Nt() - var SwitchLabel by Nt() - var EnumConstantName by Nt() - var WhileStatement by Nt() - var WhileStatementNoShortIf by Nt() - var DoStatement by Nt() - var InterfaceMethodModifier by Nt() - var ForStatement by Nt() - var ForStatementNoShortIf by Nt() - var BasicForStatement by Nt() - var BasicForStatementNoShortIf by Nt() - var ForInit by Nt() - var ForUpdate by Nt() - var StatementExpressionList by Nt() - var EnhancedForStatement by Nt() - var EnhancedForStatementNoShortIf by Nt() - var BreakStatement by Nt() - var ContinueStatement by Nt() - var ReturnStatement by Nt() - var ThrowStatement by Nt() - var SynchronizedStatement by Nt() - var TryStatement by Nt() - var Catches by Nt() - var CatchClause by Nt() - var CatchFormalParameter by Nt() - var CatchType by Nt() - var Finally by Nt() - var TryWithResourcesStatement by Nt() - var ResourceSpecification by Nt() - var ResourceList by Nt() - var Resource by Nt() - var PrimaryNoNewArray by Nt() - var ClassLiteral by Nt() - var classOrInterfaceTypeToInstantiate by Nt() - var UnqualifiedClassInstanceCreationExpression by Nt() - var ClassInstanceCreationExpression by Nt() - var FieldAccess by Nt() - var TypeArgumentsOrDiamond by Nt() - var ArrayAccess by Nt() - var MethodInvocation by Nt() - var MethodReference by Nt() - var ArrayCreationExpression by Nt() - var DimExprs by Nt() - var DimExpr by Nt() - var LambdaExpression by Nt() - var LambdaParameters by Nt() - var InferredFormalParameterList by Nt() - var LambdaBody by Nt() - var AssignmentExpression by Nt() - var Assignment by Nt() - var LeftHandSide by Nt() - var AssignmentOperator by Nt() - var ConditionalOrExpression by Nt() - var ConditionalAndExpression by Nt() - var InclusiveOrExpression by Nt() - var ExclusiveOrExpression by Nt() - var AndExpression by Nt() - var EqualityExpression by Nt() - var RelationalExpression by Nt() - var ShiftExpression by Nt() - var AdditiveExpression by Nt() - var MultiplicativeExpression by Nt() - var PreIncrementExpression by Nt() - var PreDecrementExpression by Nt() - var UnaryExpressionNotPlusMinus by Nt() - var UnaryExpression by Nt() - var PostfixExpression by Nt() - var PostIncrementExpression by Nt() - var PostDecrementExpression by Nt() - var CastExpression by Nt() - var ConstantExpression by Nt() + val CompilationUnit by Nt().asStart() + val Identifier by Nt() + val Literal by Nt() + val Type by Nt() + val PrimitiveType by Nt() + val ReferenceType by Nt() + val Annotation by Nt() + val NumericType by Nt() + val IntegralType by Nt() + val FloatingPointType by Nt() + val ClassOrInterfaceType by Nt() + val TypeVariable by Nt() + val ArrayType by Nt() + val ClassType by Nt() + val InterfaceType by Nt() + val TypeArguments by Nt() + val Dims by Nt() + val TypeParameter by Nt() + val TypeParameterModifier by Nt() + val TypeBound by Nt() + val AdditionalBound by Nt() + val TypeArgumentList by Nt() + val TypeArgument by Nt() + val Wildcard by Nt() + val WildcardBounds by Nt() + val TypeName by Nt() + val PackageOrTypeName by Nt() + val ExpressionName by Nt() + val AmbiguousName by Nt() + val MethodName by Nt() + val PackageName by Nt() + val Result by Nt() + val PackageDeclaration by Nt() + val ImportDeclaration by Nt() + val TypeDeclaration by Nt() + val PackageModifier by Nt() + val SingleTypeImportDeclaration by Nt() + val TypeImportOnDemandDeclaration by Nt() + val SingleStaticImportDeclaration by Nt() + val StaticImportOnDemandDeclaration by Nt() + val ClassDeclaration by Nt() + val InterfaceDeclaration by Nt() + val Throws by Nt() + val NormalClassDeclaration by Nt() + val EnumDeclaration by Nt() + val ClassModifier by Nt() + val TypeParameters by Nt() + val Superclass by Nt() + val Superinterfaces by Nt() + val ClassBody by Nt() + val TypeParameterList by Nt() + val InterfaceTypeList by Nt() + val ClassBodyDeclaration by Nt() + val ClassMemberDeclaration by Nt() + val InstanceInitializer by Nt() + val StaticInitializer by Nt() + val ConstructorDeclaration by Nt() + val FieldDeclaration by Nt() + val MethodDeclaration by Nt() + val FieldModifier by Nt() + val UnannType by Nt() + val VariableDeclaratorList by Nt() + val VariableDeclarator by Nt() + val VariableDeclaratorId by Nt() + val VariableInitializer by Nt() + val Expression by Nt() + val ArrayInitializer by Nt() + val UnannPrimitiveType by Nt() + val UnannReferenceType by Nt() + val UnannClassOrInterfaceType by Nt() + val UnannTypeVariable by Nt() + val UnannArrayType by Nt() + val UnannClassType by Nt() + val UnannInterfaceType by Nt() + val MethodModifier by Nt() + val MethodHeader by Nt() + val MethodBody by Nt() + val MethodDeclarator by Nt() + val FormalParameterList by Nt() + val ReceiverParameter by Nt() + val FormalParameters by Nt() + val LastFormalParameter by Nt() + val FormalParameter by Nt() + val VariableModifier by Nt() + val ExceptionTypeList by Nt() + val ExceptionType by Nt() + val Block by Nt() + val ConstructorModifier by Nt() + val ConstructorDeclarator by Nt() + val ConstructorBody by Nt() + val SimpleTypeName by Nt() + val ExplicitConstructorInvocation by Nt() + val EnumBody by Nt() + val EnumConstantList by Nt() + val EnumConstant by Nt() + val EnumConstantModifier by Nt() + val EnumBodyDeclarations by Nt() + val BlockStatements by Nt() + val ArgumentList by Nt() + val Primary by Nt() + val NormalInterfaceDeclaration by Nt() + val InterfaceModifier by Nt() + val ExtendsInterfaces by Nt() + val InterfaceBody by Nt() + val InterfaceMemberDeclaration by Nt() + val ConstantDeclaration by Nt() + val ConstantModifier by Nt() + val AnnotationTypeDeclaration by Nt() + val AnnotationTypeBody by Nt() + val AnnotationTypeMemberDeclaration by Nt() + val AnnotationTypeElementDeclaration by Nt() + val DefaultValue by Nt() + val NormalAnnotation by Nt() + val ElementValuePairList by Nt() + val ElementValuePair by Nt() + val ElementValue by Nt() + val ElementValueArrayInitializer by Nt() + val ElementValueList by Nt() + val MarkerAnnotation by Nt() + val SingleElementAnnotation by Nt() + val InterfaceMethodDeclaration by Nt() + val AnnotationTypeElementModifier by Nt() + val ConditionalExpression by Nt() + val VariableInitializerList by Nt() + val BlockStatement by Nt() + val LocalVariableDeclarationStatement by Nt() + val LocalVariableDeclaration by Nt() + val Statement by Nt() + val StatementNoShortIf by Nt() + val StatementWithoutTrailingSubstatement by Nt() + val EmptyStatement by Nt() + val LabeledStatement by Nt() + val LabeledStatementNoShortIf by Nt() + val ExpressionStatement by Nt() + val StatementExpression by Nt() + val IfThenStatement by Nt() + val IfThenElseStatement by Nt() + val IfThenElseStatementNoShortIf by Nt() + val AssertStatement by Nt() + val SwitchStatement by Nt() + val SwitchBlock by Nt() + val SwitchBlockStatementGroup by Nt() + val SwitchLabels by Nt() + val SwitchLabel by Nt() + val EnumConstantName by Nt() + val WhileStatement by Nt() + val WhileStatementNoShortIf by Nt() + val DoStatement by Nt() + val InterfaceMethodModifier by Nt() + val ForStatement by Nt() + val ForStatementNoShortIf by Nt() + val BasicForStatement by Nt() + val BasicForStatementNoShortIf by Nt() + val ForInit by Nt() + val ForUpdate by Nt() + val StatementExpressionList by Nt() + val EnhancedForStatement by Nt() + val EnhancedForStatementNoShortIf by Nt() + val BreakStatement by Nt() + val ContinueStatement by Nt() + val ReturnStatement by Nt() + val ThrowStatement by Nt() + val SynchronizedStatement by Nt() + val TryStatement by Nt() + val Catches by Nt() + val CatchClause by Nt() + val CatchFormalParameter by Nt() + val CatchType by Nt() + val Finally by Nt() + val TryWithResourcesStatement by Nt() + val ResourceSpecification by Nt() + val ResourceList by Nt() + val Resource by Nt() + val PrimaryNoNewArray by Nt() + val ClassLiteral by Nt() + val classOrInterfaceTypeToInstantiate by Nt() + val UnqualifiedClassInstanceCreationExpression by Nt() + val ClassInstanceCreationExpression by Nt() + val FieldAccess by Nt() + val TypeArgumentsOrDiamond by Nt() + val ArrayAccess by Nt() + val MethodInvocation by Nt() + val MethodReference by Nt() + val ArrayCreationExpression by Nt() + val DimExprs by Nt() + val DimExpr by Nt() + val LambdaExpression by Nt() + val LambdaParameters by Nt() + val InferredFormalParameterList by Nt() + val LambdaBody by Nt() + val AssignmentExpression by Nt() + val Assignment by Nt() + val LeftHandSide by Nt() + val AssignmentOperator by Nt() + val ConditionalOrExpression by Nt() + val ConditionalAndExpression by Nt() + val InclusiveOrExpression by Nt() + val ExclusiveOrExpression by Nt() + val AndExpression by Nt() + val EqualityExpression by Nt() + val RelationalExpression by Nt() + val ShiftExpression by Nt() + val AdditiveExpression by Nt() + val MultiplicativeExpression by Nt() + val PreIncrementExpression by Nt() + val PreDecrementExpression by Nt() + val UnaryExpressionNotPlusMinus by Nt() + val UnaryExpression by Nt() + val PostfixExpression by Nt() + val PostIncrementExpression by Nt() + val PostDecrementExpression by Nt() + val CastExpression by Nt() + val ConstantExpression by Nt() init { - Identifier = JavaToken.ID + Identifier /= JavaToken.ID - Literal = JavaToken.INTEGERLIT or JavaToken.FLOATINGLIT or JavaToken.BOOLEANLIT or + Literal /= JavaToken.INTEGERLIT or JavaToken.FLOATINGLIT or JavaToken.BOOLEANLIT or JavaToken.CHARLIT or JavaToken.STRINGLIT or JavaToken.NULLLIT /** * Productions from §4 (Types, Values, and Variables) */ - Type = PrimitiveType or ReferenceType - PrimitiveType = Many(Annotation) * NumericType or Many(Annotation) * JavaToken.BOOLEAN - NumericType = IntegralType or FloatingPointType - IntegralType = JavaToken.BYTE or JavaToken.SHORT or JavaToken.INT or JavaToken.LONG or JavaToken.CHAR - FloatingPointType = JavaToken.FLOAT or JavaToken.DOUBLE - ReferenceType = ClassOrInterfaceType or TypeVariable or ArrayType - ClassOrInterfaceType = ClassType or InterfaceType - ClassType = Many(Annotation) * Identifier * Option(TypeArguments) or + Type /= PrimitiveType or ReferenceType + PrimitiveType /= Many(Annotation) * NumericType or Many(Annotation) * JavaToken.BOOLEAN + NumericType /= IntegralType or FloatingPointType + IntegralType /= JavaToken.BYTE or JavaToken.SHORT or JavaToken.INT or JavaToken.LONG or JavaToken.CHAR + FloatingPointType /= JavaToken.FLOAT or JavaToken.DOUBLE + ReferenceType /= ClassOrInterfaceType or TypeVariable or ArrayType + ClassOrInterfaceType /= ClassType or InterfaceType + ClassType /= Many(Annotation) * Identifier * Option(TypeArguments) or ClassOrInterfaceType * JavaToken.DOT * Many(Annotation) * Identifier * Option(TypeArguments) - InterfaceType = ClassType - TypeVariable = Many(Annotation) * Identifier - ArrayType = PrimitiveType * Dims or ClassOrInterfaceType * Dims or TypeVariable * Dims - Dims = Some(Many(Annotation) * JavaToken.BRACKETLEFT * JavaToken.BRACKETRIGHT) - TypeParameter = Many(TypeParameterModifier) * Identifier * Option(TypeBound) - TypeParameterModifier = Annotation - TypeBound = JavaToken.EXTENDS * TypeVariable or JavaToken.EXTENDS * ClassOrInterfaceType * Many(AdditionalBound) - AdditionalBound = JavaToken.ANDBIT * InterfaceType - TypeArguments = JavaToken.LT * TypeArgumentList * JavaToken.GT - TypeArgumentList = TypeArgument * Many(JavaToken.COMMA * TypeArgument) - TypeArgument = ReferenceType or Wildcard - Wildcard = Many(Annotation) * JavaToken.QUESTIONMARK * Option(WildcardBounds) - WildcardBounds = JavaToken.EXTENDS * ReferenceType or JavaToken.SUPER * ReferenceType + InterfaceType /= ClassType + TypeVariable /= Many(Annotation) * Identifier + ArrayType /= PrimitiveType * Dims or ClassOrInterfaceType * Dims or TypeVariable * Dims + Dims /= Some(Many(Annotation) * JavaToken.BRACKETLEFT * JavaToken.BRACKETRIGHT) + TypeParameter /= Many(TypeParameterModifier) * Identifier * Option(TypeBound) + TypeParameterModifier /= Annotation + TypeBound /= JavaToken.EXTENDS * TypeVariable or JavaToken.EXTENDS * ClassOrInterfaceType * Many(AdditionalBound) + AdditionalBound /= JavaToken.ANDBIT * InterfaceType + TypeArguments /= JavaToken.LT * TypeArgumentList * JavaToken.GT + TypeArgumentList /= TypeArgument * Many(JavaToken.COMMA * TypeArgument) + TypeArgument /= ReferenceType or Wildcard + Wildcard /= Many(Annotation) * JavaToken.QUESTIONMARK * Option(WildcardBounds) + WildcardBounds /= JavaToken.EXTENDS * ReferenceType or JavaToken.SUPER * ReferenceType /** * Productions from §6 (Names) */ - TypeName = Identifier or PackageOrTypeName * JavaToken.DOT * Identifier - PackageOrTypeName = Identifier or PackageOrTypeName * JavaToken.DOT * Identifier - ExpressionName = Identifier or AmbiguousName * JavaToken.DOT * Identifier - MethodName = Identifier - PackageName = Identifier or PackageName * JavaToken.DOT * Identifier - AmbiguousName = Identifier or AmbiguousName * JavaToken.DOT * Identifier + TypeName /= Identifier or PackageOrTypeName * JavaToken.DOT * Identifier + PackageOrTypeName /= Identifier or PackageOrTypeName * JavaToken.DOT * Identifier + ExpressionName /= Identifier or AmbiguousName * JavaToken.DOT * Identifier + MethodName /= Identifier + PackageName /= Identifier or PackageName * JavaToken.DOT * Identifier + AmbiguousName /= Identifier or AmbiguousName * JavaToken.DOT * Identifier /** * Productions from §7 (Packages) */ - CompilationUnit = Option(PackageDeclaration) * Many(ImportDeclaration) * Many(TypeDeclaration) - PackageDeclaration = Many(PackageModifier) * JavaToken.PACKAGE * Identifier * Many(JavaToken.DOT * Identifier) * JavaToken.SEMICOLON - PackageModifier = Annotation - ImportDeclaration = SingleTypeImportDeclaration or TypeImportOnDemandDeclaration or + CompilationUnit /= Option(PackageDeclaration) * Many(ImportDeclaration) * Many(TypeDeclaration) + PackageDeclaration /= Many(PackageModifier) * JavaToken.PACKAGE * Identifier * Many(JavaToken.DOT * Identifier) * JavaToken.SEMICOLON + PackageModifier /= Annotation + ImportDeclaration /= SingleTypeImportDeclaration or TypeImportOnDemandDeclaration or SingleStaticImportDeclaration or StaticImportOnDemandDeclaration - SingleTypeImportDeclaration = JavaToken.IMPORT * TypeName * JavaToken.SEMICOLON - TypeImportOnDemandDeclaration = JavaToken.IMPORT * PackageOrTypeName * JavaToken.DOT * JavaToken.STAR * JavaToken.SEMICOLON - SingleStaticImportDeclaration = JavaToken.IMPORT * JavaToken.STATIC * TypeName * JavaToken.DOT * Identifier * JavaToken.SEMICOLON - StaticImportOnDemandDeclaration = JavaToken.IMPORT * JavaToken.STATIC * TypeName * JavaToken.DOT * JavaToken.STAR * JavaToken.SEMICOLON - TypeDeclaration = ClassDeclaration or InterfaceDeclaration or JavaToken.SEMICOLON + SingleTypeImportDeclaration /= JavaToken.IMPORT * TypeName * JavaToken.SEMICOLON + TypeImportOnDemandDeclaration /= JavaToken.IMPORT * PackageOrTypeName * JavaToken.DOT * JavaToken.STAR * JavaToken.SEMICOLON + SingleStaticImportDeclaration /= JavaToken.IMPORT * JavaToken.STATIC * TypeName * JavaToken.DOT * Identifier * JavaToken.SEMICOLON + StaticImportOnDemandDeclaration /= JavaToken.IMPORT * JavaToken.STATIC * TypeName * JavaToken.DOT * JavaToken.STAR * JavaToken.SEMICOLON + TypeDeclaration /= ClassDeclaration or InterfaceDeclaration or JavaToken.SEMICOLON /** * Productions from §8 (Classes) */ - ClassDeclaration = NormalClassDeclaration or EnumDeclaration - NormalClassDeclaration = Many(ClassModifier) * JavaToken.CLASS * Identifier * + ClassDeclaration /= NormalClassDeclaration or EnumDeclaration + NormalClassDeclaration /= Many(ClassModifier) * JavaToken.CLASS * Identifier * Option(TypeParameters) * Option(Superclass) * Option(Superinterfaces) * ClassBody - ClassModifier = Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE or + ClassModifier /= Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE or JavaToken.ABSTRACT or JavaToken.STATIC or JavaToken.FINAL or JavaToken.STRICTFP - TypeParameters = JavaToken.LT * TypeParameterList * JavaToken.GT - TypeParameterList = TypeParameter * Many(JavaToken.COMMA * TypeParameter) - Superclass = JavaToken.EXTENDS * ClassType - Superinterfaces = JavaToken.IMPLEMENTS * InterfaceTypeList - InterfaceTypeList = InterfaceType * Many(JavaToken.COMMA * InterfaceType) - ClassBody = JavaToken.CURLYLEFT * Many(ClassBodyDeclaration) * JavaToken.CURLYRIGHT - ClassBodyDeclaration = ClassMemberDeclaration or InstanceInitializer or StaticInitializer or ConstructorDeclaration - ClassMemberDeclaration = FieldDeclaration or MethodDeclaration or ClassDeclaration or InterfaceDeclaration or JavaToken.SEMICOLON - FieldDeclaration = Many(FieldModifier) * UnannType * VariableDeclaratorList * JavaToken.SEMICOLON - FieldModifier = Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE or JavaToken.STATIC or + TypeParameters /= JavaToken.LT * TypeParameterList * JavaToken.GT + TypeParameterList /= TypeParameter * Many(JavaToken.COMMA * TypeParameter) + Superclass /= JavaToken.EXTENDS * ClassType + Superinterfaces /= JavaToken.IMPLEMENTS * InterfaceTypeList + InterfaceTypeList /= InterfaceType * Many(JavaToken.COMMA * InterfaceType) + ClassBody /= JavaToken.CURLYLEFT * Many(ClassBodyDeclaration) * JavaToken.CURLYRIGHT + ClassBodyDeclaration /= ClassMemberDeclaration or InstanceInitializer or StaticInitializer or ConstructorDeclaration + ClassMemberDeclaration /= FieldDeclaration or MethodDeclaration or ClassDeclaration or InterfaceDeclaration or JavaToken.SEMICOLON + FieldDeclaration /= Many(FieldModifier) * UnannType * VariableDeclaratorList * JavaToken.SEMICOLON + FieldModifier /= Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE or JavaToken.STATIC or JavaToken.FINAL or JavaToken.TRANSIENT or JavaToken.VOLATILE - VariableDeclaratorList = VariableDeclarator * Many(JavaToken.COMMA * VariableDeclarator) - VariableDeclarator = VariableDeclaratorId * Option(JavaToken.ASSIGN * VariableInitializer) - VariableDeclaratorId = Identifier * Option(Dims) - VariableInitializer = Expression or ArrayInitializer - UnannType = UnannPrimitiveType or UnannReferenceType - UnannPrimitiveType = NumericType or JavaToken.BOOLEAN - UnannReferenceType = UnannClassOrInterfaceType or UnannTypeVariable or UnannArrayType - UnannClassOrInterfaceType = UnannClassType or UnannInterfaceType - UnannClassType = Identifier * Option(TypeArguments) or + VariableDeclaratorList /= VariableDeclarator * Many(JavaToken.COMMA * VariableDeclarator) + VariableDeclarator /= VariableDeclaratorId * Option(JavaToken.ASSIGN * VariableInitializer) + VariableDeclaratorId /= Identifier * Option(Dims) + VariableInitializer /= Expression or ArrayInitializer + UnannType /= UnannPrimitiveType or UnannReferenceType + UnannPrimitiveType /= NumericType or JavaToken.BOOLEAN + UnannReferenceType /= UnannClassOrInterfaceType or UnannTypeVariable or UnannArrayType + UnannClassOrInterfaceType /= UnannClassType or UnannInterfaceType + UnannClassType /= Identifier * Option(TypeArguments) or UnannClassOrInterfaceType * JavaToken.DOT * Many(Annotation) * Identifier * Option(TypeArguments) - UnannInterfaceType = UnannClassType - UnannTypeVariable = Identifier - UnannArrayType = UnannPrimitiveType * Dims or UnannClassOrInterfaceType * Dims or UnannTypeVariable * Dims - MethodDeclaration = Many(MethodModifier) * MethodHeader * MethodBody - MethodModifier = Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE or JavaToken.ABSTRACT or + UnannInterfaceType /= UnannClassType + UnannTypeVariable /= Identifier + UnannArrayType /= UnannPrimitiveType * Dims or UnannClassOrInterfaceType * Dims or UnannTypeVariable * Dims + MethodDeclaration /= Many(MethodModifier) * MethodHeader * MethodBody + MethodModifier /= Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE or JavaToken.ABSTRACT or JavaToken.STATIC or JavaToken.FINAL or JavaToken.SYNCHRONIZED or JavaToken.NATIVE or JavaToken.STRICTFP - MethodHeader = Result * MethodDeclarator * Option(Throws) or + MethodHeader /= Result * MethodDeclarator * Option(Throws) or TypeParameters * Many(Annotation) * Result * MethodDeclarator * Option(Throws) - Result = UnannType or JavaToken.VOID - MethodDeclarator = Identifier * JavaToken.PARENTHLEFT * Option(FormalParameterList) * JavaToken.PARENTHRIGHT * Option(Dims) - FormalParameterList = ReceiverParameter or FormalParameters * JavaToken.COMMA * LastFormalParameter or + Result /= UnannType or JavaToken.VOID + MethodDeclarator /= Identifier * JavaToken.PARENTHLEFT * Option(FormalParameterList) * JavaToken.PARENTHRIGHT * Option(Dims) + FormalParameterList /= ReceiverParameter or FormalParameters * JavaToken.COMMA * LastFormalParameter or LastFormalParameter - FormalParameters = FormalParameter * Many(JavaToken.COMMA * FormalParameter) or + FormalParameters /= FormalParameter * Many(JavaToken.COMMA * FormalParameter) or ReceiverParameter * Many(JavaToken.COMMA * FormalParameter) - FormalParameter = Many(VariableModifier) * UnannType * VariableDeclaratorId - VariableModifier = Annotation or JavaToken.FINAL - LastFormalParameter = Many(VariableModifier) * UnannType * Many(Annotation) * JavaToken.ELLIPSIS * VariableDeclaratorId or FormalParameter - ReceiverParameter = Many(Annotation) * UnannType * Option(Identifier * JavaToken.DOT) * JavaToken.THIS - Throws = JavaToken.THROWS * ExceptionTypeList - ExceptionTypeList = ExceptionType * Many(JavaToken.COMMA * ExceptionType) - ExceptionType = ClassType or TypeVariable - MethodBody = Block or JavaToken.SEMICOLON - InstanceInitializer = Block - StaticInitializer = JavaToken.STATIC * Block - ConstructorDeclaration = Many(ConstructorModifier) * ConstructorDeclarator * Option(Throws) * ConstructorBody - ConstructorModifier = Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE - ConstructorDeclarator = Option(TypeParameters) * SimpleTypeName * JavaToken.PARENTHLEFT * Option(FormalParameterList) * JavaToken.PARENTHRIGHT - SimpleTypeName = Identifier - ConstructorBody = JavaToken.CURLYLEFT * Option(ExplicitConstructorInvocation) * Option(BlockStatements) * JavaToken.CURLYRIGHT - ExplicitConstructorInvocation = Option(TypeArguments) * JavaToken.THIS * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT * JavaToken.SEMICOLON or + FormalParameter /= Many(VariableModifier) * UnannType * VariableDeclaratorId + VariableModifier /= Annotation or JavaToken.FINAL + LastFormalParameter /= Many(VariableModifier) * UnannType * Many(Annotation) * JavaToken.ELLIPSIS * VariableDeclaratorId or FormalParameter + ReceiverParameter /= Many(Annotation) * UnannType * Option(Identifier * JavaToken.DOT) * JavaToken.THIS + Throws /= JavaToken.THROWS * ExceptionTypeList + ExceptionTypeList /= ExceptionType * Many(JavaToken.COMMA * ExceptionType) + ExceptionType /= ClassType or TypeVariable + MethodBody /= Block or JavaToken.SEMICOLON + InstanceInitializer /= Block + StaticInitializer /= JavaToken.STATIC * Block + ConstructorDeclaration /= Many(ConstructorModifier) * ConstructorDeclarator * Option(Throws) * ConstructorBody + ConstructorModifier /= Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE + ConstructorDeclarator /= Option(TypeParameters) * SimpleTypeName * JavaToken.PARENTHLEFT * Option(FormalParameterList) * JavaToken.PARENTHRIGHT + SimpleTypeName /= Identifier + ConstructorBody /= JavaToken.CURLYLEFT * Option(ExplicitConstructorInvocation) * Option(BlockStatements) * JavaToken.CURLYRIGHT + ExplicitConstructorInvocation /= Option(TypeArguments) * JavaToken.THIS * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT * JavaToken.SEMICOLON or Option(TypeArguments) * JavaToken.SUPER * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT * JavaToken.SEMICOLON or ExpressionName * JavaToken.DOT * Option(TypeArguments) * JavaToken.SUPER * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT * JavaToken.SEMICOLON or Primary * JavaToken.DOT * Option(TypeArguments) * JavaToken.SUPER * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT * JavaToken.SEMICOLON - EnumDeclaration = Many(ClassModifier) * JavaToken.ENUM * Identifier * Option(Superinterfaces) * EnumBody - EnumBody = JavaToken.CURLYLEFT * Option(EnumConstantList) * Option(JavaToken.COMMA) * Option(EnumBodyDeclarations) * JavaToken.CURLYRIGHT - EnumConstantList = EnumConstant * Many(JavaToken.COMMA * EnumConstant) - EnumConstant = Many(EnumConstantModifier) * Identifier * Option(JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT * Option(ClassBody)) - EnumConstantModifier = Annotation - EnumBodyDeclarations = JavaToken.SEMICOLON * Many(ClassBodyDeclaration) + EnumDeclaration /= Many(ClassModifier) * JavaToken.ENUM * Identifier * Option(Superinterfaces) * EnumBody + EnumBody /= JavaToken.CURLYLEFT * Option(EnumConstantList) * Option(JavaToken.COMMA) * Option(EnumBodyDeclarations) * JavaToken.CURLYRIGHT + EnumConstantList /= EnumConstant * Many(JavaToken.COMMA * EnumConstant) + EnumConstant /= Many(EnumConstantModifier) * Identifier * Option(JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT * Option(ClassBody)) + EnumConstantModifier /= Annotation + EnumBodyDeclarations /= JavaToken.SEMICOLON * Many(ClassBodyDeclaration) /** * Productions from §9 (Interfaces) */ - InterfaceDeclaration = NormalInterfaceDeclaration or AnnotationTypeDeclaration - NormalInterfaceDeclaration = + InterfaceDeclaration /= NormalInterfaceDeclaration or AnnotationTypeDeclaration + NormalInterfaceDeclaration /= Many(InterfaceModifier) * JavaToken.INTERFACE * Identifier * Option(TypeParameters) * Option(ExtendsInterfaces) * InterfaceBody - InterfaceModifier = Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE or + InterfaceModifier /= Annotation or JavaToken.PUBLIC or JavaToken.PROTECTED or JavaToken.PRIVATE or JavaToken.ABSTRACT or JavaToken.STATIC or JavaToken.STRICTFP - ExtendsInterfaces = JavaToken.EXTENDS * InterfaceTypeList - InterfaceBody = JavaToken.CURLYLEFT * Many(InterfaceMemberDeclaration) * JavaToken.CURLYRIGHT - InterfaceMemberDeclaration = ConstantDeclaration or InterfaceMethodDeclaration or ClassDeclaration or InterfaceDeclaration or JavaToken.SEMICOLON - ConstantDeclaration = Many(ConstantModifier) * UnannType * VariableDeclaratorList * JavaToken.SEMICOLON - ConstantModifier = Annotation or JavaToken.PUBLIC or JavaToken.STATIC or JavaToken.FINAL - InterfaceMethodDeclaration = Many(InterfaceMethodModifier) * MethodHeader * MethodBody - InterfaceMethodModifier = Annotation or JavaToken.PUBLIC or JavaToken.ABSTRACT or JavaToken.DEFAULT or JavaToken.STATIC or JavaToken.STRICTFP - AnnotationTypeDeclaration = Many(InterfaceModifier) * JavaToken.AT * JavaToken.INTERFACE * Identifier * AnnotationTypeBody - AnnotationTypeBody = JavaToken.CURLYLEFT * Many(AnnotationTypeMemberDeclaration) * JavaToken.CURLYRIGHT - AnnotationTypeMemberDeclaration = AnnotationTypeElementDeclaration or ConstantDeclaration or ClassDeclaration or InterfaceDeclaration or JavaToken.SEMICOLON - AnnotationTypeElementDeclaration = + ExtendsInterfaces /= JavaToken.EXTENDS * InterfaceTypeList + InterfaceBody /= JavaToken.CURLYLEFT * Many(InterfaceMemberDeclaration) * JavaToken.CURLYRIGHT + InterfaceMemberDeclaration /= ConstantDeclaration or InterfaceMethodDeclaration or ClassDeclaration or InterfaceDeclaration or JavaToken.SEMICOLON + ConstantDeclaration /= Many(ConstantModifier) * UnannType * VariableDeclaratorList * JavaToken.SEMICOLON + ConstantModifier /= Annotation or JavaToken.PUBLIC or JavaToken.STATIC or JavaToken.FINAL + InterfaceMethodDeclaration /= Many(InterfaceMethodModifier) * MethodHeader * MethodBody + InterfaceMethodModifier /= Annotation or JavaToken.PUBLIC or JavaToken.ABSTRACT or JavaToken.DEFAULT or JavaToken.STATIC or JavaToken.STRICTFP + AnnotationTypeDeclaration /= Many(InterfaceModifier) * JavaToken.AT * JavaToken.INTERFACE * Identifier * AnnotationTypeBody + AnnotationTypeBody /= JavaToken.CURLYLEFT * Many(AnnotationTypeMemberDeclaration) * JavaToken.CURLYRIGHT + AnnotationTypeMemberDeclaration /= AnnotationTypeElementDeclaration or ConstantDeclaration or ClassDeclaration or InterfaceDeclaration or JavaToken.SEMICOLON + AnnotationTypeElementDeclaration /= Many(AnnotationTypeElementModifier) * UnannType * Identifier * JavaToken.PARENTHLEFT * JavaToken.PARENTHRIGHT * Option(Dims) * Option(DefaultValue) * JavaToken.SEMICOLON - AnnotationTypeElementModifier = Annotation or JavaToken.PUBLIC or JavaToken.ABSTRACT - DefaultValue = JavaToken.DEFAULT * ElementValue - Annotation = NormalAnnotation or MarkerAnnotation or SingleElementAnnotation - NormalAnnotation = JavaToken.AT * TypeName * JavaToken.PARENTHLEFT * Option(ElementValuePairList) * JavaToken.PARENTHRIGHT - ElementValuePairList = ElementValuePair * Many(JavaToken.COMMA * ElementValuePair) - ElementValuePair = Identifier * JavaToken.ASSIGN * ElementValue - ElementValue = ConditionalExpression or ElementValueArrayInitializer or Annotation - ElementValueArrayInitializer = JavaToken.CURLYLEFT * Option(ElementValueList) * Option(JavaToken.COMMA) * JavaToken.CURLYRIGHT - ElementValueList = ElementValue * Many(JavaToken.COMMA * ElementValue) - MarkerAnnotation = JavaToken.AT * TypeName - SingleElementAnnotation = JavaToken.AT * TypeName * JavaToken.PARENTHLEFT * ElementValue * JavaToken.PARENTHRIGHT + AnnotationTypeElementModifier /= Annotation or JavaToken.PUBLIC or JavaToken.ABSTRACT + DefaultValue /= JavaToken.DEFAULT * ElementValue + Annotation /= NormalAnnotation or MarkerAnnotation or SingleElementAnnotation + NormalAnnotation /= JavaToken.AT * TypeName * JavaToken.PARENTHLEFT * Option(ElementValuePairList) * JavaToken.PARENTHRIGHT + ElementValuePairList /= ElementValuePair * Many(JavaToken.COMMA * ElementValuePair) + ElementValuePair /= Identifier * JavaToken.ASSIGN * ElementValue + ElementValue /= ConditionalExpression or ElementValueArrayInitializer or Annotation + ElementValueArrayInitializer /= JavaToken.CURLYLEFT * Option(ElementValueList) * Option(JavaToken.COMMA) * JavaToken.CURLYRIGHT + ElementValueList /= ElementValue * Many(JavaToken.COMMA * ElementValue) + MarkerAnnotation /= JavaToken.AT * TypeName + SingleElementAnnotation /= JavaToken.AT * TypeName * JavaToken.PARENTHLEFT * ElementValue * JavaToken.PARENTHRIGHT /** * Productions from §10 (Arrays) */ - ArrayInitializer = JavaToken.CURLYLEFT * Option(VariableInitializerList) * Option(JavaToken.COMMA) * JavaToken.CURLYRIGHT - VariableInitializerList = VariableInitializer * Many(JavaToken.COMMA * VariableInitializer) + ArrayInitializer /= JavaToken.CURLYLEFT * Option(VariableInitializerList) * Option(JavaToken.COMMA) * JavaToken.CURLYRIGHT + VariableInitializerList /= VariableInitializer * Many(JavaToken.COMMA * VariableInitializer) /** * Productions from §14 (Blocks and Statements) */ - Block = JavaToken.CURLYLEFT * Option(BlockStatements) * JavaToken.CURLYRIGHT - BlockStatements = BlockStatement * Many(BlockStatement) - BlockStatement = LocalVariableDeclarationStatement or ClassDeclaration or Statement - LocalVariableDeclarationStatement = LocalVariableDeclaration * JavaToken.SEMICOLON - LocalVariableDeclaration = Many(VariableModifier) * UnannType * VariableDeclaratorList - Statement = StatementWithoutTrailingSubstatement or LabeledStatement or IfThenStatement or IfThenElseStatement or + Block /= JavaToken.CURLYLEFT * Option(BlockStatements) * JavaToken.CURLYRIGHT + BlockStatements /= BlockStatement * Many(BlockStatement) + BlockStatement /= LocalVariableDeclarationStatement or ClassDeclaration or Statement + LocalVariableDeclarationStatement /= LocalVariableDeclaration * JavaToken.SEMICOLON + LocalVariableDeclaration /= Many(VariableModifier) * UnannType * VariableDeclaratorList + Statement /= StatementWithoutTrailingSubstatement or LabeledStatement or IfThenStatement or IfThenElseStatement or WhileStatement or ForStatement - StatementNoShortIf = StatementWithoutTrailingSubstatement or LabeledStatementNoShortIf or IfThenElseStatementNoShortIf or + StatementNoShortIf /= StatementWithoutTrailingSubstatement or LabeledStatementNoShortIf or IfThenElseStatementNoShortIf or WhileStatementNoShortIf or ForStatementNoShortIf - StatementWithoutTrailingSubstatement = Block or EmptyStatement or ExpressionStatement or AssertStatement or + StatementWithoutTrailingSubstatement /= Block or EmptyStatement or ExpressionStatement or AssertStatement or SwitchStatement or DoStatement or BreakStatement or ContinueStatement or ReturnStatement or SynchronizedStatement or ThrowStatement or TryStatement - EmptyStatement = JavaToken.SEMICOLON - LabeledStatement = Identifier * JavaToken.COLON * Statement - LabeledStatementNoShortIf = Identifier * JavaToken.COLON * StatementNoShortIf - ExpressionStatement = StatementExpression * JavaToken.SEMICOLON - StatementExpression = Assignment or PreIncrementExpression or PreDecrementExpression or PostIncrementExpression or + EmptyStatement /= JavaToken.SEMICOLON + LabeledStatement /= Identifier * JavaToken.COLON * Statement + LabeledStatementNoShortIf /= Identifier * JavaToken.COLON * StatementNoShortIf + ExpressionStatement /= StatementExpression * JavaToken.SEMICOLON + StatementExpression /= Assignment or PreIncrementExpression or PreDecrementExpression or PostIncrementExpression or PostDecrementExpression or MethodInvocation or ClassInstanceCreationExpression - IfThenStatement = JavaToken.IF * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * Statement - IfThenElseStatement = JavaToken.IF * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * StatementNoShortIf * JavaToken.ELSE * Statement - IfThenElseStatementNoShortIf = + IfThenStatement /= JavaToken.IF * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * Statement + IfThenElseStatement /= JavaToken.IF * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * StatementNoShortIf * JavaToken.ELSE * Statement + IfThenElseStatementNoShortIf /= JavaToken.IF * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * StatementNoShortIf * JavaToken.ELSE * StatementNoShortIf - AssertStatement = JavaToken.ASSERT * Expression * JavaToken.SEMICOLON or + AssertStatement /= JavaToken.ASSERT * Expression * JavaToken.SEMICOLON or JavaToken.ASSERT * Expression * JavaToken.COLON * Expression * JavaToken.SEMICOLON - SwitchStatement = JavaToken.SWITCH * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * SwitchBlock - SwitchBlock = JavaToken.CURLYLEFT * Many(SwitchBlockStatementGroup) * Many(SwitchLabel) * JavaToken.CURLYRIGHT - SwitchBlockStatementGroup = SwitchLabels * BlockStatements - SwitchLabels = Some(SwitchLabel) - SwitchLabel = JavaToken.CASE * ConstantExpression * JavaToken.COLON or + SwitchStatement /= JavaToken.SWITCH * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * SwitchBlock + SwitchBlock /= JavaToken.CURLYLEFT * Many(SwitchBlockStatementGroup) * Many(SwitchLabel) * JavaToken.CURLYRIGHT + SwitchBlockStatementGroup /= SwitchLabels * BlockStatements + SwitchLabels /= Some(SwitchLabel) + SwitchLabel /= JavaToken.CASE * ConstantExpression * JavaToken.COLON or JavaToken.CASE * EnumConstantName * JavaToken.COLON or JavaToken.DEFAULT * JavaToken.COLON - EnumConstantName = Identifier - WhileStatement = JavaToken.WHILE * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * Statement - WhileStatementNoShortIf = JavaToken.WHILE * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * StatementNoShortIf - DoStatement = JavaToken.DO * Statement * JavaToken.WHILE * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * JavaToken.SEMICOLON - ForStatement = BasicForStatement or EnhancedForStatement - ForStatementNoShortIf = BasicForStatementNoShortIf or EnhancedForStatementNoShortIf - BasicForStatement = JavaToken.FOR * JavaToken.PARENTHLEFT * Option(ForInit) * JavaToken.SEMICOLON * Option(Expression) * JavaToken.SEMICOLON * Option(ForUpdate) * JavaToken.PARENTHRIGHT * Statement - BasicForStatementNoShortIf = JavaToken.FOR * JavaToken.PARENTHLEFT * Option(ForInit) * JavaToken.SEMICOLON * Option(Expression) * JavaToken.SEMICOLON * Option(ForUpdate) * JavaToken.PARENTHRIGHT * StatementNoShortIf - ForInit = StatementExpressionList or LocalVariableDeclaration - ForUpdate = StatementExpressionList - StatementExpressionList = StatementExpression * Many(JavaToken.COMMA * StatementExpression) - EnhancedForStatement = JavaToken.FOR * JavaToken.PARENTHLEFT * Many(VariableModifier) * UnannType * VariableDeclaratorId * JavaToken.COLON * Expression * JavaToken.PARENTHRIGHT * Statement - EnhancedForStatementNoShortIf = JavaToken.FOR * JavaToken.PARENTHLEFT * Many(VariableModifier) * UnannType * VariableDeclaratorId * JavaToken.COLON * Expression * JavaToken.PARENTHRIGHT * StatementNoShortIf - BreakStatement = JavaToken.BREAK * Option(Identifier) * JavaToken.SEMICOLON - ContinueStatement = JavaToken.CONTINUE * Option(Identifier) * JavaToken.SEMICOLON - ReturnStatement = JavaToken.RETURN * Option(Expression) * JavaToken.SEMICOLON - ThrowStatement = JavaToken.THROW * Expression * JavaToken.SEMICOLON - SynchronizedStatement = JavaToken.SYNCHRONIZED * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * Block - TryStatement = JavaToken.TRY * Block * Catches or JavaToken.TRY * Block * Option(Catches) * Finally or TryWithResourcesStatement - Catches = Some(CatchClause) - CatchClause = JavaToken.CATCH * JavaToken.PARENTHLEFT * CatchFormalParameter * JavaToken.PARENTHRIGHT * Block - CatchFormalParameter = Many(VariableModifier) * CatchType * VariableDeclaratorId - CatchType = UnannClassType * Many(JavaToken.ORBIT * ClassType) - Finally = JavaToken.FINALLY * Block - TryWithResourcesStatement = JavaToken.TRY * ResourceSpecification * Block * Option(Catches) * Option(Finally) - ResourceSpecification = JavaToken.PARENTHLEFT * ResourceList * Option(JavaToken.SEMICOLON) * JavaToken.PARENTHRIGHT - ResourceList = Resource * Many(JavaToken.COMMA * Resource) - Resource = Many(VariableModifier) * UnannType * VariableDeclaratorId * JavaToken.ASSIGN * Expression + EnumConstantName /= Identifier + WhileStatement /= JavaToken.WHILE * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * Statement + WhileStatementNoShortIf /= JavaToken.WHILE * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * StatementNoShortIf + DoStatement /= JavaToken.DO * Statement * JavaToken.WHILE * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * JavaToken.SEMICOLON + ForStatement /= BasicForStatement or EnhancedForStatement + ForStatementNoShortIf /= BasicForStatementNoShortIf or EnhancedForStatementNoShortIf + BasicForStatement /= JavaToken.FOR * JavaToken.PARENTHLEFT * Option(ForInit) * JavaToken.SEMICOLON * Option(Expression) * JavaToken.SEMICOLON * Option(ForUpdate) * JavaToken.PARENTHRIGHT * Statement + BasicForStatementNoShortIf /= JavaToken.FOR * JavaToken.PARENTHLEFT * Option(ForInit) * JavaToken.SEMICOLON * Option(Expression) * JavaToken.SEMICOLON * Option(ForUpdate) * JavaToken.PARENTHRIGHT * StatementNoShortIf + ForInit /= StatementExpressionList or LocalVariableDeclaration + ForUpdate /= StatementExpressionList + StatementExpressionList /= StatementExpression * Many(JavaToken.COMMA * StatementExpression) + EnhancedForStatement /= JavaToken.FOR * JavaToken.PARENTHLEFT * Many(VariableModifier) * UnannType * VariableDeclaratorId * JavaToken.COLON * Expression * JavaToken.PARENTHRIGHT * Statement + EnhancedForStatementNoShortIf /= JavaToken.FOR * JavaToken.PARENTHLEFT * Many(VariableModifier) * UnannType * VariableDeclaratorId * JavaToken.COLON * Expression * JavaToken.PARENTHRIGHT * StatementNoShortIf + BreakStatement /= JavaToken.BREAK * Option(Identifier) * JavaToken.SEMICOLON + ContinueStatement /= JavaToken.CONTINUE * Option(Identifier) * JavaToken.SEMICOLON + ReturnStatement /= JavaToken.RETURN * Option(Expression) * JavaToken.SEMICOLON + ThrowStatement /= JavaToken.THROW * Expression * JavaToken.SEMICOLON + SynchronizedStatement /= JavaToken.SYNCHRONIZED * JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT * Block + TryStatement /= JavaToken.TRY * Block * Catches or JavaToken.TRY * Block * Option(Catches) * Finally or TryWithResourcesStatement + Catches /= Some(CatchClause) + CatchClause /= JavaToken.CATCH * JavaToken.PARENTHLEFT * CatchFormalParameter * JavaToken.PARENTHRIGHT * Block + CatchFormalParameter /= Many(VariableModifier) * CatchType * VariableDeclaratorId + CatchType /= UnannClassType * Many(JavaToken.ORBIT * ClassType) + Finally /= JavaToken.FINALLY * Block + TryWithResourcesStatement /= JavaToken.TRY * ResourceSpecification * Block * Option(Catches) * Option(Finally) + ResourceSpecification /= JavaToken.PARENTHLEFT * ResourceList * Option(JavaToken.SEMICOLON) * JavaToken.PARENTHRIGHT + ResourceList /= Resource * Many(JavaToken.COMMA * Resource) + Resource /= Many(VariableModifier) * UnannType * VariableDeclaratorId * JavaToken.ASSIGN * Expression /** * Productions from §15 (Expressions) */ - Primary = PrimaryNoNewArray or ArrayCreationExpression - PrimaryNoNewArray = Literal or ClassLiteral or JavaToken.THIS or TypeName * JavaToken.DOT * JavaToken.THIS or + Primary /= PrimaryNoNewArray or ArrayCreationExpression + PrimaryNoNewArray /= Literal or ClassLiteral or JavaToken.THIS or TypeName * JavaToken.DOT * JavaToken.THIS or JavaToken.PARENTHLEFT * Expression * JavaToken.PARENTHRIGHT or ClassInstanceCreationExpression or FieldAccess or ArrayAccess or MethodInvocation or MethodReference - ClassLiteral = TypeName * Many(JavaToken.BRACKETLEFT * JavaToken.BRACKETRIGHT) * JavaToken.DOT * JavaToken.CLASS or + ClassLiteral /= TypeName * Many(JavaToken.BRACKETLEFT * JavaToken.BRACKETRIGHT) * JavaToken.DOT * JavaToken.CLASS or NumericType * Many(JavaToken.BRACKETLEFT * JavaToken.BRACKETRIGHT) * JavaToken.DOT * JavaToken.CLASS or JavaToken.BOOLEAN * Many(JavaToken.BRACKETLEFT * JavaToken.BRACKETRIGHT) * JavaToken.DOT * JavaToken.CLASS or JavaToken.VOID * JavaToken.DOT * JavaToken.CLASS - ClassInstanceCreationExpression = UnqualifiedClassInstanceCreationExpression or + ClassInstanceCreationExpression /= UnqualifiedClassInstanceCreationExpression or ExpressionName * JavaToken.DOT * UnqualifiedClassInstanceCreationExpression or Primary * JavaToken.DOT * UnqualifiedClassInstanceCreationExpression - UnqualifiedClassInstanceCreationExpression = + UnqualifiedClassInstanceCreationExpression /= JavaToken.NEW * Option(TypeArguments) * classOrInterfaceTypeToInstantiate * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT * Option(ClassBody) - classOrInterfaceTypeToInstantiate = Many(Annotation) * Identifier * Many(JavaToken.DOT * Many(Annotation) * Identifier) * Option(TypeArgumentsOrDiamond) - TypeArgumentsOrDiamond = TypeArguments or JavaToken.LT * JavaToken.GT - FieldAccess = Primary * JavaToken.DOT * Identifier or JavaToken.SUPER * JavaToken.DOT * Identifier or + classOrInterfaceTypeToInstantiate /= Many(Annotation) * Identifier * Many(JavaToken.DOT * Many(Annotation) * Identifier) * Option(TypeArgumentsOrDiamond) + TypeArgumentsOrDiamond /= TypeArguments or JavaToken.LT * JavaToken.GT + FieldAccess /= Primary * JavaToken.DOT * Identifier or JavaToken.SUPER * JavaToken.DOT * Identifier or TypeName * JavaToken.DOT * JavaToken.SUPER * JavaToken.DOT * Identifier - ArrayAccess = ExpressionName * JavaToken.BRACKETLEFT * Expression * JavaToken.BRACKETRIGHT or + ArrayAccess /= ExpressionName * JavaToken.BRACKETLEFT * Expression * JavaToken.BRACKETRIGHT or PrimaryNoNewArray * JavaToken.BRACKETLEFT * Expression * JavaToken.BRACKETRIGHT - MethodInvocation = MethodName * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT or + MethodInvocation /= MethodName * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT or TypeName * JavaToken.DOT * Option(TypeArguments) * Identifier * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT or ExpressionName * JavaToken.DOT * Option(TypeArguments) * Identifier * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT or Primary * JavaToken.DOT * Option(TypeArguments) * Identifier * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT or JavaToken.SUPER * JavaToken.DOT * Option(TypeArguments) * Identifier * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT or TypeName * JavaToken.DOT * JavaToken.SUPER * JavaToken.DOT * Option(TypeArguments) * Identifier * JavaToken.PARENTHLEFT * Option(ArgumentList) * JavaToken.PARENTHRIGHT - ArgumentList = Expression * Many(JavaToken.COMMA * Expression) - MethodReference = ExpressionName * JavaToken.DOUBLECOLON * Option(TypeArguments) * Identifier or + ArgumentList /= Expression * Many(JavaToken.COMMA * Expression) + MethodReference /= ExpressionName * JavaToken.DOUBLECOLON * Option(TypeArguments) * Identifier or ReferenceType * JavaToken.DOUBLECOLON * Option(TypeArguments) * Identifier or Primary * JavaToken.DOUBLECOLON * Option(TypeArguments) * Identifier or JavaToken.SUPER * JavaToken.DOUBLECOLON * Option(TypeArguments) * Identifier or TypeName * JavaToken.DOT * JavaToken.SUPER * JavaToken.DOUBLECOLON * Option(TypeArguments) * Identifier or ClassType * JavaToken.DOUBLECOLON * Option(TypeArguments) * JavaToken.NEW or ArrayType * JavaToken.DOUBLECOLON * JavaToken.NEW - ArrayCreationExpression = JavaToken.NEW * PrimitiveType * DimExprs * Option(Dims) or + ArrayCreationExpression /= JavaToken.NEW * PrimitiveType * DimExprs * Option(Dims) or JavaToken.NEW * ClassOrInterfaceType * DimExprs * Option(Dims) or JavaToken.NEW * PrimitiveType * Dims * ArrayInitializer or JavaToken.NEW * ClassOrInterfaceType * Dims * ArrayInitializer - DimExprs = Some(DimExpr) - DimExpr = Many(Annotation) * JavaToken.BRACKETLEFT * Expression * JavaToken.BRACKETRIGHT - Expression = LambdaExpression or AssignmentExpression - LambdaExpression = LambdaParameters * JavaToken.ARROW * LambdaBody - LambdaParameters = Identifier or JavaToken.PARENTHLEFT * Option(FormalParameterList) * JavaToken.PARENTHRIGHT or + DimExprs /= Some(DimExpr) + DimExpr /= Many(Annotation) * JavaToken.BRACKETLEFT * Expression * JavaToken.BRACKETRIGHT + Expression /= LambdaExpression or AssignmentExpression + LambdaExpression /= LambdaParameters * JavaToken.ARROW * LambdaBody + LambdaParameters /= Identifier or JavaToken.PARENTHLEFT * Option(FormalParameterList) * JavaToken.PARENTHRIGHT or JavaToken.PARENTHLEFT * InferredFormalParameterList * JavaToken.PARENTHRIGHT - InferredFormalParameterList = Identifier * Many(JavaToken.COMMA * Identifier) - LambdaBody = Expression or Block - AssignmentExpression = ConditionalExpression or Assignment - Assignment = LeftHandSide * AssignmentOperator * Expression - LeftHandSide = ExpressionName or FieldAccess or ArrayAccess - AssignmentOperator = JavaToken.ASSIGN or JavaToken.STARASSIGN or JavaToken.SLASHASSIGN or JavaToken.PERCENTASSIGN or JavaToken.PLUSASSIGN or JavaToken.MINUSASSIGN or + InferredFormalParameterList /= Identifier * Many(JavaToken.COMMA * Identifier) + LambdaBody /= Expression or Block + AssignmentExpression /= ConditionalExpression or Assignment + Assignment /= LeftHandSide * AssignmentOperator * Expression + LeftHandSide /= ExpressionName or FieldAccess or ArrayAccess + AssignmentOperator /= JavaToken.ASSIGN or JavaToken.STARASSIGN or JavaToken.SLASHASSIGN or JavaToken.PERCENTASSIGN or JavaToken.PLUSASSIGN or JavaToken.MINUSASSIGN or JavaToken.SHIFTLEFTASSIGN or JavaToken.SHIFTRIGHTASSIGN or JavaToken.USRIGHTSHIFTASSIGN or JavaToken.ANDASSIGN or JavaToken.XORASSIGN or JavaToken.ORASSIGN - ConditionalExpression = ConditionalOrExpression or + ConditionalExpression /= ConditionalOrExpression or ConditionalOrExpression * JavaToken.QUESTIONMARK * Expression * JavaToken.COLON * ConditionalExpression or ConditionalOrExpression * JavaToken.QUESTIONMARK * Expression * JavaToken.COLON * LambdaExpression - ConditionalOrExpression = ConditionalAndExpression or + ConditionalOrExpression /= ConditionalAndExpression or ConditionalOrExpression * JavaToken.OR * ConditionalAndExpression - ConditionalAndExpression = InclusiveOrExpression or + ConditionalAndExpression /= InclusiveOrExpression or ConditionalAndExpression * JavaToken.AND * InclusiveOrExpression - InclusiveOrExpression = ExclusiveOrExpression or + InclusiveOrExpression /= ExclusiveOrExpression or InclusiveOrExpression * JavaToken.ORBIT * ExclusiveOrExpression - ExclusiveOrExpression = AndExpression or ExclusiveOrExpression * JavaToken.XORBIT * AndExpression - AndExpression = EqualityExpression or AndExpression * JavaToken.ANDBIT * EqualityExpression - EqualityExpression = RelationalExpression or EqualityExpression * JavaToken.EQ * RelationalExpression or + ExclusiveOrExpression /= AndExpression or ExclusiveOrExpression * JavaToken.XORBIT * AndExpression + AndExpression /= EqualityExpression or AndExpression * JavaToken.ANDBIT * EqualityExpression + EqualityExpression /= RelationalExpression or EqualityExpression * JavaToken.EQ * RelationalExpression or EqualityExpression * JavaToken.NOTEQ * RelationalExpression - RelationalExpression = ShiftExpression or RelationalExpression * JavaToken.LT * ShiftExpression or + RelationalExpression /= ShiftExpression or RelationalExpression * JavaToken.LT * ShiftExpression or RelationalExpression * JavaToken.GT * ShiftExpression or RelationalExpression * JavaToken.LESSEQ * ShiftExpression or RelationalExpression * JavaToken.GREATEQ * ShiftExpression or RelationalExpression * JavaToken.INSTANCEOF * ReferenceType - ShiftExpression = AdditiveExpression or ShiftExpression * JavaToken.LT * JavaToken.LT * AdditiveExpression or + ShiftExpression /= AdditiveExpression or ShiftExpression * JavaToken.LT * JavaToken.LT * AdditiveExpression or ShiftExpression * JavaToken.GT * JavaToken.GT * AdditiveExpression or ShiftExpression * JavaToken.GT * JavaToken.GT * JavaToken.GT * AdditiveExpression - AdditiveExpression = MultiplicativeExpression or AdditiveExpression * JavaToken.PLUS * MultiplicativeExpression or + AdditiveExpression /= MultiplicativeExpression or AdditiveExpression * JavaToken.PLUS * MultiplicativeExpression or AdditiveExpression * JavaToken.MINUS * MultiplicativeExpression - MultiplicativeExpression = UnaryExpression or MultiplicativeExpression * JavaToken.STAR * UnaryExpression or + MultiplicativeExpression /= UnaryExpression or MultiplicativeExpression * JavaToken.STAR * UnaryExpression or MultiplicativeExpression * JavaToken.SLASH * UnaryExpression or MultiplicativeExpression * JavaToken.PERCENT * UnaryExpression - UnaryExpression = PreIncrementExpression or PreDecrementExpression or JavaToken.PLUS * UnaryExpression or + UnaryExpression /= PreIncrementExpression or PreDecrementExpression or JavaToken.PLUS * UnaryExpression or JavaToken.MINUS * UnaryExpression or UnaryExpressionNotPlusMinus - PreIncrementExpression = JavaToken.PLUSPLUS * UnaryExpression - PreDecrementExpression = JavaToken.MINUSMINUS * UnaryExpression - UnaryExpressionNotPlusMinus = PostfixExpression or JavaToken.TILDA * UnaryExpression or JavaToken.EXCLAMATIONMARK * UnaryExpression or + PreIncrementExpression /= JavaToken.PLUSPLUS * UnaryExpression + PreDecrementExpression /= JavaToken.MINUSMINUS * UnaryExpression + UnaryExpressionNotPlusMinus /= PostfixExpression or JavaToken.TILDA * UnaryExpression or JavaToken.EXCLAMATIONMARK * UnaryExpression or CastExpression - PostfixExpression = Primary or ExpressionName or PostIncrementExpression or PostDecrementExpression - PostIncrementExpression = PostfixExpression * JavaToken.PLUSPLUS - PostDecrementExpression = PostfixExpression * JavaToken.MINUSMINUS - CastExpression = JavaToken.PARENTHLEFT * PrimitiveType * JavaToken.PARENTHRIGHT * UnaryExpression or + PostfixExpression /= Primary or ExpressionName or PostIncrementExpression or PostDecrementExpression + PostIncrementExpression /= PostfixExpression * JavaToken.PLUSPLUS + PostDecrementExpression /= PostfixExpression * JavaToken.MINUSMINUS + CastExpression /= JavaToken.PARENTHLEFT * PrimitiveType * JavaToken.PARENTHRIGHT * UnaryExpression or JavaToken.PARENTHLEFT * ReferenceType * Many(AdditionalBound) * JavaToken.PARENTHRIGHT * UnaryExpressionNotPlusMinus or JavaToken.PARENTHLEFT * ReferenceType * Many(AdditionalBound) * JavaToken.PARENTHRIGHT * LambdaExpression - ConstantExpression = Expression - - setStart(CompilationUnit) + ConstantExpression /= Expression } } \ No newline at end of file diff --git a/generator/src/main/kotlin/org/ucfs/examples/dyck/DyckGrammar.kt b/generator/src/main/kotlin/org/ucfs/examples/dyck/DyckGrammar.kt index e94a65b9b..96a9ee3c9 100644 --- a/generator/src/main/kotlin/org/ucfs/examples/dyck/DyckGrammar.kt +++ b/generator/src/main/kotlin/org/ucfs/examples/dyck/DyckGrammar.kt @@ -7,16 +7,12 @@ import org.ucfs.grammar.combinator.regexp.many import org.ucfs.grammar.combinator.regexp.or class DyckGrammar : Grammar() { - var S by Nt() - var Round by Nt() - var Quadrat by Nt() - var Curly by Nt() + val S by Nt().asStart() + val Round by Nt("(" * S * ")") + val Quadrat by Nt("[" * S * "]") + val Curly by Nt("{" * S * "}") init { - setStart(S) - S = many(Round or Quadrat or Curly) - Round = "(" * S * ")" - Quadrat = "[" * S * "]" - Curly = "{" * S * "}" + S /= many(Round or Quadrat or Curly) } } diff --git a/generator/src/main/kotlin/org/ucfs/examples/golang/SimpleGolang.kt b/generator/src/main/kotlin/org/ucfs/examples/golang/SimpleGolang.kt index 967f2e169..59bb2217f 100644 --- a/generator/src/main/kotlin/org/ucfs/examples/golang/SimpleGolang.kt +++ b/generator/src/main/kotlin/org/ucfs/examples/golang/SimpleGolang.kt @@ -1,4 +1,4 @@ -package org.ucfs.examples.golang +package org.ucfs.examples.golang import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.extension.StringExtension.or @@ -8,16 +8,8 @@ import org.ucfs.grammar.combinator.regexp.Nt import org.ucfs.grammar.combinator.regexp.or class SimpleGolang : Grammar() { - var Program by Nt() - var Block by Nt() - var Statement by Nt() - var IntExpr by Nt() - - init { - setStart(Program) - Program = Block - Block = Many(Statement) - Statement = IntExpr * ";" or "r" * IntExpr * ";" - IntExpr = "1" or "1" * "+" * "1" - } + val IntExpr by Nt("1" or "1" * "+" * "1") + val Statement by Nt(IntExpr * ";" or "r" * IntExpr * ";") + val Block by Nt(Many(Statement)) + val Program by Nt(Block).asStart() } diff --git a/generator/src/main/kotlin/org/ucfs/parser/GeneratedParser.kt b/generator/src/main/kotlin/org/ucfs/parser/GeneratedParser.kt index 45b10050c..4d193a062 100644 --- a/generator/src/main/kotlin/org/ucfs/parser/GeneratedParser.kt +++ b/generator/src/main/kotlin/org/ucfs/parser/GeneratedParser.kt @@ -59,13 +59,8 @@ abstract class GeneratedParser : } checkAcceptance(curSppfNode, leftExtent, rightExtent, nt) -// for (inputEdge in ctx.input.getEdges(pos)) { -// if (inputEdge.label.terminal == null) { -// handleTerminalOrEpsilonEdge(descriptor, curSppfNode, null, descriptor.rsmState, inputEdge.head, 0) -// } -// } callNtFuncs(nt, descriptor, curSppfNode) - // ntFuncs[nt.name]!!(descriptor, curSppfNode) + // ntFuncs[nt.name]!!(descriptor, curSppfNode) } protected fun handleTerminal( diff --git a/generator/src/main/kotlin/org/ucfs/parser/IParserGenerator.kt b/generator/src/main/kotlin/org/ucfs/parser/IParserGenerator.kt index df424486b..e9b32b347 100644 --- a/generator/src/main/kotlin/org/ucfs/parser/IParserGenerator.kt +++ b/generator/src/main/kotlin/org/ucfs/parser/IParserGenerator.kt @@ -42,7 +42,7 @@ interface IParserGenerator : IGeneratorFromGrammar { const val RSM_FIELD = "rsmState" const val POS_FIELD = "inputPosition" const val INPUT_FIELD = "input" - const val GET_NONTERMINAL = "getNonterminal" + const val NONTERMINAL = "nonterm" const val GET_TERMINALS = "getTerminals" const val TERMINALS = "terminals" const val HANDLE_TERMINAL = "handleTerminal" @@ -281,7 +281,7 @@ interface IParserGenerator : IGeneratorFromGrammar { val propertyBuilder = PropertySpec.builder(ntName, Nonterminal::class.asTypeName()) .addModifiers(KModifier.PRIVATE) - .initializer("%L.%L.%L()!!", GRAMMAR_NAME, ntName, GET_NONTERMINAL) + .initializer("%L.%L.%L", GRAMMAR_NAME, ntName, NONTERMINAL) return propertyBuilder.build() } } diff --git a/solver/src/main/kotlin/org/ucfs/grammar/combinator/Grammar.kt b/solver/src/main/kotlin/org/ucfs/grammar/combinator/Grammar.kt index d27655f65..dc9b58020 100644 --- a/solver/src/main/kotlin/org/ucfs/grammar/combinator/Grammar.kt +++ b/solver/src/main/kotlin/org/ucfs/grammar/combinator/Grammar.kt @@ -27,15 +27,22 @@ open class Grammar { } else throw IllegalArgumentException("Only NT object can be start state for Grammar") } + fun Nt.asStart(): Nt { + if (this@Grammar::startNt.isInitialized) { + throw Exception("Nonterminal ${nonterm.name} is already initialized") + } + startNt = this + return this + } + /** * Builds a Rsm for the grammar */ private fun buildRsm(): RsmState { nonTerms.forEach { it.buildRsmBox() } - val startState = startNt.getNonterminal()?.startState //if nonterminal not initialized -- it will be checked in buildRsmBox() - return startState!! + return startNt.nonterm.startState } /** diff --git a/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/DerivedSymbol.kt b/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/DerivedSymbol.kt index d4b550892..cfcbe0926 100644 --- a/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/DerivedSymbol.kt +++ b/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/DerivedSymbol.kt @@ -1,6 +1,7 @@ package org.ucfs.grammar.combinator.regexp interface DerivedSymbol : Regexp { + override fun derive(symbol: DerivedSymbol): Regexp { return if (this == symbol) Epsilon else Empty } diff --git a/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/Nt.kt b/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/Nt.kt index f1b1dd527..a9d5f6949 100644 --- a/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/Nt.kt +++ b/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/Nt.kt @@ -5,35 +5,41 @@ import org.ucfs.rsm.RsmState import org.ucfs.rsm.symbol.Nonterminal import kotlin.reflect.KProperty -open class Nt : DerivedSymbol { +open class Nt() : DerivedSymbol { + private lateinit var name : String + constructor(lhs: Regexp) : this() { + rsmDescription = lhs + } + lateinit var nonterm: Nonterminal private set private lateinit var rsmDescription: Regexp fun isInitialized(): Boolean { - return ::nonterm.isInitialized + return ::rsmDescription.isInitialized } fun buildRsmBox() { + nonterm.startState = RsmState(nonterm, isStart = true, rsmDescription.acceptEpsilon()) nonterm.startState.buildRsmBox(rsmDescription) } - override fun getNonterminal(): Nonterminal? { - return nonterm - } + operator fun getValue(grammar: Grammar, property: KProperty<*>): Nt = this - operator fun setValue(grammar: Grammar, property: KProperty<*>, lrh: Regexp) { - if (!this::nonterm.isInitialized) { - nonterm = Nonterminal(property.name) - grammar.nonTerms.add(this) - rsmDescription = lrh - nonterm.startState = RsmState(nonterm, isStart = true, rsmDescription.acceptEpsilon()) - } else { - throw Exception("Nonterminal ${property.name} is already initialized") + operator fun divAssign(lhs: Regexp) { + if (isInitialized()) { + throw Exception("Nonterminal '${nonterm.name}' is already initialized") } - + rsmDescription = lhs } - operator fun getValue(grammar: Grammar, property: KProperty<*>): Regexp = this -} \ No newline at end of file + operator fun provideDelegate( + grammar: Grammar, property: KProperty<*> + ): Nt { + name = property.name + nonterm = Nonterminal(property.name) + grammar.nonTerms.add(this) + return this + } +} diff --git a/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/Regexp.kt b/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/Regexp.kt index 4e052892e..c4559ab09 100644 --- a/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/Regexp.kt +++ b/solver/src/main/kotlin/org/ucfs/grammar/combinator/regexp/Regexp.kt @@ -1,14 +1,11 @@ package org.ucfs.grammar.combinator.regexp -import org.ucfs.rsm.symbol.Nonterminal - sealed interface Regexp { /* Based on Brzozowski derivative */ fun derive(symbol: DerivedSymbol): Regexp - fun getNonterminal(): Nonterminal? = null /* Does the expression accept an epsilon diff --git a/solver/src/main/kotlin/org/ucfs/gss/GssNode.kt b/solver/src/main/kotlin/org/ucfs/gss/GssNode.kt index b5b8315d8..86d74c6f3 100644 --- a/solver/src/main/kotlin/org/ucfs/gss/GssNode.kt +++ b/solver/src/main/kotlin/org/ucfs/gss/GssNode.kt @@ -45,9 +45,7 @@ class GssNode( fun addEdge(rsmState: RsmState, sppfNode: SppfNode?, gssNode: GssNode): Boolean { val label = Pair(rsmState, sppfNode) - if (!edges.containsKey(label)) edges[label] = HashSet() - - return edges.getValue(label).add(gssNode) + return edges.computeIfAbsent(label) { HashSet() }.add(gssNode) } override fun toString() = "GSSNode(nonterminal=$nonterminal, inputPosition=$inputPosition)" diff --git a/solver/src/main/kotlin/org/ucfs/input/IInputGraph.kt b/solver/src/main/kotlin/org/ucfs/input/IInputGraph.kt index ab25b5161..05b5b0bfc 100644 --- a/solver/src/main/kotlin/org/ucfs/input/IInputGraph.kt +++ b/solver/src/main/kotlin/org/ucfs/input/IInputGraph.kt @@ -14,7 +14,7 @@ import org.ucfs.sppf.node.SppfNode */ interface IInputGraph { fun log(msg: () -> String) { - // println(msg) + // println(msg) } /** @@ -127,18 +127,18 @@ interface IInputGraph { val inputPosition = descriptor.inputPosition val terminalEdges = rsmState.terminalEdges val nonterminalEdges = rsmState.nonterminalEdges - log{"\n$descriptor"} + log { "\n$descriptor" } for (inputEdge in ctx.input.getEdges(inputPosition)) { if (inputEdge.label.terminal == null) { - log{"Epsilon terminal"} + log { "Epsilon terminal" } handleTerminalOrEpsilonEdge(descriptor, sppfNode, null, descriptor.rsmState, inputEdge.head, 0) continue } - log{"Compare terminal: current ${inputEdge.label.terminal}$"} + log { "Compare terminal: current ${inputEdge.label.terminal}$" } for ((edgeTerminal, targetStates) in terminalEdges) { - log{"edgeTerminal ${edgeTerminal}$"} + log { "edgeTerminal ${edgeTerminal}$" } if (inputEdge.label.terminal == edgeTerminal) { - log{"EQUALS!"} + log { "EQUALS!" } for (target in targetStates) { handleTerminalOrEpsilonEdge(descriptor, sppfNode, edgeTerminal, target, inputEdge.head, 0) } diff --git a/solver/src/main/kotlin/org/ucfs/parser/IGll.kt b/solver/src/main/kotlin/org/ucfs/parser/IGll.kt index 4f3a04843..0f7b2ff54 100644 --- a/solver/src/main/kotlin/org/ucfs/parser/IGll.kt +++ b/solver/src/main/kotlin/org/ucfs/parser/IGll.kt @@ -74,14 +74,11 @@ interface IGll { weight: Int, ): GssNode { val gssNode = GssNode(nonterminal, inputPosition, weight) - - if (ctx.createdGssNodes.containsKey(gssNode)) { - if (ctx.createdGssNodes.getValue(gssNode).minWeightOfLeftPart > weight) { - ctx.createdGssNodes.getValue(gssNode).minWeightOfLeftPart = weight - } - } else ctx.createdGssNodes[gssNode] = gssNode - - return ctx.createdGssNodes.getValue(gssNode) + val storedNode = ctx.createdGssNodes.computeIfAbsent(gssNode) { gssNode } + if (storedNode.minWeightOfLeftPart > weight) { + storedNode.minWeightOfLeftPart = weight + } + return storedNode } /** diff --git a/solver/src/main/kotlin/org/ucfs/rsm/RsmState.kt b/solver/src/main/kotlin/org/ucfs/rsm/RsmState.kt index 85f845411..a3e219e17 100644 --- a/solver/src/main/kotlin/org/ucfs/rsm/RsmState.kt +++ b/solver/src/main/kotlin/org/ucfs/rsm/RsmState.kt @@ -13,18 +13,9 @@ open class RsmState( val isStart: Boolean = false, val isFinal: Boolean = false, ) { - val numId: Int = getId(nonterminal) + val numId: Int = nonterminal.getNextRsmStateId() val id: String = "${nonterminal.name}_${(numId)}" - companion object { - private val counters = HashMap() - private fun getId(nt: Nonterminal): Int { - val id = counters.getOrPut(nt) { 0 } - counters[nt] = id + 1 - return id - } - } - val outgoingEdges get() = terminalEdges.plus(nonterminalEdges) diff --git a/solver/src/main/kotlin/org/ucfs/rsm/symbol/Nonterminal.kt b/solver/src/main/kotlin/org/ucfs/rsm/symbol/Nonterminal.kt index 895806e16..c68da6e16 100644 --- a/solver/src/main/kotlin/org/ucfs/rsm/symbol/Nonterminal.kt +++ b/solver/src/main/kotlin/org/ucfs/rsm/symbol/Nonterminal.kt @@ -3,10 +3,17 @@ package org.ucfs.rsm.symbol import org.ucfs.rsm.RsmState import java.util.* -class Nonterminal(val name: String?) : Symbol { +data class Nonterminal(val name: String?) : Symbol { lateinit var startState: RsmState + private var rsmStateLastId = 0 override fun toString() = "Nonterminal(${name ?: this.hashCode()})" + fun getNextRsmStateId(): Int { + val id = rsmStateLastId + rsmStateLastId++ + return id + } + /** * Get all states from RSM for current nonterminal */ diff --git a/solver/src/test/kotlin/rsm/builder/AStarTest.kt b/solver/src/test/kotlin/rsm/builder/AStarTest.kt index fecf6799e..0805e2aa8 100644 --- a/solver/src/test/kotlin/rsm/builder/AStarTest.kt +++ b/solver/src/test/kotlin/rsm/builder/AStarTest.kt @@ -3,27 +3,26 @@ package rsm.builder import org.junit.jupiter.api.Test import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.regexp.Nt -import org.ucfs.rsm.symbol.Term import org.ucfs.grammar.combinator.regexp.or import org.ucfs.grammar.combinator.regexp.times +import org.ucfs.rsm.symbol.Term import rsm.RsmTest import kotlin.test.assertNotNull import kotlin.test.assertTrue class AStarTest : RsmTest { class AStar : Grammar() { - var S by Nt() + val S by Nt().asStart() init { - setStart(S) - S = Term("a") or Term("a") * S or S * S + S /= Term("a") or Term("a") * S or S * S } } @Test fun testRsm() { val grammar = AStar() - assertNotNull(grammar.S.getNonterminal()) + assertNotNull(grammar.S.nonterm) assertTrue { equalsByNtName(getAStarRsm("S"), grammar.rsm) } } } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/a/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/a/ScanerlessGrammarDsl.kt index 4f571948e..cbdcb0490 100644 --- a/test-shared/src/test/resources/grammars/a/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/a/ScanerlessGrammarDsl.kt @@ -5,10 +5,5 @@ import org.ucfs.grammar.combinator.regexp.Nt import org.ucfs.rsm.symbol.Term class ScanerlessGrammarDsl : Grammar() { - var S by Nt() - - init { - setStart(S) - S = Term("a") - } + val S by Nt(Term("a")).asStart() } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/aBStar/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/aBStar/ScanerlessGrammarDsl.kt index 001837da3..d2b31d29b 100644 --- a/test-shared/src/test/resources/grammars/aBStar/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/aBStar/ScanerlessGrammarDsl.kt @@ -5,11 +5,5 @@ import org.ucfs.grammar.combinator.extension.StringExtension.many import org.ucfs.grammar.combinator.regexp.Nt class ScanerlessGrammarDsl : Grammar() { - var S by Nt() - - init { - setStart(S) - S = many("ab") - } - + val S by Nt(many("ab")).asStart() } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/aStar/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/aStar/ScanerlessGrammarDsl.kt index 34bcb8295..d90138d27 100644 --- a/test-shared/src/test/resources/grammars/aStar/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/aStar/ScanerlessGrammarDsl.kt @@ -5,10 +5,5 @@ import org.ucfs.grammar.combinator.extension.StringExtension.many import org.ucfs.grammar.combinator.regexp.Nt class ScanerlessGrammarDsl : Grammar() { - var S by Nt() - - init { - setStart(S) - S = many("a") - } + val S by Nt(many("a")).asStart() } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/ab/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/ab/ScanerlessGrammarDsl.kt index 65470f834..c58ef9e75 100644 --- a/test-shared/src/test/resources/grammars/ab/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/ab/ScanerlessGrammarDsl.kt @@ -4,11 +4,6 @@ import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.extension.StringExtension.times import org.ucfs.grammar.combinator.regexp.Nt -class ScanerlessGrammarDsl: Grammar() { - var S by Nt() - - init { - setStart(S) - S = "a" * "b" - } +class ScanerlessGrammarDsl : Grammar() { + val S by Nt("a" * "b").asStart() } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/abc/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/abc/ScanerlessGrammarDsl.kt index 5ed08add0..89e5fc4cc 100644 --- a/test-shared/src/test/resources/grammars/abc/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/abc/ScanerlessGrammarDsl.kt @@ -6,14 +6,7 @@ import org.ucfs.grammar.combinator.regexp.* import org.ucfs.rsm.symbol.Term class ScanerlessGrammarDsl: Grammar() { - var S by Nt() - var A by Nt() - var B by Nt() - - init { - setStart(S) - S = "a" * B * "c" or A * "c" - A = "a" * "b" - B = Term("b") - } + val A by Nt("a" * "b") + val B by Nt(Term("b")) + val S by Nt("a" * B * "c" or A * "c").asStart() } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/ambiguous/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/ambiguous/ScanerlessGrammarDsl.kt index 0620486c1..f1a5994af 100644 --- a/test-shared/src/test/resources/grammars/ambiguous/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/ambiguous/ScanerlessGrammarDsl.kt @@ -5,10 +5,9 @@ import org.ucfs.grammar.combinator.extension.StringExtension.or import org.ucfs.grammar.combinator.regexp.* class ScanerlessGrammarDsl: Grammar() { - var S by Nt() + val S by Nt().asStart() init { - setStart(S) - S = "a" or S or S * S or S * S * S + S /= "a" or S or S * S or S * S * S } } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/bracket_star_x/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/bracket_star_x/ScanerlessGrammarDsl.kt index 1f58819e3..61cd06766 100644 --- a/test-shared/src/test/resources/grammars/bracket_star_x/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/bracket_star_x/ScanerlessGrammarDsl.kt @@ -6,12 +6,10 @@ import org.ucfs.grammar.combinator.extension.StringExtension.times import org.ucfs.grammar.combinator.regexp.Nt class ScanerlessGrammarDsl : Grammar() { - var List by Nt() - var Elem by Nt() + val List by Nt().asStart() + val Elem by Nt("x" or List) init { - setStart(List) - List = "[" * Elem - Elem = "x" or List + List /= "[" * Elem } } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/cAPlusBStar/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/cAPlusBStar/ScanerlessGrammarDsl.kt index df87254c2..66b86e473 100644 --- a/test-shared/src/test/resources/grammars/cAPlusBStar/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/cAPlusBStar/ScanerlessGrammarDsl.kt @@ -1,15 +1,12 @@ package grammars.cAPlusBStar import org.ucfs.grammar.combinator.Grammar -import org.ucfs.grammar.combinator.regexp.* +import org.ucfs.grammar.combinator.regexp.Many +import org.ucfs.grammar.combinator.regexp.Nt +import org.ucfs.grammar.combinator.regexp.Some +import org.ucfs.grammar.combinator.regexp.times import org.ucfs.rsm.symbol.Term class ScanerlessGrammarDsl : Grammar() { - var S by Nt() - - init { - setStart(S) - S = Term("c") * Some(Term("a")) * Many(Term("b")) - } - + val S by Nt(Term("c") * Some(Term("a")) * Many(Term("b"))).asStart() } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/c_a_star_b_star/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/c_a_star_b_star/ScanerlessGrammarDsl.kt index 9d159c4c5..389baa6f6 100644 --- a/test-shared/src/test/resources/grammars/c_a_star_b_star/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/c_a_star_b_star/ScanerlessGrammarDsl.kt @@ -3,15 +3,10 @@ package grammars.c_a_star_b_star import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.extension.StringExtension.many import org.ucfs.grammar.combinator.extension.StringExtension.times -import org.ucfs.grammar.combinator.regexp.times import org.ucfs.grammar.combinator.regexp.Nt +import org.ucfs.grammar.combinator.regexp.times -class ScanerlessGrammarDsl: Grammar() { - var S by Nt() - - init { - setStart(S) - S = "c" * many("a") * many("b") - } +class ScanerlessGrammarDsl : Grammar() { + val S by Nt("c" * many("a") * many("b")).asStart() } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/dyck/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/dyck/ScanerlessGrammarDsl.kt index a355ebd66..31ec62d11 100644 --- a/test-shared/src/test/resources/grammars/dyck/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/dyck/ScanerlessGrammarDsl.kt @@ -5,10 +5,9 @@ import org.ucfs.grammar.combinator.extension.StringExtension.times import org.ucfs.grammar.combinator.regexp.* class ScanerlessGrammarDsl: Grammar() { - var S by Nt() + val S by Nt().asStart() init { - setStart(S) - S = Epsilon or "(" * S * ")" * S + S /= Epsilon or "(" * S * ")" * S } } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/g1/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/g1/ScanerlessGrammarDsl.kt index ed27f613f..81c88b793 100644 --- a/test-shared/src/test/resources/grammars/g1/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/g1/ScanerlessGrammarDsl.kt @@ -2,14 +2,15 @@ package grammars.g1 import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.extension.StringExtension.times -import org.ucfs.grammar.combinator.regexp.* +import org.ucfs.grammar.combinator.regexp.Nt +import org.ucfs.grammar.combinator.regexp.Option +import org.ucfs.grammar.combinator.regexp.or -class ScanerlessGrammarDsl: Grammar() { - var S by Nt() +class ScanerlessGrammarDsl : Grammar() { + val S by Nt().asStart() init { - setStart(S) - S = "subClassOf_r" * Option(S) * "subClassOf" or + S /= "subClassOf_r" * Option(S) * "subClassOf" or "type_r" * Option(S) * "type" } } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/g2/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/g2/ScanerlessGrammarDsl.kt index e3a974b90..6c95899c3 100644 --- a/test-shared/src/test/resources/grammars/g2/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/g2/ScanerlessGrammarDsl.kt @@ -3,13 +3,12 @@ package grammars.g2 import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.extension.StringExtension.or import org.ucfs.grammar.combinator.extension.StringExtension.times -import org.ucfs.grammar.combinator.regexp.* +import org.ucfs.grammar.combinator.regexp.Nt -class ScanerlessGrammarDsl: Grammar() { - var S by Nt() +class ScanerlessGrammarDsl : Grammar() { + val S by Nt().asStart() init { - setStart(S) - S = "subClassOf" or "subClassOf_r" * S * "subClassOf" + S /= "subClassOf" or "subClassOf_r" * S * "subClassOf" } } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/geo/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/geo/ScanerlessGrammarDsl.kt index 5f8cf2632..081d96493 100644 --- a/test-shared/src/test/resources/grammars/geo/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/geo/ScanerlessGrammarDsl.kt @@ -2,13 +2,13 @@ package grammars.geo import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.extension.StringExtension.times -import org.ucfs.grammar.combinator.regexp.* +import org.ucfs.grammar.combinator.regexp.Nt +import org.ucfs.grammar.combinator.regexp.Option -class ScanerlessGrammarDsl: Grammar() { - var S by Nt() +class ScanerlessGrammarDsl : Grammar() { + val S by Nt().asStart() init { - setStart(S) - S = "broaderTransitive" * Option(S) * "broaderTransitive_r" + S /= "broaderTransitive" * Option(S) * "broaderTransitive_r" } } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/multi_dyck/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/multi_dyck/ScanerlessGrammarDsl.kt index 7075dbb05..c071badd4 100644 --- a/test-shared/src/test/resources/grammars/multi_dyck/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/multi_dyck/ScanerlessGrammarDsl.kt @@ -5,16 +5,12 @@ import org.ucfs.grammar.combinator.extension.StringExtension.times import org.ucfs.grammar.combinator.regexp.* class ScanerlessGrammarDsl: Grammar() { - var S by Nt() - var S1 by Nt() - var S2 by Nt() - var S3 by Nt() + val S by Nt().asStart() + val S1 by Nt("(" * S * ")" * S) + val S2 by Nt("{" * S * "}" * S) + val S3 by Nt("[" * S * "]" * S) init { - setStart(S) - S = Epsilon or S1 or S2 or S3 - S1 = "(" * S * ")" * S - S2 = "{" * S * "}" * S - S3 = "[" * S * "]" * S + S /= Epsilon or S1 or S2 or S3 } } \ No newline at end of file diff --git a/test-shared/src/test/resources/grammars/simple_golang/ScanerlessGrammarDsl.kt b/test-shared/src/test/resources/grammars/simple_golang/ScanerlessGrammarDsl.kt index fb61ca6b2..2d12dfd8a 100644 --- a/test-shared/src/test/resources/grammars/simple_golang/ScanerlessGrammarDsl.kt +++ b/test-shared/src/test/resources/grammars/simple_golang/ScanerlessGrammarDsl.kt @@ -3,19 +3,13 @@ package grammars.simple_golang import org.ucfs.grammar.combinator.Grammar import org.ucfs.grammar.combinator.extension.StringExtension.or import org.ucfs.grammar.combinator.extension.StringExtension.times -import org.ucfs.grammar.combinator.regexp.* +import org.ucfs.grammar.combinator.regexp.Many +import org.ucfs.grammar.combinator.regexp.Nt +import org.ucfs.grammar.combinator.regexp.or -class ScanerlessGrammarDsl: Grammar() { - var Program by Nt() - var Block by Nt() - var Statement by Nt() - var IntExpr by Nt() - - init { - setStart(Program) - Program = Block - Block = Many(Statement) - Statement = IntExpr * ";" or "r" * IntExpr * ";" - IntExpr = "1" or "1" * "+" * "1" - } +class ScanerlessGrammarDsl : Grammar() { + val IntExpr by Nt("1" or "1" * "+" * "1") + val Statement by Nt(IntExpr * ";" or "r" * IntExpr * ";") + val Block by Nt(Many(Statement)) + val Program by Nt(Block).asStart() } \ No newline at end of file