0% encontró este documento útil (0 votos)
25 vistas10 páginas

Gramaticap EAS

El documento describe la elaboración de una gramática en BNF para un lenguaje específico, junto con el desarrollo de un programa en Java que valida cadenas según esta gramática. Se presenta la estructura de la gramática, el pseudocódigo del validador de expresiones y el código fuente del programa. El programa permite al usuario ingresar una cadena y determina si es válida o no según las reglas definidas.

Cargado por

Camilo Navarrete
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
25 vistas10 páginas

Gramaticap EAS

El documento describe la elaboración de una gramática en BNF para un lenguaje específico, junto con el desarrollo de un programa en Java que valida cadenas según esta gramática. Se presenta la estructura de la gramática, el pseudocódigo del validador de expresiones y el código fuente del programa. El programa permite al usuario ingresar una cadena y determina si es válida o no según las reglas definidas.

Cargado por

Camilo Navarrete
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Descripción

Elaboración de la gramática, su representación de en BNF y desarrollo del


programa para validar cadenas de acuerdo a esta, para el siguiente lenguaje:

Gramática p/ EAS

Gramática
G= (V , T , P , S )
Donde :
V ={E }

T ={ + ,∗, ( , ) , a , b }

P={ E → E+ E , E∗E , ( E ) , a , b }
S={E }

Gramática en BNF (Backus Naur Form)


<expresion> ::= <expresion> + <expresion>
| <expresion> * <expresion>
| ( <expresion> )
|a
|b
Diagramas de sintaxis
Diagrama de árbol de derivación por la izquierda y por la derecha
El diagrama de ambas derivaciones es exactamente el mismo.
Pseudocódigo
Inicio

Definir Clase ExpressionValidator


Atributos:
Scanner scanner
char currentCharacter

Método Constructor ExpressionValidator(String input)


Inicializar scanner con input
Llamar a readNextCharacter()

Método boolean validate()


Asignar a isValid el resultado de parseExpression()
Retornar isValid y currentCharacter es igual a fin de cadena ('\0')

Método boolean parseExpression()


Si currentCharacter es 'a' o currentCharacter es 'b' Entonces
Llamar a readNextCharacter()
Retornar Verdadero
Sino Si currentCharacter es '(' Entonces
Llamar a readNextCharacter()
Si parseExpression() es Verdadero Entonces
Si currentCharacter es ')' Entonces
Llamar a readNextCharacter()
Retornar Verdadero
Fin Si
Fin Si
Retornar Falso
Sino
Si parseExpression() es Verdadero Entonces
Si currentCharacter es '+' o currentCharacter es '*' Entonces
Guardar currentCharacter en operator
Llamar a readNextCharacter()
Si parseExpression() es Verdadero Entonces
Retornar Verdadero
Fin Si
Fin Si
Fin Si
Fin Si
Retornar Falso

Método void readNextCharacter()


Si scanner tiene siguiente Entonces
currentCharacter = [Link] carácter
Sino
currentCharacter = '\0'

Método boolean hasValidCharacters(String expression)


Para cada carácter c en expression Hacer
Si c no es 'a', 'b', '+', '*', '(', ')' Entonces
Retornar Falso
Fin Si
Fin Para
Para i desde 0 hasta longitud de expression - 2 Hacer
Si (expression[i] es '+' o '*' Y expression[i + 1] es '+' o '*') Entonces
Retornar Falso
Fin Si
Fin Para
Retornar Verdadero

Método principal
Definir Scanner userInputScanner
Mostrar "Cadenas Validadoras - Análisis Sintáctico"
Mostrar "Cátedra: Lenguajes y Autómatas II"
Mostrar "Estudiantes: Brandon Pérez Meneses y Angel Emanuel Pérez
Romero"
Mostrar "Números de Control: 21200623 y 21200624"

Mostrar "Este programa valida si una cadena es correcta de acuerdo a la


