Что можно поместить в каждое предложение Java for statement? - PullRequest
0 голосов
/ 19 июня 2020

Осенью я преподаю продвинутый курс Java. Я знаю, что три раздела оператора for, разделенных точкой с запятой, могут иметь несколько вложенных операторов, например следующие.

for(int x = 0, y = 0; x < 10 && y < 20; x+=1, y+=2) {
    System.out.println(x + " " + y);
}

Однако я не могу найти ресурс, который бы подробно описал, что может быть в каждом из предложений инициализации, завершения и приращения соответственно.

Официальный java документации, не дает подробностей, как и многочисленные веб-сайты, которые я искал.

Я вывел некоторые правила за эти годы, но я хотел бы что-то более официальное, чем мои дедукции, когда я преподаю.

Например, следующие два компилируются:

int x = 0;
for(System.out.println("initializer"); (x++)<10; System.out.println("increment " + x)) {}

и

int x = 0;
boolean cont = true;
for(System.out.println("initializer"); cont; System.out.println("increment " + x),cont=(x++)<10) {}

, но следующее не выполняется:

for(int x=0,boolean cont=true; cont; System.out.println("increment " + x),cont=(x++)<10) {}

У меня обоснованные предположения относительно того, почему первые два компилируются, а последний - нет, но я не могу дать окончательных правил для каждого предложения.

1 Ответ

0 голосов
/ 19 июня 2020

На этот вопрос лучше всего отвечает грамматика языка.

ForControl:
    ForVarControl
    ForInit ; [Expression] ; [ForUpdate]

ForVarControl:
    {VariableModifier} Type VariableDeclaratorId  ForVarControlRest

ForVarControlRest:
    ForVariableDeclaratorsRest ; [Expression] ; [ForUpdate]
    : Expression

ForVariableDeclaratorsRest:
    [= VariableInitializer] { , VariableDeclarator }

ForInit: 
ForUpdate:
    StatementExpression { , StatementExpression }    

Другим источником может быть antlr, у них, например, Java 8 грамматика: https://github.com/antlr/grammars-v4/blob/master/java/java8/Java8Parser.g4#L849

forStatement
    :   basicForStatement
    |   enhancedForStatement
    ;

forStatementNoShortIf
    :   basicForStatementNoShortIf
    |   enhancedForStatementNoShortIf
    ;

basicForStatement
    :   'for' '(' forInit? ';' expression? ';' forUpdate? ')' statement
    ;

basicForStatementNoShortIf
    :   'for' '(' forInit? ';' expression? ';' forUpdate? ')' statementNoShortIf
    ;

forInit
    :   statementExpressionList
    |   localVariableDeclaration
    ;

forUpdate
    :   statementExpressionList
    ; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...