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

1.5.

Elementos Sintticos e Semnticos


Como j comentado (seo 1.2) os componentes gerais de uma linguagem so a sua sintaxe e a sua semntica. A sintaxe de uma linguagem influencia na maneira como os programas so escritos pelo programador, lidos por outros programadores e reconhecidos pelo computador. A semntica de uma linguagem determina como os programas so resolvidos pelos programadores, entendidos por outros programadores e interpretados pelo computador [WAT 90].

1.5.1 Sintaxe
Como j comentado, a sintaxe consiste num conjunto de regras que definem a forma da linguagem , isto , como as sentenas podem ser formadas como seqncias de componentes bsicos, chamados palavras. Usando estas regras, pode-se identificar quando uma sentena est correta ou no. A sintaxe no revela nada sobre o contedo (ou significado) da sentena. Por exemplo, na linguagem C, palavras chave (tais como while, do, if e else), identificadores, nmeros, operadores, etc. so palavras da linguagem. A sintaxe desta linguagem tambm diz como combinar tais palavras para construir comandos e programas corretamente. Entretanto, palavras no so elementares, elas so construdas com caracteres que pertencem a um alfabeto. Assim, a sintaxe de uma linguagem definida por dois conjuntos de regras: regras lxicas e regras sintticas. As regras lxicas especificam o conjunto de caracteres que constituem o alfabeto da linguagem e a maneira como os caracteres podem ser combinados para formar palavras vlidas. Por exemplo, no Pascal letras maisculas e minsculas so idnticas, mas em C e Ada elas so diferenciadas. Desta forma, de acordo com as regras lxicas, Memria e memria referem-se mesma varivel em Pascal, mas a variveis diferentes em C e Ada. As regras lxicas tambm identificam que <> (ou ) um operador vlido em Pascal mas no em C, onde o mesmo operador representado por !=. Ada difere dos dois, uma vez que no igual representado por /=:. As regras sintticas, por sua vez, especificam as seqncias de smbolos que constituem estruturas sintticas vlidas, e so verificadas atravs de uma varredura (parsing) da representao interna do programa fonte. Estas regras permitem, por exemplo, o reconhecimento de expresses e comandos. Para ilustrar, a sintaxe do Pascal determina que o comando de atribuio entre duas variveis a := b;, e do C a = b;. Na verdade, a distino entre regras sintticas e lxicas um tanto arbitrria, uma vez que ambas contribuem para a aparncia externa da linguagem. Aqui, muitas vezes, os termos sintaxe e regras sintticas so usados num sentido amplo que inclui os componentes lxicos. Como existe um grande nmero programas sintaticamente corretos ou no em vrias linguagens, no possvel enumerar a sintaxe de todos eles. necessrio apenas uma maneira de definir um conjunto infinito usando uma descrio finita [GHE 97]. Para alcanar este objetivo, a sintaxe de uma linguagem definida atravs de uma Gramtica, que um conjunto de regras que definem todos os construtores que podem ser aceitos na linguagem [DER 90]. Para exemplificar, Fortran foi definido simplesmente atravs da especificao de algumas regras em ingls. Algol 60 foi definido atravs de uma gramtica livre de contexto desenvolvida por John Backus, que ficou conhecida como BNF (Backus-Naur Form). BNF, que foi usada posteriormente na definio de vrias linguagens de programao, incluindo Pascal, C e Ada, fornece uma definio compacta e clara para a sintaxe de linguagens de programao. Todo programador deve saber como ler, interpretar e aplicar descries BNF da sintaxe das linguagens. BNF ocorre com variaes textuais menores em trs formas bsicas: BNF original, BNF estendida e diagrama de sintaxe, que fornecem outras maneiras de definir a sintaxe de LP. Os diagramas so conceitualmente equivalentes a BNF, mas sua notao mais intuitiva [GHE 97, LOU 93]. BNF uma metalinguagem, pois consiste numa linguagem para descrio de outras linguagens, mais especificamente de gramticas. Inicialmente BNF ser descrita atravs de um exemplo. Em ingls, sentenas simples consistem de uma noun phrase e de uma verb phrase seguida de um ponto. Isto pode ser expresso da seguinte maneira:

