Pergunta

Em um capítulo de livro sobre compiladores, há a seguinte definição gramatical e código de exemplo.

...
statement: whileStatement
           | ifStatement
           | ... // Other statement possibilities
           | '{' statementSequence '}'
whileStatement: 'while' '(' expression ')' statement
ifStatement: ... // Definition of "if"
statementSequence: '' // empty sequence (null)
                   | statement ';' statementSequence
expression: ... // Definition of "expression"
...             // More definitions follow

 

while (expression) {
 statement;
 statement;
 while (expression) {
  while(expression)
     statement;
  statement;
 }
}

Como é o mais interno do código while loop válido sem { }? Parece -me que a definição da declaração exige. Isso é um erro no livro ou estou entendendo mal a sintaxe?


Editar Minhas desculpas por qualquer ambiguidade. Tudo digitado acima é literal do livro. As omissões não eram minhas fazendo.

Foi útil?

Solução

Considere seu código de exemplo novamente:

1 while (expression) {
2  statement;
3  statement;
4  while (expression) {
5   while(expression)
6      statement;
7   statement;
8  }
9 }

Por que você está preocupado com o fato de a linha 6 não ter aparelho, mas não se importe que as linhas 2, 3 e 7 também estão sentindo falta delas? A gramática está dizendo que um while LOOP termina com um statement, e a statementSequence, com seus aparelhos necessários, é apenas uma das muitas alternativas para um statement. As linhas 5 e 6 correspondem exatamente a essa regra - exceto para o ';', que não tem um lugar na regra.

Outras dicas

Sua declaração enquanto diz que depois do ) vem uma declaração. Sua gramática não especifica totalmente statement, mas não requer aparelho. Os aparelhos são necessários apenas para uma sequência de declaração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top