como construir um compilador utilizando ferramentas java · pdf file 2009-03-11 ·...

Click here to load reader

Post on 16-Jul-2020

4 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • Como construir um compilador utilizando ferramentas Java

    Aula 5 – Análise Léxica com JavaCC

    Prof. Márcio Delamaro delamaro@icmc.usp.br

    Como construir um compilador utilizando ferramentas Java – p. 1/37

  • O que é o JavaCC

    Ambiente ou ferramenta que permite a geração de um analisador sintático completo

    Como construir um compilador utilizando ferramentas Java – p. 2/37

  • O que é o JavaCC

    Ambiente ou ferramenta que permite a geração de um analisador sintático completo

    A partir de uma descrição de alto nível gera código Java

    Como construir um compilador utilizando ferramentas Java – p. 2/37

  • O que é o JavaCC

    Ambiente ou ferramenta que permite a geração de um analisador sintático completo

    A partir de uma descrição de alto nível gera código Java

    Dentro de um só arquivo permite definir AL e AS

    Como construir um compilador utilizando ferramentas Java – p. 2/37

  • O que é o JavaCC

    Ambiente ou ferramenta que permite a geração de um analisador sintático completo

    A partir de uma descrição de alto nível gera código Java

    Dentro de um só arquivo permite definir AL e AS

    Permite também a construção da árvore sintática

    Como construir um compilador utilizando ferramentas Java – p. 2/37

  • Como funciona

    langx.jj JavaCC

    Como construir um compilador utilizando ferramentas Java – p. 3/37

  • Como funciona

    langx.jj JavaCC

    sort.x

    sort.jas

    Como construir um compilador utilizando ferramentas Java – p. 4/37

  • Como funciona

    Como construir um compilador utilizando ferramentas Java – p. 5/37

  • Partes do arquivo jj

    Opções

    Declaração da classe principal

    Declarações do AL

    Declarações do AS

    Como construir um compilador utilizando ferramentas Java – p. 6/37

  • Partes do arquivo jj options {

    STATIC = false;

    }

    PARSER_BEGIN(Test)

    public class Test {

    }

    PARSER_END(Test)

    SKIP :

    {

    " "

    }

    JAVACODE void program()

    {

    }

    Como construir um compilador utilizando ferramentas Java – p. 7/37

  • A classe principal tests2.jj

    PARSER_BEGIN(Test)

    public class Test {

    static public void main(String args[]) {

    System.out.printf("Hello world!");

    }

    }

    PARSER_END(Test)

    Como construir um compilador utilizando ferramentas Java – p. 8/37

  • A classe principal

    Como construir um compilador utilizando ferramentas Java – p. 9/37

  • A classe principal: langx++.jj PARSER_BEGIN(langX)

    package parser; / * declaraç ão de pacote * /

    import java.io. * ; / * imports necess ários * /

    public class langX {

    ...

    }

    PARSER_END(langX)

    Como construir um compilador utilizando ferramentas Java – p. 10/37

  • Variáveis da classe ...

    public class langX {

    final static String Version = "X++ Compiler - Version 1.0 - 20 04";

    boolean Menosshort = false; // sa ı́da resumida = falso

    ...

    }

    Como construir um compilador utilizando ferramentas Java – p. 11/37

  • Método principal: variáveis locais ...

    public class langX {

    // Define o m étodo "main" da classe langX.

    public static void main(String args[]) throws ParseExcept ion

    {

    String filename = ""; // nome do arquivo a ser analisado

    langX parser; // analisador l éxico/sint ático

    int i;

    boolean ms = false;

    System.out.println(Version);

    ...

    }

    Como construir um compilador utilizando ferramentas Java – p. 12/37

  • Método principal: ler argumentos public class langX {

    public static void main(String args[]) throws ParseExcept ion

    {

    ...

    // l ê os par âmetros passados para o compilador

    for (i = 0; i < args.length - 1; i++)

    {

    if ( args[i].toLowerCase().equals("-short") )

    ms = true;

    else

    {

    System.out.println("Usage is: java langX [-short] " +

    "inputfile");

    System.exit(0);

    }

    }

    ...

    }

    Como construir um compilador utilizando ferramentas Java – p. 13/37

  • Método principal: ler nome arquivo public static void main(String args[]) throws ParseExcept ion

    {

    ...

    if (args[i].equals("-")) { // l ê da entrada padr ão

    System.out.println("Reading from standard input . . .");

    parser = new langX(System.in);

    }

    else { // l ê do arquivo

    filename = args[args.length-1];

    System.out.println("Reading from file " + filename + " . . ." );

    try {

    parser = new langX(new java.io.FileInputStream(filename ));

    }

    catch (java.io.FileNotFoundException e) {

    System.out.println("File " + filename + " not found.");

    return;

    }

    }

    ...

    }

    Como construir um compilador utilizando ferramentas Java – p. 14/37

  • Criação do AS if (args[i].equals("-")) { // l ê da entrada padr ão

    System.out.println("Reading from standard input . . .");

    parser = new langX(System.in);

    }

    else { // l ê do arquivo

    filename = args[args.length-1];

    System.out.println("Reading from file " + filename + " . . ." );

    try {

    parser = new langX(new java.io.FileInputStream(filename ));

    }

    catch (java.io.FileNotFoundException e) {

    System.out.println("File " + filename + " not found.");

    return;

    }

    }

    Como construir um compilador utilizando ferramentas Java – p. 15/37

  • Execução e finalização public static void main(String args[]) throws ParseExcept ion

    {

    ...

    parser.Menosshort = ms;

    parser.program(); // chama o m étodo que faz a an álise

    // verifica se houve erro l éxico

    if ( parser.token_source.foundLexError() != 0 )

    System.out.println(parser.token_source.foundLexErro r() +

    " Lexical Errors found");

    else

    System.out.println("Program successfully analyzed.");

    }

    O AS “possui” um AL. O AL é definido pelo usuário

    (algumas coisas).

    Como construir um compilador utilizando ferramentas Java – p. 16/37

  • Classe principal: outros métodos public class langX {

    public static void main(String args[]) throws ParseExcept ion

    {

    ...

    }

    static public String im(int x)

    {

    int k;

    String s;

    s = tokenImage[x];

    k = s.lastIndexOf("\"");

    try {s = s.substring(1,k);}

    catch (StringIndexOutOfBoundsException e)

    {}

    return s;

    }

    Como construir um compilador utilizando ferramentas Java – p. 17/37

  • Descrição do AL

    A descrição do analisador léxico é dividida em duas partes:

    código Java a ser inserido na classe do AL;

    descrição dos itens léxicos;

    Como construir um compilador utilizando ferramentas Java – p. 18/37

  • Código Java

    TOKEN_MGR_DECLS : { int countLexError = 0;

    public int foundLexError() {

    return countLexError; }

    }

    Como construir um compilador utilizando ferramentas Java – p. 19/37

  • SKIP Todas as definições nesta seção utilizam a representação de expressões regulares. A palavra SKIP indica ao JavaCC que desejamos definir quais são as cadeias que devem ser ignoradas. SKIP :

    {

    " "

    | "\t"

    | "\n"

    | "\r"

    | "\f"

    }

    Como construir um compilador utilizando ferramentas Java – p. 20/37

  • TOKEN: palavras reservadas TOKEN é utilizada para definir, por meio de expressões regulares, quais as cadeias a serem reconhecidas e quais os tipos de tokens que a elas correspondem. TOKEN :

    {

    < BREAK: "break" >

    | < CLASS: "class" >

    | < CONSTRUCTOR: "constructor" >

    | < ELSE: "else" >

    | < EXTENDS: "extends" >

    | < FOR: "for" >

    ...

    | < PRINT: "print" >

    | < READ: "read" >

    | < RETURN: "return" >

    | < STRING: "string" >

    | < SUPER: "super" >

    }

    Como construir um compilador utilizando ferramentas Java – p. 21/37

  • Conflitos

    AL é construído de modo que a maior cadeia possível seja reconhecida. Por isso não há nenhum problema quanto a uma Expressão Regular poder gerar subcadeias de outra Expressão Regular. Sempre será considerada a maior cadeia da entrada que casar com alguma expressão regular. Isso acontece, por exemplo, a seguir com os tokens GT e GE. Se a entrada possuir um string >=, este será identificado como um GE, mas se possuir um > apenas, então GT será o casamento realizado.

    Como construir um compilador utilizando ferramentas Java – p. 22/37

  • TOKEN: operadores TOKEN :

    {

    < ASSIGN: "=" >

    | < GT: ">" >

    | < LT: "=" >

    | < NEQ: "!=" >

    | < PLUS: "+" >

    | < MINUS: "-" >

View more