sintaxe e semantica

13
Linguagens de Programacão I [email protected] 1 Sintaxe e Semântica Sintaxe e Semântica Linguagens de Programacão I [email protected] 2 Fases da Compilação Fases da Compilação 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) programa fonte tokens parse tree árvore anotada ou outra forma intermediária código intermediário código objeto código objeto otimizado

Transcript of sintaxe e semantica

Page 1: sintaxe e semantica

1

Linguagens de Programacão [email protected] 1

Sintaxe e SemânticaSintaxe e Semântica

Linguagens de Programacão [email protected] 2

Fases da CompilaçãoFases da Compilação

scanner(análise léxica)

parser(análise sintática)

análise semântica egeraçã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)

programa fonte

tokens

parse tree

árvore anotada ou outraforma intermediária

código intermediário

código objeto

código objetootimizado

Page 2: sintaxe e semantica

2

Linguagens de Programacão [email protected] 3

SintaxeSintaxeSintaxe é um conjunto de regras que define a forma de uma Sintaxe é um conjunto de regras que define a forma de uma linguagem, estabelecendo como são compostas as suas linguagem, estabelecendo como são compostas as suas estruturas básicas (palavras).estruturas básicas (palavras).

A sintaxe de uma LP é formada por regras léxicas e regras A sintaxe de uma LP é formada por regras léxicas e regras sintáticas:sintáticas:

As regras lexicas descrevem as combinações válidas de As regras lexicas descrevem as combinações válidas de caracteres que formam os tokens da LP (palavras reservadas, caracteres que formam os tokens da LP (palavras reservadas, identificadores, operadores, etc).identificadores, operadores, etc).

As regras sintáticas descrevem como os tokens podem ser As regras sintáticas descrevem como os tokens podem ser combinados para formar instruções válidas (comandos, combinados para formar instruções válidas (comandos, expressões, subrotinas, etc).expressões, subrotinas, etc).

Linguagens de Programacão [email protected] 4

Sintaxe Sintaxe -- Diagramas SintáticosDiagramas Sintáticos

Um método simples de Um método simples de descrever a sintaxe de descrever a sintaxe de uma LP.uma LP.

Permite visualizar Permite visualizar facilmente suas facilmente suas construções sintáticas.construções sintáticas.

Foi usado inicialmente Foi usado inicialmente na definição da na definição da linguagem Pascal.linguagem Pascal.

Page 3: sintaxe e semantica

3

Linguagens de Programacão [email protected] 5

Sintaxe Sintaxe -- BNFBNFA sintaxe de uma LP usualmento é definida através de um conjuntoA sintaxe de uma LP usualmento é definida através de um conjunto de de regras representadas através de uma gramática livre de contexto.regras representadas através de uma gramática livre de contexto. A A notação utilizada é conhecida como Backusnotação utilizada é conhecida como Backus--Naur Form (BNF) .Naur Form (BNF) .

Esta notação utiliza dois conjuntos de símbolos:Esta notação utiliza dois conjuntos de símbolos:

