Analisador Sintático que aceite uma determinada gramática

0 respostas
J

Pessoal preciso fazer um analisador sintático pra seguinte gramatica.
S -> SS* | SS+ | a | vazio

meu código aceita a gramática mas estou com problemas em validar a cadeia de acordo com as restrições.

estou lendo de um arquivo texto chamado cadeia que contem a seguinte string

a aa* aa+ aa* a+
o meu problema é pegar a segunda string do txt e jogar em outra variavel auxiliar no caso proxlookahead mas manter meu lookahead no corrente...pra poder fazer as comparações.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class LerStrings {

    String token;
    String lookahead;
    String antlookahead;
    String proxlookahead;
    StringTokenizer st = null;
    
    
    public LerStrings() throws FileNotFoundException, IOException {
        BufferedReader arq = new BufferedReader(new FileReader("cadeia.txt"));
        token = arq.readLine(); //leio a linha toda e jogo na string 
        st = new StringTokenizer(token);
        this.lookahead = st.nextToken(); //pego a primeira palavra
        System.out.println(lookahead);// imprimi primeira palavra só pra ter certeza
       }

    void match(String t) {
        if (this.lookahead.equals(t)) { //se palavra for igual a string t
            antlookahead = this.lookahead; //guardo palavra atual numa string auxiliar
            lookahead = nextTerminal(); // pego proxima palavra
         //   this.proxlookahead = nextTerminal();
            System.out.println(this.lookahead); //imprimo pra ver se pegou mesmo proxima palavra
            System.out.println(antlookahead);//imprimo pra ver se guardou palavra anterior
            //System.out.println(proxlookahead);
        } else {
            System.out.println("Erro de Sintaxe");
        }
    }

    void s() {
        if (this.lookahead.equals("a")) {//testo se palavra atual é igual e se for...
            //verificar se tem caracteres antes, caso seja ultimo da cadeia não validar!
            //se for o primeiro e tiver mais "as" na cadeia tbm não validar!
            if ((this.antlookahead.equals(" "))||(this.antlookahead.equals("aa*"))||(this.antlookahead.equals("a*"))||(this.antlookahead.equals("aa+"))||(this.antlookahead.equals("a+"))){
//&&(this.proxlookahead.equals("aa*"))||(this.proxlookahead.equals("aa+"))||(this.proxlookahead.equals("a*"))||(this.proxlookahead.equals("a+"))) {
               System.out.println("Erro de Sintaxe, cadeia não válida!");
            } else { //então se for único, validar!
                match("a");//joga a pra string t da função match
            }
        } else if (this.lookahead.equals("aa*")) {//senão se palavra for igual...
            if (this.antlookahead.equals("a")){ //testar se não tem nenhum a sozinho antes ou depois
                System.out.println("Erro de Sintaxe");
            }else{ //validar senaum tiver a sozinho antes ou depois
                 match("aa*");         
                 s();
            }
        } else if (this.lookahead.equals("aa+")) {//senão se palavra for igual...
            if (this.antlookahead.equals("a")){ //testar se não tem nenhum a sozinho antes ou depois
                System.out.println("Erro de Sintaxe, cadeia não é válida!");
            }else{ //validar senaum tiver a sozinho antes ou depois
                 match("aa+");
                 s();
            }
        } else if (this.lookahead.equals("a+")) {//senão se palavra for igual...
            if ((this.antlookahead.equals("aa*"))||(this.antlookahead.equals("aa+"))){ //testar se tem aa* ou aa+ antes e validar
                match("a+"); 
                s();                
            }else{ //senão erro de sintaxe
                System.out.println("Erro de Sintaxe, cadeia não é válida!");
            }
        } else {
            System.out.println("Erro de Sintaxe, cadeia não é válida!");
        }
    }

    public String nextTerminal() {
        return st.nextToken(); 
      
    }
      
}
Criado 19 de setembro de 2008
Respostas 0
Participantes 1