C é uma linguagem comum?

8

São linguagens regulares em C ou C ++ ? Caso contrário, em qual categoria colocamos as linguagens de programação como C / C ++, perl, Python?

Robert Harvey
fonte
Não, egrep é uma linguagem comum; C não é.
19412 tchrist
A maioria das linguagens de programação são algum tipo de linguagem livre de contexto. É por isso que eles geralmente são representados como árvore durante a compilação. en.wikipedia.org/wiki/Context-free_grammar
Laurent Bourgault-Roy
1
@ LaurentBourgault-Roy Eu acho que a maioria nem sequer é livre de contexto, pois mesmo que eles tenham um CFG, geralmente existem regras adicionais aplicadas fora do CFG
jk.
Mesmo regex não são mais regulares
CodesInChaos

Respostas:

30

A única definição universal que conheço para "linguagem regular" é aquela que pode ser analisada com um autômato finito determinístico ou expressa como uma expressão regular verdadeira (não as ERs estendidas em muitas implementações atuais). Uma expressão regular pode ser escrita em uma série de caracteres, com repetições potencialmente infinitas e seleções alternativas.

Como o C e o C ++ permitem o aninhamento de chaves, colchetes e parênteses em profundidades arbitrárias, eles não são linguagens comuns (consulte o Lemma de bombeamento para obter detalhes).

David Thornley
fonte
2
Eu acrescentaria que nenhuma linguagem de programação de qualquer uso pode ser regular porque não permitiria nenhum tipo de expressão numérica.
Giorgio
1
@Giorgio você pode expressar uma expressão numérica como uma linguagem regular (uma sequência alternada de operador e número de início e terminando com um número) analisar (com prioridades)-los precisa de uma gramática embora
catraca aberração
@ anormal catraca: Como você lidaria com os parênteses, por exemplo, em (1 + 2) * 6?
Giorgio
@Giorgio eu deveria ter acrescentado "sem parênteses"
catraca aberração
1
@ Giorgio: É trivialmente verdade que expressões postfix sintaticamente corretas não formam uma linguagem regular. Não importa. Um idioma pode ser tanto expressivo quanto arbitrariamente expressivo, incluindo expressões postfix, desde que a verificação da pilha seja adiada até o tempo de execução. Quarto é um excelente exemplo, e dc seria outro.
David.pfx