1. <sentence> ::= <noun-phrase> <verb-phrase>. Por outro lado deve-se saber descrever a estrutura de uma frase nominal e de uma frase verbal: 2. <noun-phrase> ::= <article> <noun> 3. <article> ::= a | the 4. <noun> ::= girl | dog 5. <verb-phrase> ::= <verb> <noun-phrase> 6. <verb> ::= sees | pets Cada uma das regras gramaticais apresentadas consiste de um string colocado entre < e > (nome da estrutura que est sendo descrita), seguida pelo smbolo ::= que pode ser lido como consiste de ou o mesmo que, e uma seqncia de outros nomes e smbolos. Os sinais maior e menor servem para distinguir os nomes das estruturas das palavras que podem aparecer na linguagem. Por exemplo, em Pascal, <program> ir representar toda estrutura do programa, enquanto a palavra program o primeiro smbolo da linguagem: <program> ::= program ..... O smbolo ::= um metasmbolo que serve para separar o lado esquerdo do lado direito de uma regra. Os sinais >, < e |, que significa ou, tambm so metasmbolos. Assim, no exemplo anterior, a regra 6 significa que verb pode ser tanto a palavra sees como a palavra pets. Algumas vezes um metasmbolo tambm um smbolo atual em uma linguagem. Neste caso, o smbolo pode ser colocado entre aspas para ser distinguido do metasmbolo. Freqentemente isto feito para smbolos especiais, tais como pontos, mesmo quando eles no so metasmbolos. No exemplo anterior, na regra 1, poderia-se ter: <sentence> ::= <noun-phrase> <verb-phrase> . ( claro que neste caso as aspas tornam-se metasmbolos). Cada sentena legal, de acordo com a gramtica anterior, pode ser construda da seguinte maneira: inicia-se com o smbolo <sentence> e prossegue-se trocando o lado esquerdo por alternativas do lado direito nas regras. Este processo cria uma derivao na linguagem. Assim, pode-se construir a sentena the girl sees a dog. da seguinte maneira: <sentence> <noun-phrase> <verb-phrase>. (regra 1) <article> <noun> <verb-phrase>. (regra 2) the <noun> <verb-phrase>. (regra 3) the girl <verb-phrase>. (regra 4) the girl <verb> <noun-phrase>. (regra 5) the girl sees <noun-phrase>. (regra 6) the girl sees <article> <noun>. (regra 2) the girl sees a <noun>. (regra 3) the girl sees a dog. (regra 4) De maneira inversa, pode-se comear com a sentena the girl sees a dog. e voltar at <sentence> para provar que uma sentena vlida na linguagem. De acordo com a descrio anterior, conclui-se que para descrever uma linguagem necessrio uma srie de regras gramaticais. Tais regras so formadas por uma nica estrutura do lado esquerdo, seguida do metasmbolo ::=, e por uma seqncia de itens do lado direito que podem ser smbolos ou outras estruturas. As estruturas que aparecem entre <> so chamadas no terminais. As palavras e smbolos, tais como girl no exemplo anterior, so os terminais, e as regras gramaticais so as produes. Logo a seguir apresentado um exemplo simples de uma gramtica para expresses aritmticas de adio e multiplicao. Nesta gramtica os smbolos no-terminais so <exp>, <number> e <digit>, e os terminais so 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, *, ( e ) [LOU 93]. <exp> ::= <exp> + <exp> | <exp> * <exp> | (<exp>) | <number> <number> ::= <number> <digit> | <digit> <digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

