Você está na página 1de 9

UFMG ICEX DCC Departamento de Cincia da Computao Compiladores Profa.

a. Mariza Andrade da Silva Bigonha Trabalho Prtico Aluno: Eduardo Gomes Filho Proposta: Implementao de um analisador lxico para a linguagem L2012-1

Introduo:
Um analisador lxico uma fase do compilador na qual os lexemas, que so as palavras que compem um cdigo fonte, sero analisadas para se verificar se a existncia delas na linguagem permitida ou no. A linguagem L2012-1 de propsito educacional e foi projetada para que sua complexidade no ultrapasse as necessidade de tal propsito. Dessa forma, esperado que recursos mais sofisticados no estejam presentes na mesma. A seguir ser explicado como foi implementado o analisador lxico e mostrados os cdigos de exemplo.

Implementao:
Para a implementao do analisador foi usado o software JLEX (http://www.cs.princeton.edu/~appel/modern/java/JLex/), uma ferramenta que simplifica muito o desenvolvimento. Decidido isso, bastou ao autor fazer um arquivo de especificao no formato .lex, contendo as caractersticas do analisador para o reconhecimento dos tokens, para que a ferramenta pudesse consumir o arquivo e criar um programa em Java que fizesse o reconhecimento dos tokens como o espcificado. Abaixo, a listagem do cdigo utilizado como entrada do JLEX e, em seguida, um cdigo demonstrao com a sada dos tokens, juntamente com a impresso do cdigo fonte.

Concluso:
Neste trabalho foi implementado um analisador lxico simples para uma linguagem com princpios didticos com o objetivo de se ensinar o funcionamento de um compilador. Compiladores so ferramentas essenciais atualmente e aprender o funcionamento bsico deles da mesma importncia para um estudante de cincia da computao. O analisador lxico a primeira fase de um compilador e teve suas funcionalidades aprendidas pelo autor por meio deste trabalho prtico.
================ =============CDIGO DE ENTRADA DO LEX=========================================== package lex; class Sample { public static void main(String argv[]) throws java.io.IOException {

Yylex yy = new Yylex(System.in); Yytoken t; while ((t = yy.yylex()) != null) System.out.println(t); } } class Utility { public static void assert1 ( boolean expr ) { if (false == expr) { throw (new Error("Error: Assertion failed.")); } } private static final String errorMsg[] = { "Error: Unmatched end-of-comment punctuation.", "Error: Unmatched start-of-comment punctuation.", "Error: Unclosed string.", "Error: Illegal character." }; public static final int E_ENDCOMMENT = 0; public static final int E_STARTCOMMENT = 1; public static final int E_UNCLOSEDSTR = 2; public static final int E_UNMATCHED = 3; public static void error ( int code ) { System.out.println(errorMsg[code]); } } class Yytoken { Yytoken ( String index, String text, int line, int charBegin, int charEnd ) { m_index = index; m_text = new String(text); m_line = line; m_charBegin = charBegin; m_charEnd = charEnd; } Yytoken ( int index, String text, int line, int charBegin, int charEnd ) { i_index = index;

m_text = new String(text); m_line = line; m_charBegin = charBegin; m_charEnd = charEnd; } public String m_index; public String m_text; public int i_index; public int m_line; public int m_charBegin; public int m_charEnd; public String toString() { if(m_index == null) return "Token #"+i_index+": "+m_text+" (line "+m_line+")"; else return "Token #"+m_index+": "+m_text+" (line "+m_line+")"; } } %% %{ private int comment_count = 0; %} %line %char %state COMMENT ALPHA=[A-Za-z] DIGIT=[0-9] NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012] WHITE_SPACE_CHAR=[\n\ \t\b\012] STRING_TEXT=(\\\"|[^\n\"]|\\{WHITE_SPACE_CHAR}+\\)* COMMENT_TEXT=([^/*\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])* RESERVED=(program|integer|real|boolean|char|real|value|reference|begin|end|if|then|else|repeat|until|read|write|false|true|or|div|mod|and) FUNCTION=(sin|log|cos|ord|chr|abs|sqrt|exp|eof|eoln) %% <YYINITIAL> {RESERVED} { return (new Yytoken("key",yytext(),yyline,yychar,yychar + yytext().length())); } <YYINITIAL> "," { return (new Yytoken("comma",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> ":" { return (new Yytoken("colon",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> ";" { return (new Yytoken("semic",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "(" { return (new Yytoken("delim",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> ")" { return (new Yytoken("delim",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "[" { return (new Yytoken("delim",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "]" { return (new Yytoken("delim",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "{" { return (new Yytoken("delim",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "}" { return (new Yytoken("delim",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "." { return (new Yytoken("dot",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "+" { return (new Yytoken("addop",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "-" { return (new Yytoken("addop",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "or" { return (new Yytoken("addop",yytext(),yyline,yychar,yychar+2)); } <YYINITIAL> "*" { return (new Yytoken("mulop",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "/" { return (new Yytoken("mulop",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "div" { return (new Yytoken("mulop",yytext(),yyline,yychar,yychar+3)); } <YYINITIAL> "mod" { return (new Yytoken("mulop",yytext(),yyline,yychar,yychar+3)); } <YYINITIAL> "and" { return (new Yytoken("mulop",yytext(),yyline,yychar,yychar+3)); } <YYINITIAL> "=" { return (new Yytoken("relop",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "<" { return (new Yytoken("relop",yytext(),yyline,yychar,yychar+1)); } <YYINITIAL> "<=" { return (new Yytoken("relop",yytext(),yyline,yychar,yychar+2)); } <YYINITIAL> ">" { return (new Yytoken("relop",yytext(),yyline,yychar,yychar+1)); }

<YYINITIAL> ">=" { return (new Yytoken("relop",yytext(),yyline,yychar,yychar+2)); } <YYINITIAL> "!=" { return (new Yytoken("relop",yytext(),yyline,yychar,yychar+2)); } <YYINITIAL> {NONNEWLINE_WHITE_SPACE_CHAR}+ { } <YYINITIAL,COMMENT> \n { } <YYINITIAL> "/*" { yybegin(COMMENT); comment_count = comment_count + 1; } <COMMENT> "/*" { comment_count = comment_count + 1; } <COMMENT> "*/" { comment_count = comment_count - 1; Utility.assert1(comment_count >= 0); if (comment_count == 0) { yybegin(YYINITIAL); } } <COMMENT> {COMMENT_TEXT} { } <YYINITIAL> \"{STRING_TEXT}\" { String str = yytext().substring(1,yytext().length() - 1); Utility.assert1(str.length() == yytext().length() - 2); return (new Yytoken(40,str,yyline,yychar,yychar + str.length())); } <YYINITIAL> \"{STRING_TEXT} { String str = yytext().substring(1,yytext().length()); Utility.error(Utility.E_UNCLOSEDSTR); Utility.assert1(str.length() == yytext().length() - 1); return (new Yytoken(41,str,yyline,yychar,yychar + str.length())); } <YYINITIAL> {DIGIT}+ { return (new Yytoken(42,yytext(),yyline,yychar,yychar + yytext().length())); } <YYINITIAL> {ALPHA}({ALPHA}|{DIGIT}|_)* { return (new Yytoken("id",yytext(),yyline,yychar,yychar + yytext().length())); } <YYINITIAL> {FUNCTION} { return (new Yytoken("func",yytext(),yyline,yychar,yychar + yytext().length())); } <YYINITIAL,COMMENT> . { System.out.println("Illegal character: <" + yytext() + ">"); Utility.error(Utility.E_UNMATCHED); } ========================FIM DO CDIGO DE ENTRADA DO JLEX======================================== ==============================CDIGOS PARA TESTE================================================= 1) program arrayTest(input, output); var m : array[1..5] of integer; begin m[1] := 1; m[2] := 2; m[3] := 3; m[4] := 4; m[5] := 5; write(m[1]);

write(m[2]); write(m[3]); write(m[4]); write(m[5]) end. 2) program procTest (input, output); var a, b : integer; x : array [1..5] of real; procedure one (i, j : integer; k : array [1..5] of real); var n : integer; begin n := i + j; k[n] := 2.345 end begin a := 1; b := 2; one(a,b,x); write(x[a+b]) end.

