Вы находитесь на странице: 1из 12

ngela Caroline de Arajo e Caroline Bianca Santos Trancredi Molina Professor Antnio Chaves. Linguagens Formais e Autmatos.

Gramtica Livre de Contexto (CFG) baseada na Linguagem C- (C menos)


Este trabalho consiste da adaptao da gramtica da linguagem para aceitao de nmeros com ponto flutuante. A linguagem C- possui as seguintes palavras-chave: else if int return Void while float Todas as palavras chave so reservadas e devem ser escritas com caixa baixa. Os smbolos especiais permitidos esto descritos na abaixo: + - * / < <= > >= == != = ; , () [] {} /* */ Da mesma forma, temos os marcadores ID_VOID, ID_INT, ID_FLOAT, NRO_INTEIRO , NRO_FLOAT e SINAL_OPCIONAL, definidos pelas CFGs: ID_VOID ID_VOID LETRA | LETRA ID_INT ID_INT LETRA | LETRA ID_FLOAT ID_FLOAT LETRA | LETRA NRO_FLOAT SEQ_DIGITOS . SEQ_DIGITOS | SEQ_DIGITOS. DIGITO SEQ_DIGITOS | DIGITO SEQ_DIGITOS NRO_INTEIRO NRO_INTEIRO digito | digito LETRA a | b | .. .| z | A | B | ... | Z DIGITO 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 SEQ_DIGITOS SEQ_DIGITOS digito | vazio SINAL_OPCIONAL + | - | vazio

Ressalta-se que existe diferena entre caixa baixa e caixa alta. A sintaxe e semntica da linguagem C- adaptada para nmeros com ponto flutuante pode ser visualizada a seguir: 1. Programa lista-declaraes-variaveis-funes 2. lista-declaraes-variaveis-funes lista-declaraes-variaveis-funes

declarao-nica-varivel-ou-funo | declarao-nica-varivel-ou-funo 3. declarao-nica-varivel-ou-funo declarao-de-varivel | declarao-defuno 4. declarao-de-varivel declarao-variavel-int | declarao-variavel-float 5. declarao-variavel-float float conjunto-variaveis-float; 6. declarao-variavel-int int conjunto-variaveis-int; 7. conjunto-variveis-int ID_INT , conjunto-variveis-int | ID_INT

[NRO_INTEIRO] , conjunto-variveis-int | ID_INT [NRO_INTEIRO] | ID_INT 8. conjunto-variveis-float ID_FLOAT , conjunto-variveis-float |

