Sintaxe e Semântica

Linguagens de Programacão I mleal@inf.puc-rio.br

1

Fases da Compilação
programa fonte tokens parse tree árvore anotada ou outra forma intermediária código intermediário código objeto código objeto otimizado scanner (análise léxica) parser (análise sintática) análise semântica e geração de código intermediário otimização de código (independente da máquina) geração de código objeto otimização de código (dependente da máquina)

Linguagens de Programacão I mleal@inf.puc-rio.br

2

identificadores.Diagramas Sintáticos Um método simples de descrever a sintaxe de uma LP. Linguagens de Programacão I mleal@inf. Linguagens de Programacão I mleal@inf. estabelecendo como são compostas as suas estruturas básicas (palavras).puc-rio. expressões.br 4 . etc). etc). operadores. As regras sintáticas descrevem como os tokens podem ser combinados para formar instruções válidas (comandos. A sintaxe de uma LP é formada por regras léxicas e regras sintáticas: As regras lexicas descrevem as combinações válidas de caracteres que formam os tokens da LP (palavras reservadas. subrotinas. Foi usado inicialmente na definição da linguagem Pascal.br 3 Sintaxe . Permite visualizar facilmente suas construções sintáticas.Sintaxe Sintaxe é um conjunto de regras que define a forma de uma linguagem.puc-rio.

BackusEsta notação utiliza dois conjuntos de símbolos: terminais representam os símbolos da linguagem que está sendo definida. <declaração>. for. como por exemplo: exemplo: <expressão>.puc-rio. etc. A notação utilizada é conhecida como Backus-Naur Form (BNF) . e são apresentadas sempre entre <>." Linguagens de Programacão I mleal@inf..Sintaxe .. | 9 <number>::= <digit> | <digit><number> | -<number> <identifier>::= <letter> | <identifier><letter> | <identifier><digit> <letter>::= a | b | c | .BNF A sintaxe de uma LP usualmento é definida através de um conjunto de regras representadas através de uma gramática livre de contexto. [. não–terminias são abstrações utilizadas para representar as construções não– da linguagem. por exemplo: while.br 6 ." | significa “ou. while.| * | / <relation>::= <= | >= | == | > | < | != Linguagens de Programacão I mleal@inf. for.br 5 Sintaxe .BNF Regras léxicas: <digit>::= 0 | 1 | ... São utilizados ainda dois meta-símbolos: meta::= significa “é definido como.puc-rio. | z <operator>::= + | . =.

<declaration seq>::= ε| <declaration><declaration seq> <declaration> ::= var <variable list> : <type>. Linguagens de Programacão I mleal@inf.. que a partir do programa fonte gera uma lista de palavras (tokens) válidos.Sintaxe ..BNF As regras léxicas de uma LP são verificadas através de um scanner.puc-rio.BNF Regras sintáticas: <program>::= program <identifier> . <type>.br 8 . <type>::= boolean | integer | real | string <command seq>::= <command> | <command><command seq> <commmand>::= <variable>=<expression> | if <boolean expr> then <command seq> end | ` while <boolean expr> do <command seq> end | . Linguagens de Programacão I mleal@inf. As regras sintáticas são verificadas através de um parser.br 7 Sintaxe . <block> <block>::= <declaration seq> begin <command seq> end.puc-rio. que tenta validar a estrutura do programa através da derivação de uma árvore (parse tree) que obedece a descrição (BNF) da LP.

puc-rio.puc-rio.br 10 .br 9 Sintaxe .Exemplo Parse Tree expression expression operator + expression identifier (b) expression identifier (a) operator * expression identifier (x) Linguagens de Programacão I mleal@inf.Sintaxe .Exemplo Como derivar a parse tree para a expressão a*x+b : <expression>::= indentifier | number | -<expression> | <expression> <operator> <expression> <expression>::= <expression> <operator> <expression> <expression>::= <expression> <operator> indentifier <expression>::= <expression> + indentifier <expression>::= <expression> <operator> <expression> + indentifier <expression>::= <expression> <operator> indentifier + indentifier <expression>::= <expression> * indentifier + indentifier <expression>::= indentifier(a) * indentifier(x) + indentifier(b) Linguagens de Programacão I mleal@inf.

puc-rio.puc-rio.br 12 . Uma forma mais simples de representar a estrutura sintática de um programa utiliza árvores sintáticas (abstract syntax tree ou simplesmente syntax tree).Sintaxe Uma parse tree contém informações importantes para validar a estrutura sintática do programa. mas que não são efetivamente necessárias para a sua representação.br 11 Sintaxe .Exemplo Syntax Tree + * identifier (b) identifier (a) identifier (x) Linguagens de Programacão I mleal@inf. Linguagens de Programacão I mleal@inf.

puc-rio. Geralmente uma LP é descrita informalmente.puc-rio. que incorpora alguns símbolos usados na definição de expressões regulares como * (0 ou mais) e + (1 ou mais).EBNF Uma variação bastante utilizada da notação BNF é conhecida como Extended BNF (EBNF).Sintaxe . lex. português.br 14 . flex e bison. Não existe uma notação padrão equivalente a BNF para a descrição da semântica de LPs. Linguagens de Programacão I mleal@inf.br 13 Semântica A semântica descreve o significado de construções sintáticas válidas. utilizando-se linguagem natural (inglês. utilizandoetc). Diferentes formalismos foram desenvolvidos para atender a diferentes objetivos. <programa>:: = {<comandos>*} A partir da descrição sintática de uma LP em BNF ou EBNF pode-se gerar automaticamente parsers e podescanners usando aplicativos como yacc. Linguagens de Programacão I mleal@inf.

Semântica Denotacional .br 15 Structural Operational Semantics (SOS) Exemplo de semântica formal que permite provar propriedades de programas ou de estruturas de uma LP.. valores e as relações entre estes. funções. Em SOS o processamento da máquina abstrata segue regras de dedução com a forma: premissa1 premissa2 . Usualmente é utilizada para provar propriedades de algoritmos. Semântica Operacional .Descreve um programa através de objetos matemáticos como conjuntos. Linguagens de Programacão I mleal@inf. construções semânticas e algoritmos.br 16 .Tem como objetivo descrever como uma computação é processada..Semânticas Formais Semânticas fomais são usadas principalmente para provar propriedades de LPs. A semântica operacional tradicional especifica uma LP em termos da execução de um programa em uma máquina abstrata. Semântica Axiomática – Baseada em métodos de dedução lógica. Geralmente faz uso de uma máquina abstrata e de regras que descrevem as mudanças de estado associadas a cada comando.puc-rio. premissan condição conclusão Linguagens de Programacão I mleal@inf.puc-rio. descreve uma linguagem através de axiomas.

(sto). num1. =!} ie ∈ Iexp = conjunto das expressões inteiras be ∈ Bexp = conjunto das expressões booleanas cmd ∈ Cmd = conjunto dos comandos ie : iexp − ie : iexp ie1 : iexp ie2 : iexp iop ∈ Iop ie1 iop ie2 : iexp ie1 : iexp ie2 : iexp rop ∈ Rop ie1 rop ie2 : bexp be1 : bexp be2 : bexp rop ∈ Rop be1 rop be2 : bexp ie : iexp id ∈ Id id := ie : cmd c1 : cmd c2 : cmd c1 . >. updateSto(sto. n) atualiza o valor da variável x (x=n).x) recupera o valor da variável x. *. compute (op.puc-rio.x. c 2 : cmd be : bexp c1 : cmd c2 : cmd if be then c1 else ce2 : cmd be : bexp c : cmd while be do c : cmd Linguagens de Programacão I mleal@inf.puc-rio.Exemplo Semântica das expressões A memória da máquina abstrata é representada por uma estrutura de dados (sto).br 18 .SOS . false} id ∈ Id = conjunto dos identificadores inteiros bid ∈ Bid = conjunto dos identificadores boolenanos iop ∈ {+. =. /} rop ∈ {<. >=. num2) calcula o valor da expressão (num1 op num2) Linguagens de Programacão I mleal@inf.br 17 SOS . -. Os diferentes estados são representados entre < > e as transições de estado são indicadas por A máquina abstrata possui apenas três funções: applySto(sto. <=.Exemplo n : iexp id : iexp n ∈ Num id ∈ Id Sintaxe n ∈ N = conjunto dos números inteiros b ∈ {true.

sto >→< ie1 ' . sto > já que usando (3) temos compute(+. sto >→< n iop ie2 ' . sto >→< 48.Exemplo (1) (2) < ie1 .puc-rio. sto > usando (1) (f) < 17 + 31. sto > Usando estas regras podemos deduzir a semântica da expressão x + y + 6 onde y = 25 e x = 17 (a) < y .Exemplo Semântica dos comandos Para definir a semântica de comandos expandimos a máquina abstrata utilizando duas novas estruturas (in (in e out) para representar a entrada e a saída de out) dados. sto >→< ie1 ' iop ie2 . sto >→< 17. sto > já que usando (3) temos compute(+.17. sto > Linguagens de Programacão I mleal@inf. sto >→< ie2 ' .6) = 31 (d ) < x. sto > < n iop ie2 . out. Os estados da máquina abstrata correspondem portanto a tuplas com a forma <in. sto > já que usando (4) temos applySto( sto. sto >→< 48. sto >→< compute(iop. sto >→< 17 + 31. sto > < ie1 iop ie2 . n1 .SOS .br 19 SOS . sto > já que usando (4) temos applySto( sto.25. x) = 17 (e) < x + y + 6. y ) = 25 (b) < y + 6. sto >→< applySto( sto. sto > < ie2 . sto >→< 25 + 6. sto > (3) < n1 iop n2 . Linguagens de Programacão I mleal@inf. sto > usando (1) (c) < 25 + 6. sto >→< 31. n2 ).puc-rio.br 20 . sto>.31) = 48 ( g ) < x + y + 6. sto >→< 25. sto > (4) < id . id ).

Linguagens de Programacão I mleal@inf.br 21 Gramática de Atributos Uma gramática de atributos pode ser informalmente definida como uma gramática livre de contexto estendida através do uso de atributos. condições e regras de avaliação. Permite definir o significado de produções e impor regras semânticas.puc-rio.br 22 .puc-rio. Linguagens de Programacão I mleal@inf. Associa atributos aos diferentes símbolos de uma gramática a partir das produções. Usualmente é utilizada conjuntamente com rotinas de ação (action routines). e pode ser usada. por exemplo. para checar o tipo das variáveis e validar expressões. Introduz sensibilidade ao contexto.

br 24 .br (1+3)*2 23 Gramática de Atributos <delcaration>::= var <identifier> <type> . <identifier1>) ≠ integer then error(“wrong type”) error(“ type” Linguagens de Programacão I mleal@inf. if <identifier> not in <var-list> then <var<var-list>  (<identifier>. <type>) <varelse error(“duplicate variable”) error(“ variable” <int expression>::= <identifier1> <operator> <number> if getType(<varlist>.puc-rio.puc-rio.Gramática de Atributos Linguagens de Programacão I mleal@inf.

Divisão por zero. Muitos analisadores semânticos são implementados automaticamente através destas construções.. expr3} Linguagens de Programacão I mleal@inf.val = calc(operator.br 25 Semântica Estática X Dinâmica As regras semânticas podem ser classificadas em estáticas ou dinâmicas dependendo do momento em que são checadas (compilação ou em tempo de execução)..br 26 .puc-rio. Exemplos de regras estáticas: Todo identificador deve ser declarado antes de ser usado. expr1. type)} .Rotinas de Ações Definem rotinas que são invocadas pelo compilador sempre que uma produção é prevista. Os parâmetros utilizados na chamada de uma função têm o tipo correto. Linguagens de Programacão I mleal@inf. expr2. {declare_name(identifier. <declaration)::= var <identifier>: <type>.puc-rio. expr2. <expr1>::= <expr2> <operator> <expr3> {check_types(expr1. Exemplos de regras dinâmicas: O índice de um array está dentro do limite correto. expr3). Variáveis nunca são utilizadas antes de serem inicializadas.

Sign up to vote on this title
UsefulNot useful