Você está na página 1de 6

Universidade Federal de Gois a Curso de Bacharelado em Engenharia de Computaao c Compiladores 2012-1 Compilador para a Linguagem MicroJ Etapa - I - Anlises

Lxica e Sinttica a e a
Danilo Soares Carneiro

Objetivo

Este projeto tem como objetivo a implementao de um compilador didtico para a linguagem ca a MicroJ. O presente texto descreve a Etapa I do projeto que consiste na especicao do ca analisador lxico e do analisador sinttico para a linguagem. e a A Seo 2 descreve a gramtica da linguagem MicroJ. A Seo 3 descreve o trabalho de ca a ca anlise lxica, enquanto a Seo 4 corresponde ` especicao do analisador sinttico para a a e ca a ca a linguagem.

Gramtica para a linguagem MicroJ a

A seguir, apresentada a gramtica para a linguagem MicroJ. Os no-terminais da gramtica e a a a iniciam-se com letra maiscula e o s u mbolo inicial Programa. Os terminais aparecem em e negrito quando so formados por palavras ou como sequncia de caracteres. Exemplo: int, a e +, - (), <=, etc.

Gramtica: a
P rograma ClassList | ClassDecl ClassList |ClassDecl class ident extends ident ClassBody |class ident ClassBody

ClassList

ClassDecl

ClassBody { ClassList ClassBodyV ar |{ ClassBodyV ar

ClassBodyV ar

V arDecl; ClassBodyV ar |ClassBodyCons ConstructDecl ClassBodyCons |ClassBodyM ethod

ClassBodyCons

ClassBodyM ethod M ethodDecl ClassBodyM ethod |ClassBodyEnd ClassBodyEnd V arDecl } int ident Braces V arDeclExp |string ident Braces V arDeclExp |ident ident Braces V arDeclExp [] Braces | , ident Braces V arDeclExp | constructor M ethodBody int Braces ident M ethodBody |string Braces ident M ethodBody |ident Braces ident M ethodBody ( P aramList) Statement int ident Braces P aramListExp |string ident Braces P aramListExp |ident ident Braces P aramListExp | , int ident Braces P aramListExp |, string ident Braces P aramListExp |, ident ident Braces P aramListExp | V arDecl; |AtribStat; |P rintStat; |ReadStat; |ReturnStat; |SuperStat; |If Stat |F orStat |{StatList} |break 2 |;

Braces

V arDeclExp

ConstructDecl M ethodDecl

M ethodBody P aramList

P aramListExp

Statement

AtribStat

LV alue = Expression |LV alue = AlocExpression print Expression read LV alue return |return Expression super (ArgList) if (Expression) Statement |if (Expression) Statement else Statement for (F orStatExp1 AtribStat; F orStatExp2 |; F orStatExp2 Expression; F orStatExp3 |; F orStatExp3 AtribStat) Statement |) Statement Statement StatList |Statement ident LV alueExp [Expression] LV alueExp |. ident (ArgList) LV alueExp |. ident LV alueExp | new AlocExpressionExp ident (ArgList) |int [Expression] AlocExpressionExpCont |string [Expression] AlocExpressionExpCont |ident [Expression] AlocExpressionExpCont

P rintStat ReadStat ReturnStat

SuperStat If Stat

F orStat F orStatExp1

F orStatExp2

F orStatExp3

StatList

LV alue LV alueExp

AlocExpression AlocExpressionExp

AlocExpressionExpCont [Expression] AlocExpressionExpCont |

Expression

N umExpr Operator N umExpr |N umExpr OperatorRel N umExpr |N umExpr < |> |<= |>= |== |!= T erm OperatorRel + T erm OperatorRel |- T erm OperatorRel | U naryExpr U naryOperator

Operator

N umExp OperatorRel

T erm

U naryOperator * U naryExpr U naryOperator |/ U naryExpr U naryOperator |% U naryExpr U naryOperator | U naryExpr + F actor |- F actor |F actor int-constant |string-constant |null |LV alue |(Expression) Expression ArgListExp | , Expression ArgListExp |

F actor

ArgList

ArgListExp

Analisador Lxico e

A funo que implementa o analisador lxico poder ser gerada automaticamente, utilizandoca e a se o gerador de analisadores lxicos JFlex. O JFlex gera um analisador escrito na linguagem e Java. A funo gerada deve ser capaz de reconhecer os tokens da gramtica da linguagem MicroJ ca a especicada na Seo 2. Dever tambm processar e descartar comentrios. Os comentrios ca a e a a 4

podem ocupar mais de uma linha do programa fonte. Um comentrio em MicroJ inicia com a o par de s mbolos /*e termina com o par de s mbolos */. O analisador lxico dever e a reportar erro, caso um comentrio no termine. As palavras reservadas de MicroJ so: class, a a a extends, int, string, break, print, read, return, super, if, else, for, new, null. Para cada token que aparece em um arquivo de entrada a funo analisador lxico dever gerar: ca e a a) um nmero inteiro correspondente ao token encontrado ou o caractere correspondente u ao token; b) o lexema correspondente; c) o nmero da linha no programa fonte onde o token foi encontrado. u No caso em que o token uma constante inteira ou string (int-constant, string-constant), e ou um identicador (ident), a funo deve gerar como lexema, o texto que forma a constante ca ou o identicador (ex.: x1, cont2). O analisador lxico deve reportar (atravs de um cdigo especial ou de mensagem ime e o pressa) erros lxicos encontrados no arquivo de entrada. So exemplos de erros lxicos: care a e acteres invlidos na linguagem, comentrios que no terminam, cadeia de caracteres que no a a a a terminam ou que ocupam mais de uma linha no arquivo de entrada. Caso o arquivo contenha um erro lxico, o programa dever imprimir uma linha cone a tendo exatamente o seguinte: ERRO:, seguido por um espao em branco e, por uma das c seguintes mensagens de erro: CARACTERE INVALIDO ou COMENTARIO NAO TERMINA ou CADEIA DE CARACTERES OCUPA MAIS DE UMA LINHA. Aps a mensagem de erro o programa deve imprimir, na mesma linha, o nmero da linha do o u programa fonte onde o erro foi encontrado.

Analisador Sinttico a

A funo do compilador que implementa o analisador sinttico pode ser gerada automaticaca a mente utilizando-se o gerador de analisadores sintticos ou parsers. Neste trabalho poder a a ser utilizado o gerador BYACC/J. Ele utiliza o mtodo LALR para a gerao do analisador e ca sinttico. O trabalho de implementao do analisador sinttico consiste na preparao do a ca a ca arquivo de entrada para o gerador de analisador sinttico e na adaptao da funo anala ca ca isador sinttico gerada para que possa funcionar utilizando a funo analisador lxico obtida a ca e no trabalho especicado na Seo 3. ca O programa principal que chama a funo analisador sinttico deve receber o nome do ca a arquivo a ser compilado como parmetro de entrada. Especicamente, dado que o programa a executvel do analisador sinttico tenha o nome microj, e supondo que o arquivo de entrada a a seja teste.z, deve ser poss vel executar a anlise sinttica do arquivo atravs do seguinte a a e comando em uma shell do Linux: ./microj teste.z Deve ser implementado o corpo da funo yyerror(), de tal modo que erros sintticos ca a detectados pela funo yyparse() sejam emitidos na tela do computador, juntamente com o ca nmero da linha onde o erro foi detectado. A mensagem de erro deve iniciar com a palavra u ERRO: seguida por um espao. c

4.1

Informaoes Sobre a Implementao e a Entrega c ca

O trabalho deve ser desenvolvido em grupo de no mximo 3 alunos1 e deve ser entregue a at o dia 30/05/2012. Trabalhos entregues aps esta data sero penalizados com -0,5 ponto e o a por dia de atraso. Os trabalhos devem ser apresentados no dia 02/06/2012. Trabalhos no a apresentados tero nota ZERO. Devem ser entregues: a O cdigo de entrada para o gerador de analisador lxico utilizado (arquivo com extenso o e a .l). O cdigo de entrada para o gerador de analisador sinttico utilizado (arquivo com o a extenso .y). a Arquivo na extenso .txt com o nome dos componentes do grupo a O Makele contendo: Comandos de execuo do gerador de analisador lxico (JFlex) para converso do ca e a arquivo de entrada do gerador de analisador lxico em programas Java. e Comandos de execuo do gerador de analisador sinttico (BYACC/J) para conca a verso do arquivo de entrada do gerador de analisador sinttico. a a Comandos de compilao e link-edio para compilar e ligar o programa principal ca ca com os cdigos dos analisadores lxicos e sintticos gerados. o e a Os itens acima devem estar agrupados em um arquivo do tipo tar compactado com o utilitrio gzip e submetidos na respectiva tarefa no Moodle da disciplina. No corpo da mena sagem deve conter o nome completo dos componentes do grupo. os cdigos gerados devem o estar preparados para executarem no sistema operacional Linux (ambiente onde os trabalhos sero avaliados). O programa executvel deve ter o nome microj. a a

Ateno: ca
Cpia de partes de cdigo implicam em nota ZERO para todos os integrantes o o dos grupos envolvidos (o grupo que copiou e o grupo que cedeu o trabalho para cpia). o

Pode tambm ser implementado por somente um ou dois alunos. e

Você também pode gostar