package Portugol.Language.Utilitario;
import java.util.Stack;
import java.util.Vector;
public class Parentesis {
/**
* parentesis que abrem
*/
protected static String parOpen = "([{";
/**
* parentesis que fecham
*/
protected static String parClose = ")]}";
/**
* verifica se is parentesis
*
* @param ch caracter a verificar
* @return verdadeiro se for um paratesis
*/
public static boolean IsParentesis(char ch) {
return parOpen.indexOf(ch) != -1 || parClose.indexOf(ch) != -1;
}
/**
* verifica se is parentesis
*
* @param ch string a verificar
* @return verdadeiro se for um parentesis
*/
public static boolean IsParentesis(String ch) {
return parOpen.indexOf(ch) != -1 || parClose.indexOf(ch) != -1;
}
/**
* verifica se dois parentesis casam
*
* @param open parentesis a abrir
* @param close parentesis a fechar
* @return verdadeiro se forem complementares
*/
protected static boolean Match(char open, char close) {
return parOpen.indexOf(open) == parClose.indexOf(close);
}
/**
* verifica se uma string tem os parentesis na ordem correcta
*
* @param expr string a verificar
* @return verdadeiro se os parentesis estiverem correctos
*/
public static boolean Verify(Vector expr) {
Stack s = new Stack();
for (int i = 0; i < expr.size(); i++) {//David
if (!(expr.get(i) instanceof String)) {
continue;
}
char ch = ((String) expr.get(i)).trim().charAt(0);
if (parOpen.indexOf(ch) != -1) {
s.push("" + ch);
} else if (parClose.indexOf(ch) != -1) {
if (s.empty()) {
return false;
}
char ch2 = ((String) s.pop()).charAt(0);
if (!Match(ch, ch2)) {
return false;
}
}
}
return s.empty(); //David
}
/**
* calcula o erro de parentesis numa expressao
*
* @param expr expressao a verificar
* @return descricao do erro
*/
public static String GetError(Vector expr) {
Stack s = new Stack();
for (int i = 0; i < expr.size(); i++) {//David
if (!(expr.get(i) instanceof String)) {
continue;
}
char ch = ((String) expr.get(i)).trim().charAt(0);
if (parOpen.indexOf(ch) != -1) {
s.push("" + ch);
} else if (parClose.indexOf(ch) != -1) {
if (s.empty()) //return " PARENTESIS " + ch + "NAO ESTA ABERTO"; //David
{
return " PARENTESIS NAO ESTA ABERTO";
}
char ch2 = ((String) s.pop()).charAt(0);
if (!Match(ch, ch2)) //return " PARENTESIS " + ch + " E " + ch2 + "NAO COMBINAM"; //David
{
return " PARENTESIS NAO COMBINAM";
}
}
}
if (!s.empty()) //return "FALTA FECHAR OS PARENTESIS: " + s.toString();
{
return "FALTA FECHAR OS PARENTESIS: ";// + s.toString(); //David
}
return "OK";
}
}