ID_FLOAT [NRO_INTEIRO] , conjunto-variveis-float | ID_FLOAT [NRO_INTEIRO] | ID_FLOAT 9. declarao-funo funo-tipo-void | funo-tipo-float | funo-tipo-int 10. funo-tipo-void void ID_VOID ( parmetros) { declaraes-locais-funo statement-lista-void } 11. funo-tipo-int statement-lista-int } 12. funo-tipo-float float ID_FLOAT (parmetros) { declaraes-locaisint ID_INT ( parmetros) { declaraes-locais-funo

funo statement-lista-float } 13. parmetros lista-de-parmetros | void 14. lista-de-parmetros lista-de-parmetros, parmetro-nico | parmetro-nico 15. parmetro-nico parmetro-float | parmetro-int 16. parmetro-int int ID_INT| float ID_INT [ ] 17. parmetro-float float ID_FLOAT| float ID_FLOAT [ ] 18. declaraes-locais-funo declaraes-locais-funo declarao-de-varivel | vazio 19. statement-lista-void statement-lista-void statement-void | vazio 20. statement-lista-int statement-lista-int statement-int | statement-int

21. statement-lista-float statement-lista-float statement-float | statement-float 22. statement-void declarao-de-expresso | declarao-de-compost-void | declarao-de-seleo-void | declarao-de-iterao-void | expresso-de-retorno-void 23. expresso-de-retorno-void return ; | vazio 24. statement-int declarao-de-expresso | declarao-de-compost-int | declarao-de-seleo-int | declarao-de-iterao-int | declarao-de-retorno-int | vazio 25. declarao-de-retorno-int return SINAL_OPCIONAL NRO_INTEIRO ; | return expresso-int; 26. statement-float declarao-de-expresso | declarao-de-compost-float | declarao-de-seleo-float | declarao-de-iterao-float | declarao-de-retorno-float | vazio 27. declarao-de-retorno-float return SINAL_OPCIONAL NRO_FLOAT ; | return expresso-float ; 28. declarao-expresso expresso ; | ; 29. declarao-de-seleo-void if (expresso ) statement-void 30. declarao-de-seleo-int statement-int else statement-int 31. declarao-de-seleo-float if ( expresso ) statement-float | if (expresso ) statement-float else statement-float 32. declarao-iterao-void while ( expresso ) { statement-void } 33. declarao-iterao-int while ( expresso ) { statement-int } 34. declarao-iterao-float while ( expresso ) { statement-float } 35. expresso expresso-float | expresso-int | ativao-void 36. expresso-int var-int = expresso-simples-int | expresso-simples-int 37. expresso-float float var-float = expresso-simples-float | expresso-simplesif (expresso ) statement-int | if (expresso )

38. 39.

var-int ID_INT | ID_INT [ expresso-int ] var-float ID_FLOAT | ID_FLOAT [ expresso-int ]

40. expresso-simples-int expresso-soma-int relacional expresso-soma-int | expresso-soma-int 41. expresso-simples-float expresso-soma-float relacional expresso-somafloat | expresso-soma-float 42. relacional <= | < | > | >= | == | != 43. expresso-soma-int expressao-soma-int soma termo-int | termo-int 44. expresso-soma-float expressao-soma-float soma termo-float | termo-float 45. soma + | 46. termo-int termo-int mult fator-int | fator-int 47. termo-float termo-float mult fator-float | fator-float 48. mult * | / 49. fator-int (expresso-int) | var-int | ativao-int | SINAL_OPCIONAL

NRO_INTEIRO 50. fator-float (expresso-int) | (expresso-float) | var-float | var-int | ativaofloat | ativao-int | SINAL_OPCIONAL NRO_INTEIRO |

SINAL_OPCIONAL NRO_FLOAT 51. ativao-int ID_INT (args) 52. ativao-float | ID_FLOAT (args) 53. ativao-void | ID_VOID (args) 54. args arg-lista | vazio 55. arg-lista arg-lista , expresso | expresso Apresentamos a seguir a explicao para cada semntica definida. 1. Programa lista-declaraes-variaveis-funes 2. lista-declaraes-variaveis-funes lista-declaraes-variaveis-funes

declarao-nica-varivel-ou-funo | declarao-nica-varivel-ou-funo 3. declarao-nica-varivel-ou-funo declarao-de-varivel | declaraode-funo

Temos que um programa composto por uma lista de declaraes, que podem ser de funes, ou variveis, em qualquer ordem e que deve existir no mnimo uma

declarao. As restries semnticas que ocorrem so as seguintes: todas as variveis e funes devem ser declaradas antes do uso e a ltima declarao do programa deve ser uma declarao de funo na forma void main (void).

4. declarao-de-varivel declarao-variavel-int | declarao-variavel-float 5. declarao-variavel-float float conjunto-variaveis-float; 6. declarao-variavel-int int conjunto-variaveis-int; 7. conjunto-variveis-int ID_INT , conjunto-variveis-int | ID_INT

[NRO_INTEIRO] , conjunto-variveis-int | ID_INT [NRO_INTEIRO] | ID_INT 8. conjunto-variveis-float ID_FLOAT , conjunto-variveis-float |

ID_FLOAT [NRO_INTEIRO] , conjunto-variveis-float | ID_FLOAT [NRO_INTEIRO] | ID_FLOAT Podemos definir dois tipos de variveis: float (ponto flutuante) e int (inteiro). Existe a possibilidade de se declarar variveis simples, ou matrizes de variveis (cujos ndices variam de 0 a NRO-INTEIRO-1]. Ao contrrio da linguagem C- padro, vrias variveis podem ser declaradas em cada declarao. 9. declarao-funo funo-tipo-void | funo-tipo-float | funo-tipo-int 10. funo-tipo-void void ID_VOID ( parmetros) { declaraes-locais-

funo statement-lista-void } 11. funo-tipo-int int ID_INT ( parmetros) { declaraes-locais-funo statement-lista-int } 12. funo-tipo-float float ID_FLOAT (parmetros) { declaraes-locaisfuno statement-lista-float } 13. parmetros lista-de-parmetros | void 14. lista-de-parmetros lista-de-parmetros, parmetro-nico | parmetronico 15. parmetro-nico parmetro-float | parmetro-int 16. parmetro-int int ID_INT| float ID_INT [ ] 17. parmetro-float float ID_FLOAT| float ID_FLOAT [ ]

As funes declaradas podem ser do tipo void (sem retorno), do tipo int (que retornam nmeros inteiros), ou do tipo float (que retornam nmeros de tipo ponto flutuante). Alm do especificador de tipo de retorno, as declaraes de funes so compostas por um identificador e uma lista de parmetros entre parnteses separados por vrgulas, seguida de uma declarao composta contendo o cdigo da funo. Os parmetros de uma funo podem ser void (funo sem parmetros), ou uma lista que representa os parmetros da funo (sendo que esta lista de parmetros pode conter parmetros do tipo inteiro, ou ponto flutuante). Os parmetros seguidos por colchetes so matrizes cujo tamanho varivel. O conjunto de declaraes locais de uma funo envolto por chaves. A ordem de execuo dos comandos deve ser baseada na ordem em que aparecem as declaraes entre as chaves. Alm disto, temos que as declaraes locais se sobrepem a qualquer declarao global. 18. declaraes-locais-funo varivel | vazio 19. statement-lista-void statement-lista-void statement-void | vazio 20. statement-lista-int statement-lista-int statement-int | statement-int 21. statement-lista-float statement-lista-float statement-float | statement-float declaraes-locais-funo declarao-de-

Tanto a lista de declaraes locais da funo, como a lista de statements podem ser vazias. Alm disto, observe que existem trs tipos de stamements (void, int, float), necessrios para garantir que as funes retornem seus valores corretos (nenhum retorno para funo tipo void, retorno inteiro para funo tipo int e retorno de ponto flutuante para funo tipo float).

22. statement-void declarao-de-expresso | declarao-de-compost-void | declarao-de-seleo-void | declarao-de-iterao-void | expresso-de-retorno-void 23. expresso-de-retorno-void return ; | vazio 24. statement-int declarao-de-expresso | declarao-de-compost-int | declarao-de-seleo-int | declarao-de-iterao-int | declarao-de-retorno-int | vazio 25. declarao-de-retorno-int return SINAL_OPCIONAL

NRO_INTEIRO ; | return expresso-int; 26. statement-float declarao-de-expresso | declarao-de-compost-float | declarao-de-seleo-float | declarao-de-iterao-float | declarao-de-retorno-float | vazio 27. declarao-de-retorno-float return SINAL_OPCIONAL

NRO_FLOAT ; | return expresso-float ;

Como pode ser reforado acima, trs tipos de statement foram criados para garantir que as funes retornassem valores corretos. As funes de tipo int e float, podem retornar nmeros, ou expresses que retornem inteiros ou ponto flutuante. 28. declarao-expresso expresso ; | ; Uma declarao de expresso tem uma expresso opcional seguida por um ponto e vrgula.

29. declarao-de-seleo-void if (expresso ) statement-void 30. declarao-de-seleo-int if (expresso ) statement-int | if (expresso ) statement-int else statement-int 31. declarao-de-seleo-float if ( expresso ) statement-float | if

(expresso ) statement-float else statement-float

As declaraes de seleo so as que so utilizadas para realizar comparaes. Possuem a mesma semntica da linguagem C e C-: a expresso avaliada; um valor diferente de zero provoca a execuo da primeira declarao; um valor zero provoca a execuo da segunda declarao (else), se ela existir. Foram feitos trs tipos diferentes porque no meio de uma declarao de seleo pode ocorrer uma expresso de retorno (e os retornos so diferentes conforme o tipo de funo declarado).

32. declarao-iterao-void while ( expresso ) { statement-void } 33. declarao-iterao-int while ( expresso ) { statement-int } 34. declarao-iterao-float while ( expresso ) { statement-float }

As declaraes de iterao somente contm o lao while. So executadas pela avaliao repetida da expresso e em seguida pela execuo da declarao se a expresso receber um valor diferente de zero, terminando quando a expresso receber valor zero. 35. expresso expresso -float | expresso-int | ativao-void 36. expresso-int var-int = expresso-simples-int | expresso-simples-int 37. expresso-float simples-float var-float = expresso-simplesfloat | expresso-

Uma expresso pode ser de dois tipos: int (para nmeros inteiros), ou float (para nmeros de ponto flutuante). Trata-se de uma referncia de varivel seguida por um smbolo de atribuio (sinal de igual) e uma expresso, ou apenas uma expresso simples: a localizao da varivel representa por var-int ou por var-float (dependendo do tipo de varivel declarado) identificada, a subexpresso direita da atribuio

avaliada, e o valor da subexpresso armazenado na localizao dada. Esse valor tambm retornado como o valor de toda a expresso. 38. 39. var-int ID_INT | ID_INT [ expresso-int ] var-float ID_FLOAT | ID_FLOAT [ expresso-int ]

As variveis podem ser simples ou de matriz indexada, onde um ndice negativo leva interrupo do programa e os limites superiores dos ndices no so verificados.

40. expresso-simples-int expresso-soma-int relacional expresso-somaint | expresso-soma-int 41. expresso-simples-float expresso-soma-float relacional expresso-

soma-float | expresso-soma-float 42. relacional <= | < | > | >= | == | !=

Uma expresso simples composta por operadores relacionais que no se associam (ou seja, uma expresso sem parnteses pode ter apenas um operador relacional). O valor de uma expresso simples o valor de sua expresso aditiva se ela no contiver operadores relacionais, ou 1 se o operador relacional for avaliado como verdadeiro, ou ainda zero se o operador relacional for avaliado como falso. Tambm podem ser de dois tipos: inteiro ou ponto flutuante. 43. expresso-soma-int expressao-soma-int soma termo-int | termo-int 44. expresso-soma-float expressao-soma-float soma termo-float | termofloat 45. soma + | 46. termo-int termo-int mult fator-int | fator-int 47. termo-float termo-float mult fator-float | fator-float 48. mult * | / 49. fator-int (expresso-int) | var-int | ativao-int | SINAL_OPCIONAL NRO_INTEIRO 50. fator-float (expresso-int) | (expresso-float) | var-float | var-int | ativao-float | ativao-int | SINAL_OPCIONAL NRO_INTEIRO | SINAL_OPCIONAL NRO_FLOAT

Expresses e termos aditivos representam a associatividade e a precedncia tpicas dos operadores aritmticos. Temos ainda que variveis inteiras somente podero receber operaes entre nmeros inteiros (pois isto o fator-int) e que variveis de ponto flutuante podero receber operaes entre nmeros inteiros, entre nmeros de ponto flutuante e entre nmeros inteiros e de ponto flutuante. No caso das variveis inteiras, o smbolo / representa a diviso inteira, onde o resto ser truncado.

51. ativao-int ID_INT (args) 52. ativao-float | ID_FLOAT (args) 53. ativao-void | ID_VOID (args) 54. args arg-lista | vazio 55. arg-lista arg-lista , expresso | expresso

Uma ativao de funo composta pelo nome da funo, seguido por seus argumentos entre parnteses. Os argumentos so uma lista de expresses separadas por vrgulas (ou mesmo nenhuma expresso), representando os valores atribudos aos parmetros durante uma ativao. As funes devem ser declaradas antes de serem ativadas.

rvore de Anlise Sinttica


No anexo 1 apresentamos a rvore de anlise sinttica para o seguinte cdigo: void main (void) { float a; float b; float c; a = input(); b = input(); c = a * b; output(c);

Anexo 1

[imagem: arvore_analise_sintatica.png]

Bibliografia
Sintaxe e semntica da linguagem C-. Apndice A sobre Projeto de Compilador fornecido como material.

Вам также может понравиться