Terminadores opcionais vs. obrigatórios na definição de gramática sem contexto
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.
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.