terminais terminais representam os símbolos da linguagem que está sendo definida, representam os símbolos da linguagem que está sendo definida, por exemplo: por exemplo: whilewhile, , forfor, =, [., =, [.

nãonão––terminias terminias são abstrações utilizadas para representar as construções são abstrações utilizadas para representar as construções da linguagem, e são apresentadas sempre entre <>, como por exempda linguagem, e são apresentadas sempre entre <>, como por exemplo: lo: <expressão>, <declaração>, etc.<expressão>, <declaração>, etc.

São utilizados ainda dois metaSão utilizados ainda dois meta--símbolos:símbolos:

::=::= significa “é definido como."significa “é definido como."

|| significa “ou."significa “ou."

Linguagens de Programacão [email protected] 6

Sintaxe Sintaxe -- BNFBNFRegras léxicas:Regras léxicas:

<digit>::= 0 | 1 | ... | 9

<number>::= <digit> | <digit><number> | -<number>

<identifier>::= <letter> | <identifier><letter> | <identifier><digit>

<letter>::= a | b | c | ... | z

<operator>::= + | - | * | /

<relation>::= <= | >= | == | > | < | !=

Page 4: sintaxe e semantica

4

Linguagens de Programacão [email protected] 7

Sintaxe Sintaxe -- BNFBNFRegras sintáticas:Regras sintáticas:

<program>::= <program>::= programprogram <identifier> <identifier> ;; <block><block>

<block>::= <declaration seq> <block>::= <declaration seq> beginbegin <command seq> <command seq> end.end.

<declaration seq>::= <declaration seq>::= εε| <declaration><declaration seq>| <declaration><declaration seq>

<declaration> ::= <declaration> ::= varvar <variable list> <variable list> :: <type><type>;;

<type>::= <type>::= booleanboolean | | integerinteger | | realreal | | stringstring

<command seq>::= <command> | <command><command seq><command seq>::= <command> | <command><command seq>

<commmand>::= <variable>=<expression> |<commmand>::= <variable>=<expression> |

ifif <boolean expr> <boolean expr> thenthen <command seq> <command seq> endend | |

` ` whilewhile <boolean expr> <boolean expr> dodo <command seq> <command seq> endend ||

......

Linguagens de Programacão [email protected] 8

Sintaxe Sintaxe -- BNFBNF

As regras léxicasAs regras léxicas de uma LP são verificadas de uma LP são verificadas através de um scanner, que a partir do através de um scanner, que a partir do programa fonte gera uma lista de palavras programa fonte gera uma lista de palavras (tokens) válidos. (tokens) válidos.

As regras sintáticasAs regras sintáticas são verificadas através são verificadas através de um parser, que tenta validar a estrutura do de um parser, que tenta validar a estrutura do programa através da derivação de uma programa através da derivação de uma árvore (parse tree) que obedece a descrição árvore (parse tree) que obedece a descrição (BNF) da LP.(BNF) da LP.

Page 5: sintaxe e semantica

5

Linguagens de Programacão [email protected] 9

Sintaxe Sintaxe -- ExemploExemploComo derivar a parse tree para a expressão Como derivar a parse tree para a expressão a*x+b :a*x+b :

<expression>::= <expression>::= indentifierindentifier | | numbernumber | | --<expression> | <expression> | <expression> <operator> <expression><expression> <operator> <expression>

<expression>::= <expression> <operator> <expression>::= <expression> <operator> <expression><expression>

<expression>::= <expression> <expression>::= <expression> <operator><operator> indentifierindentifier

<expression>::= <expression>::= <expression><expression> + indentifier+ indentifier

<expression>::= <expression> <operator> <expression>::= <expression> <operator> <expression><expression> + indentifier+ indentifier

<expression>::= <expression> <expression>::= <expression> <operator><operator> indentifier indentifier + indentifier+ indentifier

<expression>::= <expression>::= <expression><expression> * indentifier + indentifier* indentifier + indentifier

<expression>::= <expression>::= indentifier(a) * indentifier(x) + indentifier(b)indentifier(a) * indentifier(x) + indentifier(b)

Linguagens de Programacão [email protected] 10

Sintaxe Sintaxe -- ExemploExemplo

expression

expression operator

expression

expression

identifier(b)

expression

identifier(x)

identifier(a)

+

operator

*

Parse TreeParse Tree

Page 6: sintaxe e semantica

6

Linguagens de Programacão [email protected] 11

SintaxeSintaxe

Uma parse tree contém informações Uma parse tree contém informações importantes para validar a estrutura sintática importantes para validar a estrutura sintática do programa, mas que não são efetivamente do programa, mas que não são efetivamente necessárias para a sua representação.necessárias para a sua representação.

Uma forma mais simples de representar a Uma forma mais simples de representar a estrutura sintática de um programa utiliza estrutura sintática de um programa utiliza árvores sintáticas (abstract syntax tree ou árvores sintáticas (abstract syntax tree ou simplesmente syntax tree).simplesmente syntax tree).

Linguagens de Programacão [email protected] 12

Sintaxe Sintaxe -- ExemploExemplo

+

* identifier(b)

identifier(x)

identifier(a)

Syntax TreeSyntax Tree

Page 7: sintaxe e semantica

7

Linguagens de Programacão [email protected] 13

Sintaxe Sintaxe -- EBNFEBNFUma variação bastante utilizada da notação BNF é Uma variação bastante utilizada da notação BNF é conhecida como Extended BNF (EBNF), que conhecida como Extended BNF (EBNF), que incorpora alguns símbolos usados na definição de incorpora alguns símbolos usados na definição de expressões regulares como expressões regulares como * (0 ou mais) e (0 ou mais) e + (1 ou (1 ou mais).mais).

<programa>:: = {<comandos><programa>:: = {<comandos>*}}

A partir da descrição sintática de uma LP em BNF ou A partir da descrição sintática de uma LP em BNF ou EBNF podeEBNF pode--se gerar automaticamente parsers e se gerar automaticamente parsers e scanners usando aplicativos como yacc, lex, flex e scanners usando aplicativos como yacc, lex, flex e bison.bison.

Linguagens de Programacão [email protected] 14

SemânticaSemântica

A semântica descreve o significado de construções A semântica descreve o significado de construções sintáticas válidas.sintáticas válidas.

Não existe uma notação padrão equivalente a BNF Não existe uma notação padrão equivalente a BNF para a descrição da semântica de LPs.para a descrição da semântica de LPs.

Diferentes formalismos foram desenvolvidos para Diferentes formalismos foram desenvolvidos para atender a diferentes objetivos.atender a diferentes objetivos.

Geralmente uma LP é descrita informalmente, Geralmente uma LP é descrita informalmente, utilizandoutilizando--se linguagem natural (inglês, português, se linguagem natural (inglês, português, etc).etc).

Page 8: sintaxe e semantica

8

Linguagens de Programacão [email protected] 15

Semânticas FormaisSemânticas FormaisSemânticas fomais são usadas principalmente para provar Semânticas fomais são usadas principalmente para provar propriedades de LPs, construções semânticas e algoritmos.propriedades de LPs, construções semânticas e algoritmos.

Semântica Operacional Semântica Operacional -- Tem como objetivo descrever como uma Tem como objetivo descrever como uma computação é processada. Geralmente faz uso de uma máquina computação é processada. Geralmente faz uso de uma máquina abstrata e de regras que descrevem as mudanças de estado abstrata e de regras que descrevem as mudanças de estado associadas a cada comando.associadas a cada comando.

Semântica Denotacional Semântica Denotacional -- Descreve um programa através de Descreve um programa através de objetos matemáticos como conjuntos, funções, valores e as objetos matemáticos como conjuntos, funções, valores e as relações entre estes.relações entre estes.

Semântica Axiomática Semântica Axiomática –– Baseada em métodos de dedução lógica, Baseada em métodos de dedução lógica, descreve uma linguagem através de axiomas. Usualmente é descreve uma linguagem através de axiomas. Usualmente é utilizada para provar propriedades de algoritmos.utilizada para provar propriedades de algoritmos.

Linguagens de Programacão [email protected] 16

Structural Operational Semantics Structural Operational Semantics (SOS)(SOS)

premissapremissa11 premissapremissa22 ... premissa... premissannconclusãoconclusão

condiçãocondição

Exemplo de semântica formal que permite provar Exemplo de semântica formal que permite provar propriedades de programas ou de estruturas de uma propriedades de programas ou de estruturas de uma LP.LP.

A semântica operacional tradicional especifica uma A semântica operacional tradicional especifica uma LP em termos da execução de um programa em uma LP em termos da execução de um programa em uma máquina abstrata.máquina abstrata.

Em SOS o processamento da máquina abstrata Em SOS o processamento da máquina abstrata segue regras de dedução com a forma:segue regras de dedução com a forma:

Page 9: sintaxe e semantica

9

Linguagens de Programacão [email protected] 17

SOS SOS -- ExemploExemplo

cmdcbecmdcbexpbe

cmdcecbecmdccmdcbexpbe

cmdccmdccmdc

Ididcmdieid

iexpie

Ropropbexpberopbebexpbebexpbe

Ropropbexpieropieiexpieiexpie

Iopiopiexpieiopieiexpieiexpie

iexpieiexpie

Idiexpidiexpn

: do while: :

: else then if: : :

:c;: :

: ::

: : :

: : :

: : :

: :

id :Numn :

21

21

21

21

21

21

21

21

21

21

∈=

∈∈

{ }

{ }{ }

comandos dos conjunto booleanas expressões das conjunto

inteiras expressões das conjunto !,,,,,

/*, -, ,boolenanos doresidentifica dos conjunto

inteiros doresidentifica dos conjunto ,

inteiros números dos conjunto

=∈=∈

=∈=>=>=<=<∈

+∈=∈

=∈∈

=∈

CmdcmdBexpbeIexpie

ropiop

BidbidIdid

falsetruebNn

SintaxeSintaxe

Linguagens de Programacão [email protected] 18

SOS SOS -- ExemploExemplo

Semântica das expressõesSemântica das expressõesA memória da máquina abstrata é representada por uma A memória da máquina abstrata é representada por uma estrutura de dados (estrutura de dados (stosto).).

Os diferentes estados são representados entre Os diferentes estados são representados entre < >< > e as e as transições de estado são indicadas por transições de estado são indicadas por

A máquina abstrata possui apenas três funções: A máquina abstrata possui apenas três funções:

applySto(sto,x)applySto(sto,x) recupera o valor da variável x; recupera o valor da variável x;

updateSto(sto,x, n)updateSto(sto,x, n) atualiza o valor da variável x (x=n);atualiza o valor da variável x (x=n);

compute (op, num1, num2)compute (op, num1, num2) calcula o valor da expressão (num1 calcula o valor da expressão (num1 op num2)op num2)

Page 10: sintaxe e semantica

10

Linguagens de Programacão [email protected] 19

SOS SOS -- ExemploExemplo

>>→<++<=+>>→<+<

>+>→<++<=>>→<<

=+>>→<+<>+>→<+<

=>>→<<

stostoyxgcstosto

stostoyxexstoapplyStostostoxd

cstostocstostoyb

ystoapplyStostostoya

,48,6)(48)31,17,(ompute temos(3) usando que já ,48,3117(f)

(1) usando ,3117,6)(17),( temos(4) usando que já ,17,)(

31)6,25,(ompute temos(3) usando que já ,31,625)((1) usando ,625,6)(

25),( temos(4) usando que já ,25,)(

>>→<<>>→<<

>>→<<>>→<<

>>→<<>>→<<

stoidstoapplyStostoidstonncomputestonn

stoienstoienstoiestoie

stoieiestoieiestoiestoie

),,(,)4(),,iop,(, iop )3(

,' iop , iop ,',)2(

, iop ', iop ,',)1(

2121

22

22

2121

11

Usando estas regras podemos Usando estas regras podemos deduzir a semântica da expressãodeduzir a semântica da expressão

x + y + 6 onde y = 25 e x = 17x + y + 6 onde y = 25 e x = 17

Linguagens de Programacão [email protected] 20

SOS SOS -- ExemploExemplo

Semântica dos comandosSemântica dos comandosPara definir a semântica de comandos expandimos a Para definir a semântica de comandos expandimos a máquina abstrata utilizando duas novas estruturas (máquina abstrata utilizando duas novas estruturas (inine e outout) para representar a entrada e a saída de ) para representar a entrada e a saída de dados.dados.

Os estados da máquina abstrata correspondem Os estados da máquina abstrata correspondem portanto a tuplas com a forma portanto a tuplas com a forma <in, out, sto>.<in, out, sto>.

Page 11: sintaxe e semantica

11

Linguagens de Programacão [email protected] 21

Linguagens de Programacão [email protected] 22

Gramática de AtributosGramática de AtributosUma gramática de atributos pode ser informalmente definida Uma gramática de atributos pode ser informalmente definida como uma gramática livre de contexto estendida através do uso como uma gramática livre de contexto estendida através do uso de atributos, condições e regras de avaliação.de atributos, condições e regras de avaliação.

Associa atributos aos diferentes símbolos de uma gramática a Associa atributos aos diferentes símbolos de uma gramática a partir das produções.partir das produções.

Permite definir o significado de produções e impor regras Permite definir o significado de produções e impor regras semânticas.semânticas.

Introduz sensibilidade ao contexto, e pode ser usada, por Introduz sensibilidade ao contexto, e pode ser usada, por exemplo, para checar o tipo das variáveis e validar expressões.exemplo, para checar o tipo das variáveis e validar expressões.

Usualmente é utilizada conjuntamente com rotinas de ação Usualmente é utilizada conjuntamente com rotinas de ação (action routines).(action routines).

Page 12: sintaxe e semantica

12

Linguagens de Programacão [email protected] 23

(1+3)*2

Gramática de AtributosGramática de Atributos

Linguagens de Programacão [email protected] 24

Gramática de AtributosGramática de Atributos<delcaration>::= var <identifier> <type> ;<delcaration>::= var <identifier> <type> ;

if <identifier> if <identifier> not innot in <var<var--list> thenlist> then

<var<var--list> list> (<identifier>, <type>)(<identifier>, <type>)

else error(else error(““duplicate variableduplicate variable””))

<int expression>::= <identifier1> <operator> <number><int expression>::= <identifier1> <operator> <number>

if getType(<varlist>, <identifier1>) ≠ if getType(<varlist>, <identifier1>) ≠ integerinteger thenthen

error(error(““wrong typewrong type””))

Page 13: sintaxe e semantica

13

Linguagens de Programacão [email protected] 25

Rotinas de AçõesRotinas de AçõesDefinem rotinas que são invocadas pelo compilador Definem rotinas que são invocadas pelo compilador sempre que uma produção é prevista.sempre que uma produção é prevista.

Muitos analisadores semânticos são implementados Muitos analisadores semânticos são implementados automaticamente através destas construções.automaticamente através destas construções.<declaration)::= var <identifier>: <type>;<declaration)::= var <identifier>: <type>;

{declare_name(identifier, type)}{declare_name(identifier, type)}

......

<expr1>::= <expr2> <operator> <expr3><expr1>::= <expr2> <operator> <expr3>

{check_types(expr1, expr2, expr3);{check_types(expr1, expr2, expr3);

expr1.val = calc(operator, expr2, expr3} expr1.val = calc(operator, expr2, expr3}

Linguagens de Programacão [email protected] 26

Semântica Estática X DinâmicaSemântica Estática X Dinâmica

As regras semânticas podem ser classificadas em estáticas ou As regras semânticas podem ser classificadas em estáticas ou dinâmicas dependendo do momento em que são checadas dinâmicas dependendo do momento em que são checadas (compilação ou em tempo de execução).(compilação ou em tempo de execução).

Exemplos de regras estáticas:Exemplos de regras estáticas:

Todo identificador deve ser declarado antes de ser usado;Todo identificador deve ser declarado antes de ser usado;

Os parâmetros utilizados na chamada de uma função têm o tipo Os parâmetros utilizados na chamada de uma função têm o tipo correto.correto.

Exemplos de regras dinâmicas:Exemplos de regras dinâmicas:

O índice de um array está dentro do limite correto;O índice de um array está dentro do limite correto;

Variáveis nunca são utilizadas antes de serem inicializadas;Variáveis nunca são utilizadas antes de serem inicializadas;

Divisão por zero.Divisão por zero.