Existem muitas definições on-line sobre o que é uma gramática livre de contexto, mas nada que eu encontre satisfaça meu principal problema:
De que contexto é livre?
Para investigar, pesquisei no Google "gramática sensível ao contexto", mas ainda não consegui encontrar o que era o "contexto".
Alguém pode explicar a que context
termo se refere esses nomes?
terminology
context-free
formal-grammars
CodyBugstein
fonte
fonte
override
pode ser um nome de variável ou uma palavra-chave, dependendo de onde é usada (ou seja, seu contexto). Se usado após uma declaração de método, é uma palavra-chave. Caso contrário, não é. Este é um exemplo de gramática sensível ao contexto.Respostas:
Você está certo, sempre há um contexto em algum sentido. Eu não acho que você possa entender o que "contexto" significa em "livre de contexto" sem entender uma produção.
Uma produção é uma regra de substituição. Ele diz que, para gerar strings no idioma, você pode substituir o que está à esquerda pelo que está à direita:
Isso significa que a sequência abstrata A pode ser substituída pelo caractere "x" seguido pelo caractere "y". Você também pode ter produções mais complexas:
Isso significa que o caractere "z" seguido da sequência abstrata A pode ser substituído pelos caracteres "x" e "y".
Uma produção sem contexto simplesmente significa que existe apenas uma coisa no lado esquerdo. O primeiro exemplo é livre de contexto, pois A pode ser substituído por "x" e "y", independentemente do que vem antes ou depois dele. No entanto, no segundo exemplo, o caractere "z" deve aparecer antes do A e, em seguida, a combinação pode ser substituída por "x" e "y", para que haja algum contexto envolvido.
Uma gramática sem contexto é apenas uma gramática com apenas produções sem contexto.
O segundo exemplo é realmente um exemplo de produção irrestrita. Há outra categoria entre livre de contexto e irrestrita chamada "sensível ao contexto". Um exemplo de produção sensível ao contexto é:
A diferença é que o que vem antes de A (e depois) no lado esquerdo deve ser preservado no lado direito. Isso significa efetivamente que apenas A é substituído, mas só pode ser substituído no contexto apropriado.
fonte
zA -> zxy
: A ainda é substituído por xy, mas somente após z.fonte