Neue Grammatik-Regeln und daraus resultierende bugfixes

This commit is contained in:
luca9913 2022-11-22 21:44:13 +01:00
parent 291fee12db
commit 09ac2fc5cf
3 changed files with 107 additions and 18 deletions

1
.gitignore vendored
View File

@ -20,6 +20,7 @@ bin
.project
.settings/
/target/
settings.json
#
manually/

View File

@ -109,6 +109,7 @@ classOrInterfaceType
| interfaceType_lfno_classOrInterfaceType
)
( classType_lf_classOrInterfaceType
| interfaceType_lf_classOrInterfaceType
)*
;
@ -117,6 +118,10 @@ classType
| classOrInterfaceType '.' annotation* Identifier typeArguments?
;
classTypeList
: classType (',' classType)*
;
classType_lf_classOrInterfaceType
: '.' annotation* Identifier typeArguments?
;
@ -275,10 +280,11 @@ typeDeclaration
classDeclaration
: normalClassDeclaration
| enumDeclaration
| recordDeclaration
;
normalClassDeclaration
: classModifier* 'class' Identifier typeParameters? superclass? superinterfaces? classBody
: classModifier* 'class' Identifier typeParameters? superclass? superinterfaces? permittedsubclasses? classBody
;
classModifier
@ -288,7 +294,9 @@ classModifier
| 'private'
| 'abstract'
| 'static'
| 'sealed'
| 'final'
| 'non-sealed'
| 'strictfp'
;
@ -308,6 +316,10 @@ superinterfaces
: 'implements' interfaceTypeList
;
permittedsubclasses
: 'permits' classTypeList
;
interfaceTypeList
: interfaceType (',' interfaceType)*
;
@ -562,6 +574,40 @@ enumBodyDeclarations
: ';' classBodyDeclaration*
;
recordDeclaration
: classModifier* 'record' Identifier typeParameters? recordHeader superinterfaces? recordBody
;
recordHeader
: '(' recordComponentList? ')'
;
recordComponentList
: recordComponent (',' recordComponent)*
;
recordComponent
: annotation* unannType Identifier
| variableArityRecordComponent
;
variableArityRecordComponent
: annotation* unannType annotation* '...' Identifier
;
recordBody
: '{' recordBodyDeclaration* '}'
;
recordBodyDeclaration
: classBodyDeclaration
| compactConstructorDeclaration
;
compactConstructorDeclaration
: constructorModifier* simpleTypeName constructorBody
;
/*
* Productions from §9 (Interfaces)
*/
@ -745,6 +791,7 @@ statement
| ifThenElseStatement
| whileStatement
| forStatement
| switchExpression ';'?
;
statementNoShortIf
@ -763,6 +810,7 @@ statementWithoutTrailingSubstatement
| switchStatement
| doStatement
| breakStatement
| yieldStatement
| continueStatement
| returnStatement
| synchronizedStatement
@ -801,11 +849,11 @@ ifThenStatement
;
ifThenElseStatement
: 'if' '(' expression ')' statementNoShortIf 'else' statement
: 'if' parExpression statementNoShortIf 'else' statement
;
ifThenElseStatementNoShortIf
: 'if' '(' expression ')' statementNoShortIf 'else' statementNoShortIf
: 'if' parExpression statementNoShortIf 'else' statementNoShortIf
;
assertStatement
@ -814,7 +862,7 @@ assertStatement
;
switchStatement
: 'switch' '(' expression ')' switchBlock
: 'switch' parExpression switchBlock
;
switchBlock
@ -835,20 +883,44 @@ switchLabel
| 'default' ':'
;
switchExpression
: 'switch' parExpression '{' switchLabeledRule* '}'
;
switchLabeledRule
: CASE (expressionList | NullLiteral | guardedPattern) (ARROW|COLON) switchRuleOutcome
| DEFAULT (ARROW|COLON) switchRuleOutcome
;
guardedPattern
: '(' guardedPattern ')'
| variableModifier* annotation* Identifier ('&&' expression)*
| guardedPattern '&&' expression
;
switchRuleOutcome
: block
| blockStatement*
;
enumConstantName
: Identifier
;
enumConstantNameList
: enumConstantName (',' enumConstantName)*
;
whileStatement
: 'while' '(' expression ')' statement
: 'while' parExpression statement
;
whileStatementNoShortIf
: 'while' '(' expression ')' statementNoShortIf
: 'while' parExpression statementNoShortIf
;
doStatement
: 'do' statement 'while' '(' expression ')' ';'
: 'do' statement 'while' parExpression ';'
;
forStatement
@ -894,6 +966,10 @@ breakStatement
: 'break' Identifier? ';'
;
yieldStatement
: 'yield' Identifier? ';'
;
continueStatement
: 'continue' Identifier? ';'
;
@ -907,7 +983,7 @@ throwStatement
;
synchronizedStatement
: 'synchronized' '(' expression ')' block
: 'synchronized' parExpression block
;
tryStatement
@ -970,7 +1046,7 @@ primaryNoNewArray
| 'void' '.' 'class'
| 'this'
| typeName '.' 'this'
| '(' expression ')'
| parExpression
| classInstanceCreationExpression
| fieldAccess
| arrayAccess
@ -988,7 +1064,7 @@ primaryNoNewArray_lfno_arrayAccess
| 'void' '.' 'class'
| 'this'
| typeName '.' 'this'
| '(' expression ')'
| parExpression
| classInstanceCreationExpression
| fieldAccess
| methodInvocation
@ -1021,7 +1097,7 @@ primaryNoNewArray_lfno_primary
| 'void' '.' 'class'
| 'this'
| typeName '.' 'this'
| '(' expression ')' //done
| parExpression //done
| classInstanceCreationExpression_lfno_primary //done
| fieldAccess_lfno_primary
| arrayAccess_lfno_primary
@ -1040,7 +1116,7 @@ primaryNoNewArray_lfno_primary_lfno_arrayAccess_lfno_primary
| 'void' '.' 'class'
| 'this'
| typeName '.' 'this'
| '(' expression ')'
| parExpression
| classInstanceCreationExpression_lfno_primary
| fieldAccess_lfno_primary
| methodInvocation_lfno_primary
@ -1172,9 +1248,22 @@ constantExpression
: expression
;
constantExpressionList
: constantExpression (',' constantExpression)*
;
expression
: lambdaExpression
| assignmentExpression
| switchExpression
;
expressionList
: expression (',' expression)*
;
parExpression
: '(' expression ')'
;
lambdaExpression
@ -1738,7 +1827,6 @@ Identifier
: JavaLetter JavaLetterOrDigit*
;
fragment
JavaLetter
: [a-zA-Z$_] // these are the "java letters" below 0x7F