siguiente gramática:"
Mostrar "P = { E → E + E, E → E * E, E → (E), E → a, E → b }"
Mostrar "Introduce una cadena (sin espacios): "
Leer input de userInputScanner
Crear una instancia de ExpressionValidator llamada validator con input
Si ![Link](input) Entonces
Mostrar "Error: La cadena tiene caracteres no válidos o presenta operadores
consecutivos."
Sino Si [Link]() Entonces
Mostrar "La cadena es válida según la gramática."
Sino
Mostrar "La cadena NO es válida según la gramática."
Fin Si
Cerrar userInputScanner
Fin
Código Fuente
/*
LENGUAJES Y AUTOMATAS II
Programa en base a la gramática de un número entero
Integrantes del equipo:
Calzada Islas Zyanya Camila 21200586
Navarro Ordonez Daniela 21200622
*/
package lengyautom2;
import [Link];

public class ExpressionValidator {


private Scanner scanner;
private char currentCharacter;

// Constructor que inicializa el escáner con la cadena de entrada


public ExpressionValidator(String input) {
[Link] = new Scanner(input);
readNextCharacter(); // Leer el primer carácter
}

// Método principal que valida si la cadena es una expresión válida


public boolean validate() {
boolean isValid = parseExpression(); // Comenzamos con la producción inicial E
return isValid && currentCharacter == '\0'; // La cadena es válida si consumimos todo
el input
}

// Función para resolver las producciones de "E"


private boolean parseExpression() {
if (currentCharacter == 'a' || currentCharacter == 'b') {
readNextCharacter(); // Consumimos el terminal 'a' o 'b'
return true; // E → a | b
} else if (currentCharacter == '(') {
readNextCharacter(); // Consumimos '('
if (parseExpression()) {
if (currentCharacter == ')') {
readNextCharacter(); // Consumimos ')'
return true; // E → (E)
}
}
return false; // No cerró el paréntesis
} else {
// Intentamos reconocer las producciones E → E + E o E → E * E
if (parseExpression()) {
if (currentCharacter == '+' || currentCharacter == '*') {
char operator = currentCharacter; // Guardamos el operador
readNextCharacter(); // Consumimos el operador
if (parseExpression()) {
return true; // E → E + E | E → E * E
}
}
}
}
return false; // No fue una expresión válida
}

// Función para avanzar al siguiente carácter


private void readNextCharacter() {
if ([Link]()) {
currentCharacter = [Link]().charAt(0);
} else {
currentCharacter = '\0'; // Fin de la cadena
}
}

// Método para verificar si la cadena es válida


private boolean hasValidCharacters(String expression) {
// Comprobamos si hay caracteres no válidos
for (char c : [Link]()) {
if (c != 'a' && c != 'b' && c != '+' && c != '*' && c != '(' && c != ')') {
return false;
}
}
// Comprobamos si hay operadores consecutivos
for (int i = 0; i < [Link]() - 1; i++) {
if (([Link](i) == '+' || [Link](i) == '*') &&
([Link](i + 1) == '+' || [Link](i + 1) == '*')) {
return false; // Operadores consecutivos
}
}
return true; // La expresión es válida
}

// Método principal para ejecutar el analizador sintáctico


public static void main(String[] args) {
Scanner userInputScanner = new Scanner([Link]);
[Link]("Introduce una cadena (sin espacios): ");
String input = [Link]().replace(" ", ""); // Eliminamos espacios en
blanco
ExpressionValidator validator = new ExpressionValidator(input);
if (![Link](input)) {
[Link]("Error: La cadena tiene caracteres no válidos o presenta
operadores consecutivos.");
} else if ([Link]()) {
[Link]("La cadena es válida según la gramática.");
} else {
[Link]("La cadena NO es válida según la gramática.");
}

[Link]();
}
}
Resultados
Al ingresar una cadena válida.
Al ingresar una cadena inválida.

También podría gustarte