================================SADA DO ANALISADOR LXICO======================================= 1) Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token #key: program (line 0) #id: arrayTest (line 0) #delim: ( (line 0) #id: input (line 0) #comma: , (line 0) #id: output (line 0) #delim: ) (line 0) #semic: ; (line 0) #id: var (line 1) #id: m (line 2) #colon: : (line 2) #id: array (line 2) #delim: [ (line 2) #42: 1 (line 2) #dot: . (line 2) #dot: . (line 2) #42: 5 (line 2) #delim: ] (line 2) #id: of (line 2) #key: integer (line 2) #semic: ; (line 2) #key: begin (line 3) #id: m (line 4) #delim: [ (line 4) #42: 1 (line 4) #delim: ] (line 4) #colon: : (line 4) #relop: = (line 4) #42: 1 (line 4) #semic: ; (line 4) #id: m (line 5) #delim: [ (line 5) #42: 2 (line 5) #delim: ] (line 5) #colon: : (line 5) #relop: = (line 5) #42: 2 (line 5)

Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token

#semic: ; (line 5) #id: m (line 6) #delim: [ (line 6) #42: 3 (line 6) #delim: ] (line 6) #colon: : (line 6) #relop: = (line 6) #42: 3 (line 6) #semic: ; (line 6) #id: m (line 7) #delim: [ (line 7) #42: 4 (line 7) #delim: ] (line 7) #colon: : (line 7) #relop: = (line 7) #42: 4 (line 7) #semic: ; (line 7) #id: m (line 8) #delim: [ (line 8) #42: 5 (line 8) #delim: ] (line 8) #colon: : (line 8) #relop: = (line 8) #42: 5 (line 8) #semic: ; (line 8) #key: write (line 10) #delim: ( (line 10) #id: m (line 10) #delim: [ (line 10) #42: 1 (line 10) #delim: ] (line 10) #delim: ) (line 10) #semic: ; (line 10) #key: write (line 11) #delim: ( (line 11) #id: m (line 11) #delim: [ (line 11) #42: 2 (line 11) #delim: ] (line 11) #delim: ) (line 11) #semic: ; (line 11) #key: write (line 12) #delim: ( (line 12) #id: m (line 12) #delim: [ (line 12) #42: 3 (line 12) #delim: ] (line 12) #delim: ) (line 12) #semic: ; (line 12) #key: write (line 13) #delim: ( (line 13) #id: m (line 13) #delim: [ (line 13) #42: 4 (line 13) #delim: ] (line 13) #delim: ) (line 13) #semic: ; (line 13) #key: write (line 14) #delim: ( (line 14) #id: m (line 14) #delim: [ (line 14) #42: 5 (line 14) #delim: ] (line 14) #delim: ) (line 14)