View File

@ -359,7 +359,7 @@ public class StatementGenerator {
}
private Statement convert(Java8Parser.IfThenElseStatementContext stmt){
Expression expr = convert(stmt.expression());
Expression expr = convert(stmt.parExpression().expression());
Statement thenBlock = convert(stmt.statementNoShortIf());
Statement elseBlock = convert(stmt.statement());
return new IfStmt(TypePlaceholder.fresh(stmt.getStart()), expr, thenBlock, elseBlock, stmt.getStart());
@ -391,7 +391,7 @@ public class StatementGenerator {
}
private Statement convert(Java8Parser.WhileStatementContext stmt){
Expression expr = convert(stmt.expression());
Expression expr = convert(stmt.parExpression().expression());
Statement block = convert(stmt.statement());
return new WhileStmt(expr, block,stmt.getStart());
}
@ -403,7 +403,7 @@ public class StatementGenerator {
private Statement convert(Java8Parser.DoStatementContext stmt){
Statement block = convert(stmt.statement());
Expression expr = convert(stmt.expression());
Expression expr = convert(stmt.parExpression().expression());
return new DoStmt(expr,block,stmt.getStart());
}
@ -818,8 +818,8 @@ public class StatementGenerator {
private Expression convert(Java8Parser.PrimaryNoNewArray_lfno_primaryContext expression) {
if(expression.literal() != null){
return convert(expression.literal());
}else if(expression.expression()!=null){
return convert(expression.expression());
}else if(expression.parExpression().expression()!=null){
return convert(expression.parExpression().expression());
}else if(expression.methodInvocation_lfno_primary() != null){
return convert(expression.methodInvocation_lfno_primary());
}else if(expression.classInstanceCreationExpression_lfno_primary() != null) {