A partir de agora ser apresentada uma extenso da BNF, chamada EBNF (Extended BNF), e como ela pode ser usada para descrever a sintaxe de uma linguagem de programao simples exibida na figura 1.2a. Os smbolos ::=, <, >, |, e * e + sobrescritos, que aparecem na figura 1.2, so smbolos da metalinguagem, e, como j visto, so chamados metasmbolos. A linguagem descrita em EBNF atravs de um conjunto de regras. Por exemplo, <program>::={<statement>*} uma regra. O smbolo ::= significa definido por. O smbolo * significa zero ou mais ocorrncias do elemento precedente. Assim, a regra estabelece que um <program> definido como uma seqncia arbitrria de <statement> entre chaves, { e }. As entidades que aparecem entre < e > so chamadas no terminais; e entidades como { so chamadas terminais. Terminais so as palavras da linguagem que est sendo definida, enquanto no terminais so entidades que so definidas por outras regras EBNF. O metasmbolo + denota uma ou mais ocorrncias do elemento precedente, e | denota uma escolha. J as regras lxicas que fornecem a descrio EBNF de identificadores, nmeros e operadores so mostradas na figura 1.2b. Neste caso, <operator>, <identifier> e <number>, que so palavras da linguagem que est sendo definida, so detalhados em termos de smbolos elementares do alfabeto [GHE 97]. Para ilustrar os conceitos apresentados, a figura 1.3 mostra a definio de uma calculadora em EBNF [DER 90]. A figura 1.4 mostra o diagrama de sintaxe equivalente linguagem de programao simples cujas regras sintticas em EBNF so apresentadas na figura 1.2. Agora, no terminais so representados por retngulos e terminais por crculos. O smbolo no terminal definido como um diagrama de transio tendo uma aresta de entrada e uma de sada. Um string de palavras um programa vlido se ele pode ser gerado ao se percorrer o diagrama de sintaxe a partir da aresta de entrada at a aresta de sada. Neste percurso, se um terminal (crculo) encontrado, esta palavra deve estar no string que est sendo reconhecido; se um no terminal (retngulo) encontrado, ento o no terminal deve ser reconhecido ao se percorrer o diagrama de transio para aquele no terminal. Quando uma ramificao encontrada, qualquer aresta pode ser percorrida, isto , os diferentes caminhos representam as possveis seqncias de smbolos.
(a) Regras Sintticas <program> ::= { <statement>* } <statement> ::= <assignment> | <conditional> | <loop> <assignment> ::= <identifier>=<expr>; <conditional> ::= if <expr> { <statement>+ } | if <expr> { <statement>+ } else { <statement>+ } <loop> ::= while <expr> { <statement>+ } <expr> ::= <identifier> | <number> | (<expr>) | <expr> <operator> <expr> (b) Regras Lxicas <operator> ::= + | - | * | / | = | | < | > | | <identifier> ::= <letter> <ld>* <ld> ::= <letter> | <digit> <number> ::= <digit>+ <letter> ::= a | b | c | ... | z <digit> ::= 0 | 1 | ... | 9

Figura 1.2 Definio EBNF para uma linguagem de programao simples [GHE 97]
<calculation> ::= <expression> = <expression> ::= <value> | <value> <operator> <expression> <value> ::= <unsigned> | <sign> <unsigned> <unsigned> ::= <digit>+ | <digit>+ . <digit>+ <digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <sign> ::= + | <operator> ::= + | - | * | /

Figura 1.3 Definio EBNF para uma calculadora

As vantagens do diagrama de sintaxe so a utilizao de duas dimenses para facilitar o entendimento, e a similaridade com a EBNF para permitir o entendimento das regras. Sua desvantagem a dificuldade em gerar os diagramas usando um dispositivo de entrada linear, tal como o teclado. As gramticas das linguagens que podem ser descritas por BNF ou EBNF so conhecidas como gramticas livres de contexto (seo 1.5.5) [GHE 97, DER 90]. Resumindo, a descrio sinttica de uma linguagem tem duas aplicaes principais: Ajuda o programador a saber como escrever um programa sintaticamente correto; Pode ser usada para determinar se um programa est sintaticamente correto, que exatamente o que o compilador faz.

interessante atentar para o fato de que algumas construes em diferentes linguagens de programao possuem a mesma estrutura conceitual, mas diferem na aparncia a nvel lxico. Por exemplo, analisado os seguintes pedaos de cdigo: Em Pascal: Em C: while x <> y do begin ... end Ambos podem ser descritos atravs de simples variantes lxicas de acordo com as regras EBNF. Eles diferem apenas na maneira como os comandos so agrupados (begin...end X {...}), no operador no igual (<> X !=) e no fato de que a condio do lao em C deve estar entre parnteses.. Quando duas construes diferem apenas no nvel lxico, se diz que elas seguem a mesma sintaxe abstrata, mas diferem na sintaxe concreta. Em outras palavras, elas possuem a mesma estrutura abstrata mas diferem somente em detalhes de baixo nvel. Embora conceitualmente a sintaxe concreta possa ser irrelevante, pragmaticamente ela pode afetar o uso da linguagem e a legibilidade dos programas [GHE 97].
program { statement assignment statement conditional loop assignment conditional identifier expression = { expression statement ; } }

while ( x != y ) { ... }

if

else

{ { operator identifier number

statement statement expression

} }

loop

while

expression expression

expression

expression

Figura 1.4 Diagrama de sintaxe para a linguagem descrita na figura 1.2 [GHE 97]

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