Token #key: end (line 15) Token #dot: . (line 15) Font: program arrayTest(input, output); var m : array[1..5] of integer; begin m[1] := 1; m[2] := 2; m[3] := 3; m[4] := 4; m[5] := 5; write(m[1]); write(m[2]); write(m[3]); write(m[4]); write(m[5]) end. 2) Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token

#key: program (line 18) #id: procTest (line 18) #delim: ( (line 18) #id: input (line 18) #comma: , (line 18) #id: output (line 18) #delim: ) (line 18) #semic: ; (line 18) #id: var (line 19) #id: a (line 19) #comma: , (line 19) #id: b (line 19) #colon: : (line 19) #key: integer (line 19) #semic: ; (line 19) #id: x (line 20) #colon: : (line 20) #id: array (line 20) #delim: [ (line 20) #42: 1 (line 20) #dot: . (line 20) #dot: . (line 20) #42: 5 (line 20) #delim: ] (line 20) #id: of (line 20) #key: real (line 20) #semic: ; (line 20) #id: procedure (line 21) #id: one (line 21) #delim: ( (line 21) #id: i (line 21) #comma: , (line 21) #id: j (line 21) #colon: : (line 21) #key: integer (line 21) #semic: ; (line 21) #id: k (line 21) #colon: : (line 21) #id: array (line 21) #delim: [ (line 21) #42: 1 (line 21)

Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token Token

#dot: . (line 21) #dot: . (line 21) #42: 5 (line 21) #delim: ] (line 21) #id: of (line 21) #key: real (line 21) #delim: ) (line 21) #semic: ; (line 21) #id: var (line 22) #id: n (line 22) #colon: : (line 22) #key: integer (line 22) #semic: ; (line 22) #key: begin (line 23) #id: n (line 24) #colon: : (line 24) #relop: = (line 24) #id: i (line 24) #addop: + (line 24) #id: j (line 24) #semic: ; (line 24) #id: k (line 25) #delim: [ (line 25) #id: n (line 25) #delim: ] (line 25) #colon: : (line 25) #relop: = (line 25) #42: 2 (line 25) #dot: . (line 25) #42: 345 (line 25) #key: end (line 26) #key: begin (line 27) #id: a (line 28) #colon: : (line 28) #relop: = (line 28) #42: 1 (line 28) #semic: ; (line 28) #id: b (line 29) #colon: : (line 29) #relop: = (line 29) #42: 2 (line 29) #semic: ; (line 29) #id: one (line 30) #delim: ( (line 30) #id: a (line 30) #comma: , (line 30) #id: b (line 30) #comma: , (line 30) #id: x (line 30) #delim: ) (line 30) #semic: ; (line 30) #key: write (line 31) #delim: ( (line 31) #id: x (line 31) #delim: [ (line 31) #id: a (line 31) #addop: + (line 31) #id: b (line 31) #delim: ] (line 31) #delim: ) (line 31)

Token #key: end (line 32) Token #dot: . (line 32)

Font: program procTest (input, output); var a, b : integer; x : array [1..5] of real; procedure one (i, j : integer; k : array [1..5] of real); var n : integer; begin n := i + j; k[n] := 2.345 end begin a := 1; b := 2; one(a,b,x); write(x[a+b]) end. ===========================================================================================