Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programación de Sistemas
Equipo: 1
Fundamentación teórica:
Análisis Sintáctico.
La mayor parte de este tema está dedicada a los métodos de análisis sintáctico de uso
típico en compiladores. Primero se introducen los conceptos básicos, después las
técnicas adecuadas para la aplicación manual. Además como los programas pueden
contener errores sintácticos, los métodos de análisis sintáctico se pueden ampliar para
que se recuperen de los errores sintácticos más frecuentes.
En teoría, se supone que la salida del analizador sintáctico es alguna representación del
árbol sintáctico que reconoce la secuencia de tokens suministrada por el analizador
léxico.
• Acceder a la tabla de símbolos (para hacer parte del trabajo del analizador
semántico).
• Chequeo de tipos ( del analizador semántico).
• Generar código intermedio.
• Generar errores cuando se producen.
En definitiva, realiza casi todas las operaciones de la compilación. Este método de trabajo
da lugar a los métodos de compilación dirigidos por sintaxis.
Gramática libre de contexto.
Generalmente se atribuye a John Backus y Peter Naur el crédito por el desarrollo de esta
notación como una forma de describir la sintaxis del lenguaje de programación Algol.
A diferencia de los lenguajes naturales como el español, todas las cadenas de caracteres
validas en el lenguaje de programación pueden especificarse empleando una gramática
de libre contexto. Sin embargo, las gramáticas para los lenguajes de programación
especifican las cadenas semánticamente incorrectas, así como lo hacen las gramáticas
para los lenguajes naturales.
• Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su localización.
• Recuperarse del error, para poder seguir examinando la entrada.
• No ralentizar significativamente la compilación.
Un buen compilador debe hacerse siempre teniendo también en mente los errores que se
pueden producir; con ello se consigue:
*.txt
Archivo de captura:
/*condicion*/ if else int( n = = 20 ){
op = ( rs + 1 ) ;
//bobobobob
Reportes:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFileChooser;
import java.io.BufferedReader;
import java.io.FileReader;
import javax.swing.JFileChooser;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.*;
import java.util.StringTokenizer;
public class Interfaz extends JFrame implements ActionListener{
public JTextArea textCodigo,textError;
public JLabel codigo,tokens,tipo,simbolos,errores;
public JList listToken,listTipo;
public JTable tableToken,tableId,califas,foxxis;
public JScrollPane scroll1,scroll2,scroll3,scroll4;
public JButton botonAbrir,botonLexico,botonSintactico,botonSemantico,botonGenerador;
public Interfaz(){
setSize(800,600);
setLocationRelativeTo(null);
setTitle("Analizador Lexicogrfico");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ini();
}
setLayout(null);
botonAbrir = new JButton(); botonLexico = new JButton(); botonSintactico = new
JButton(); botonSemantico = new JButton(); botonGenerador=new JButton();
//fieldTokens= new JTextArea(); fieldSimbolos= new JTextArea(); fieldErrores=new JTextArea();
textCodigo=new JTextArea(); textError=new JTextArea();
//fieldTokens.setText("");
codigo=new JLabel("Introduzca el codigo aqui");
tokens=new JLabel("Tokens");
simbolos=new JLabel("Tabla de simbolos");
errores= new JLabel("Errores");
tableId = new JTable(140,1);
tableToken = new JTable(140,2);
scroll1 = new JScrollPane(tableToken);
scroll2 = new JScrollPane(tableId);
scroll3 = new JScrollPane(textCodigo);
scroll4 = new JScrollPane(textError);
scroll1.setBounds(430,50,250,200);
add(scroll1);
scroll2.setBounds(10,320,250,200);
add(scroll2);
scroll3.setBounds(10,50,320,200);
add(scroll3);
scroll4.setBounds(430,320,320,200);
add(scroll4);
codigo.setBounds(10,10,320,30);
codigo.setText("Introduce el codigo");
add(codigo);
tokens.setBounds(430,10,250,30);
tokens.setText("Tokens");
add(tokens);
simbolos.setBounds(10,280,250,30);
simbolos.setText("Tabla de simbolos");
add(simbolos);
errores.setBounds(430,280,250,30);
errores.setText("Errores");
add(errores);
botonAbrir.setBounds(340,80,80,20);
botonAbrir.setText("Abrir");
botonAbrir.addActionListener(this);
add(botonAbrir);
botonLexico.setBounds(700,80,80,20);
botonLexico.setText("Lexico");
botonLexico.addActionListener(this);
add(botonLexico);
botonSintactico.setBounds(700,120,80,20);
botonSintactico.setText("Sintactico");
botonSintactico.addActionListener(this);
add(botonSintactico);
}
if(l1.filtrarC(textCodigo.getText())==true){
textError.setText("No cierra comentario");
}else{
String cod=l1.filtrar(textCodigo.getText());
StringTokenizer tok = new StringTokenizer(cod);
for(i=0;i<palabra.length;i++){
System.out.print(palabra[i]+" ");
tableToken.setValueAt(palabra[i],i,0);
System.out.println(valor[i]);
tableToken.setValueAt(valor[i],i,1);
}
for(i=0;i<(ids.length);i++){
System.out.print(ids[i]+" ");
tableId.setValueAt(ids[i],i,0);
}
for(i=0;i<(errs.length);i++){
System.out.print(errs[i]+" ");
errors=(errors+errs[i]+"\n");
}
textError.setText(errors);// caracter invalido, token invalido, fin del programa
}
}
}else{
j++;
k=0;
}
}
for(i=0;i<textCodigo.getLineCount()-1;i++){
k=0;
for(p=0;p<entrada.length;p++){
entrada[p]=null;
}
for(j=0;j<palabra.length;j++){
if(renglon[i][j]!=null){
entrada[k]=renglon[i][j];
k++;
}
}
entrada[k]="$";
if (renglon[0][0].equals("=")){
System.out.println("Mas de un identificador");
}else{
Sintactico s1=new Sintactico();
s1.sintactico();
s1.area1.setText(s1.producir(entrada,produccion));
}
}
for(i=0;i<entrada.length;i++){
}
if(x.getSource()==botonAbrir){
String linea;
textCodigo.setText("");
LecturaArch archivo = new LecturaArch();
JFileChooser chooser = new JFileChooser();
if(chooser.showOpenDialog(null)==JFileChooser.APPROVE_OPTION){
linea="";
try{
linea=chooser.getSelectedFile().toString();
}catch(Exception mfue){
System.err.println("No se puede abrir");
}
if(linea != null){
System.out.println(linea);
textCodigo.append(archivo.Lectura(linea));
}
}
}else{
if (x.getSource()==botonLexico){
leccico();
}else{
if(x.getSource()==botonSintactico){
zintactico();
}
}
}
}
}
Analizador sintáctico:
import javax.swing.JOptionPane;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.lang.*;
public class Sintactico {
JFrame ventana;
JTextArea area1;
JScrollPane scr1;
JLabel label1;
System.out.println(produccion[noTerminal][simbolo]);
reglas=reglas+""+produccion[noTerminal][simbolo];
tope--;
if(produccion[noTerminal][simbolo]!=null){
for (i=produccion[noTerminal][simbolo].length()-1;i>0;i--){
if(produccion[noTerminal][simbolo].charAt(i)==' '){
if(produccion[noTerminal]
[simbolo].charAt(i+2)==' ' || produccion[noTerminal][simbolo].charAt(i+2)=='.'){
tope++;
pila[tope-1]= produccion[noTerminal]
[simbolo].charAt(i+1)+"";
}else{
tope++;
pila[tope-1]= produccion[noTerminal]
[simbolo].charAt(i+1)+""+produccion[noTerminal][simbolo].charAt(i+2);
}
}
}//fin del for
k=0;
while((k<produccion[noTerminal][simbolo].length()-1) &&
produccion[noTerminal][simbolo].charAt(k+1)!=' '){
k++;
}
palabra="";
for(i=0;i<=k;i++){
palabra=palabra+""+produccion[noTerminal]
[simbolo].charAt(i);
}
tope++;
pila[tope-1]=palabra;
}else{
pila[tope]=null;
}
}
j++;
}
if(actual==entrada.length)
System.out.println("Aceptado");
reglas=reglas+"\n"+"Aceptado";
return reglas;
}
ventana.setVisible(true);
}
if (!entrada[1].equals("=")){
System.out.println("Mas de un identificador");
}else{
Sintactico s1=new Sintactico();
s1.producir(entrada,produccion);
}
}
}
Resultados
Conclusiones