Beruflich Dokumente
Kultur Dokumente
NDICE
1
Introduccin..3
Actividad 1 Detectar errores semnticos...7
Actividad 2 Disear y seleccionar informacin sobre la construccin de un
analizador semntico..10
Actividad 3 Reconocer el manejo de tipos en las expresiones y el uso de
operadores. ...................................................................................................13
Actividad 4 Establecer las reglas para la conversin de tipos (casting) en
expresiones. ..18
Actividad 5 Agregar acciones semnticas a la estructura de la gramtica.
...25
Actividad 6 Manipular la tabla de conversin de smbolos y de errores y
direcciones. ..26
Actividad 7 Integrar equipos de trabajo para la construccin de un analizador
semntico. 30 ..
Actividad 8 Propuesta de proyecto 82
Conclusin.84
Bibliografa 85
INTRODUCCIN
Antes de comenzar es necesario conocer algunos conceptos para poder
entender mejor el desarrollo del tema y se enlistan a continuacin:
Semntica: Conjunto de reglas que especifican el significado de cualquier
sentencia sintcticamente correcta y escrita en un determinado lenguaje.
Funciones Principales:
RECUPERACION DE ERRORES
Un sistema de tipos seguro elimina la necesidad de comprobar dinmicamente
errores de tipos ya que permite determinar estticamente que dichos errores no
pueden ocurrir cuando se est ejecutando el programa objeto. Se dice que un
lenguaje es fuertemente tipificado si su compilador puede garantizar que los
programas que acepte se ejecutarn sin errores de tipo.
MANEJO DE ERRORES
Es una de las misiones ms importantes del compilador. Se utiliza ms en el
anlisis, pero los errores pueden darse en cualquier fase. El manejo de errores es
una tarea difcil por dos motivos:
Una vez identificado el token, en la parte derecha se crea una tabla de smbolos
ordenando el tipo de dato que contiene el archivo de texto.
8
En dado caso de que el archivo contenga errores, mostrar la lnea en donde se encuentra el error,
este compilador, tiene como funciones, abrir, guardar e incluso modificar. Se agregan propiedades
como cambiar el color del texto, tamao de la ventana como tambin una opcin de Ayuda.
SOBRE
LA
Los nodos deben estar etiquetados por operadores Si un operador tiene mayor
prioridad que la raz se coloca como hijo.
Si un operador tiene igual o menor prioridad que un nodo se coloca como padre.
Un nodo puede contener como hijo otro subrbol que contiene una pequea
expresin.
10
Construccin
Para construir los 3 rboles, debemos comenzar por definir qu elementos emplearemos para
cada estructura:
11
12
EJEMPLOS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace cadena_expresion
{
class Program
{
static void Main(string[] args)
{
analizaFichero();
}
static public void analizaFichero()
{
string[] Cadenas= {"Aplastar","Haragan","Encargado","Seleccion"};
string sexpresion;
Console.Write("Escribir expresion: ");
sexpresion = Console.ReadLine();
foreach (string s in Cadenas)
13
{
//System.Console.Write("{0,24}", s);
if (Regex.IsMatch(s, sexpresion))
{
System.Console.WriteLine("Existe coincidencia '{0}' en: '{1}'", sexpresion, s);
}
else
{
System.Console.WriteLine("No existe coincidencia '{0}' en: '{1}'", sexpresion, s);
}
Console.ReadLine();
}
}
}
}
Ejemplo 1:
14
Dato numrico
Valor lgico
Carcter
15
Ejemplo 1:
Ejemplo 2:
Operadores
Un operador permite relacionar dos datos en una expresin y evaluar el resultado de una
operacin.
Tipos:
Aritmticos
De asignacin
De comparacin
Lgicos
ARITMTICOS
Manipulan datos numricos. Son los siguientes:
Suma +
Resta -
Producto *
Divisin /
16
Incremento unitario ++
Decremento unitario -
Ejemplo 1: muestra por consola una serie de resultados asociados a clculos sencillos
realizados
con
los
operadores
aritmticos.
DE ASIGNACIN
Transfieren datos de una variable a otra. Son los siguientes:
x+=y
x=x+y
x-=y
x=x-y
x*=y
x=x*y
x/=y
x=x/y
x%=y
x=x%y
Ejemplo 1:
Valor de z: 8
17
DE COMPARACIN
Comparan dos datos y devuelven un valor booleano. Son los siguientes:
==
!=
distinto
<
mayor que
<
menor que
>=
<=
Ejemplo:
Valor de z: true
LGICOS
Concatenan expresiones lgicas con objeto de evaluar si es cierto o falso el conjunto de las
expresiones. Son los siguientes:
&& (Y lgico): si todas las expresiones lgicas que se evalan son verdaderas se
devuelve un valor booleano true; si alguna es falsa, devuelve false.
Ejemplo 1:
18
Valor de z: true
19
EJEMPLO 3: ejecuta las operaciones de acuerdo a los valores que tiene las
variables declaradas y muestra los resultados
20
21
Por lo tanto, hay una conversin implcita entre cualquier entero y el tipo bool, y si
aadimos esta regla a las explicadas antes, cualquier valor double, long double,
float o cualquiera de los enteros, incluso char, se puede convertir a bool.
Esto nos permite usar condiciones abreviadas en sentencias if, for, while o
do..while,
cuando el valor a comparar es cero.
Por ejemplo, las siguientes expresiones booleanas son equivalentes:
0 == x equivale a !x.
0 != x equivale a x.
En el primer caso, usamos el operador == para comparar el valor de x con cero,
pero al aplicar el operador ! directamente a x obligamos al compilador a
reinterpretar su valor como un bool, de modo que si x vale 0 el valor es false, y !
false es true. De forma simtrica, si x es distinto de cero, se interpretar como
true, y !true es false. El resultado es el mismo que usando la expresin 0 == x.
En el segundo caso pasa algo anlogo. Ahora usamos el operador != para
comparar el valor de x tambin con cero, pero ahora interpretamos directamente x
como bool, de modo que si x vale 0 el valor es false, y si x es distinto de cero, se
interpretar como true. El resultado es el mismo que usando la expresin 0 != x.
No est claro cul de las dos opciones es ms eficaz, a la hora de compilar el
programa.
Probablemente, la segunda requiera menos instrucciones del procesador, ya que
existen instrucciones de ensamblador especficas para comparar un entero con
cero. Del otro modo estaremos comparando con un valor literal, y salvo que el
compilador optimice este cdigo, generalmente se requerirn ms instrucciones de
este modo.
Aadir que los ejemplos anteriores funcionan, aunque el tipo de x no sea un
entero. Si se trata de un valor en coma flotante se realizar una conversin
implcita a entero antes de evaluar la expresin.
Casting: conversiones explcitas de tipo
^
Para eludir estos avisos del compilador se usa el casting, o conversin explcita.
Nota: de nuevo nos encontramos ante un trmino que suele aparecer en ingls en
los documentos. Se podra traducir como amoldar o moldear, pero no se hace.
23
Tabla->Cells[1][0]="Tipo";
TablaTokens->Cells[0][0]="Tokens";
FILE *Tabla1, *Tabla2;
int i=1;
int j=1;
Tabla1=fopen("c:/Analisis.Txt", "r");
fread(&lex1,sizeof(lex1),1,Tabla1);
while (!feof(Tabla1))
{
Tabla->Cells[0][i]=lex1.token;
Tabla->Cells[1][i++]=lex1.tipo;
fread(&lex1,sizeof(lex1),1,Tabla1);
}
fclose(Tabla1);
Tabla2=fopen("c:/Tokens.Txt", "r");
fread(&token2,sizeof(token2),1,Tabla2);
while (!feof(Tabla2))
{
TablaTokens->Cells[0][j]=token2.tokens;
fread(&token2,sizeof(token2),1,Tabla2);
25
26
exp(i) = "op"
Console.Write("<" & exp(i) & "," & myChar & ">")
ElseIf myChar = "a" Or myChar = "b" Or myChar = "c" Or myChar = "d" Or myChar
= "e" Or myChar = "f" Or myChar = "g" Or myChar = "h" Or myChar = "i" Or myChar = "j"
Or myChar = "k" Or myChar = "l" Then
exp(i) = "exp"
Console.Write("<" & exp(i) & "," & myChar & ">")
ElseIf myChar = "1" Or myChar = "2" Or myChar = "3" Or myChar = "4" Or myChar
= "5" Or myChar = "6" Or myChar = "7" Or myChar = "8" Or myChar = "9" Then
exp(i) = "num"
Console.Write("<" & exp(i) & "," & myChar & ">")
ElseIf myChar = "(" Then
exp(i) = "par_d"
Console.Write("<" & exp(i) & "," & myChar & ">")
ElseIf myChar = ")" Then
exp(i) = "par_iz"
Console.Write("<" & exp(i) & "," & myChar & ">")
Else
Console.WriteLine(myChar & "
End If
Next
Console.WriteLine(" ")
Dim z As Integer
J=0
z=1
oAnaLex.Inicia();
oAnaLex.Analiza(jTextArea1.getText());
modelo=new ModeloDeTabla(oAnaLex.Tokens(),oAnaLex.Lexemas());
jTable1.setModel(modelo);
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
jTextArea1.setText("");
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new AnaLex().setVisible(true);
}
});
}
28
29
Acceder a la tabla de smbolos (para hacer parte del trabajo del analizador
semntico).
Chequeo de tipos (del analizador semntico).
Generar cdigo intermedio.
Generar errores cuando se producen.
En definitiva, realiza casi todas las operaciones de la compilacin. Este
mtodo de trabajo da lugar a los mtodos de compilacin dirigidos por
sintaxis
int a = value;
No debe emitir un error lxico y la sintaxis en fase de anlisis, ya que es lxico y
estructuralmente correcto, pero se debe generar un error semntico como del tipo
de asignacin es diferente. Estas normas estn definidas por la gramtica de la
lengua y evaluado en anlisis semntico. Las siguientes tareas deben realizarse
en anlisis semntico:
30
Resolucin de mbito
Comprobacin de tipos
Matriz de control
Errores semnticos
Hemos mencionado algunos de los errores que la semntica analizador
semntico se espera para reconocer:
Variable no declarada
31
EJEMPLO 1
En la ilustracin 1 se define una variable a de tipo entero despus se le asigna un valor decimal y
una cadena porque nos muestra error
32
EJEMPLO 2
Ilustracin 3: Cdigo
En la ilustracin a una variable a se trata de asignar valores y esto da un error porque la variable
no est defina
33
EJEMPLO 3
Ilustracin 6: Cdigo
34
EJEMPLOS
En la ilustracin 1 se define una variable a de tipo entero despus se le asigna un valor decimal y
una cadena porque nos muestra error
35
Tamao mximo o rango de cada una de las dimensiones de los array, si tiene
dimensin esttica.
Los errores que puede detectar el analizador sintctico son aquellos que violan las
reglas de una gramtica independiente del contexto. Ya hemos mencionado que
algunas de las caractersticas de un lenguaje de programacin no pueden
enunciarse con reglas independientes del contexto, ya que dependen de l; por
ejemplo, la restriccin de que los identificadores deben declararse previamente.
Un compilador utiliza una tabla de smbolos para llevar un registro de la
informacin sobre el mbito y el enlace de los nombres. Se examina la tabla de
smbolos cada vez que se encuentra un nombre en el texto fuente. Si se descubre
un nombre nuevo o nueva informacin sobre un nombre ya existente, se producen
cambios en la tabla.
Un mecanismo de tabla de smbolos debe permitir aadir entradas nuevas y
encontrar las entradas existentes eficientemente. Los dos mecanismos para tablas
de smbolos presentadas en esta seccin son listas lioeal.es y tablas de
dispersin. Cada esquema se evala basndose en el tiempo necesario para
aadir n entradas y realizar e consultas. Una lista lineal es lo ms fcil de
implantar, pero su rendimiento es pobre cuando e y n s vuelven ms grandes.
Los esquemas de dispersin proporcionan un mayor rendimiento con un esfuerzo
algo mayor de programacin y gasto de espacio. Ambos mecanismos pueden
adaptarse rpidamente para funcionar con la regla del anidamiento ms cercano.
La entrada misma de la tabla de smbolos puede establecerse cuando se aclara el
papel de un nombre y se llenan los valores de los atributos cuando se dispone de
la informacin. En algunos casos, el analizador lxico puede iniciar la entrada en
cuanto aparezca un nombre en los datos de entrada. A menudo, un nombre puede
indicar varios objetos distintos, quizs incluso en el mismo bloque o procedimiento
Los atributos de un nombre se introducen en respuesta a las declaraciones, que
pueden ser implcitas. Las etiquetas son a menudo identificadores seguidos de
dos puntos, as que una accin asociada con el reconocimiento de dicho
identificador puede ser introducir este hecho en la tabla de smbolos. Asimismo, la
sintaxis de las declaraciones de procedimientos especifica que algunos
identificadores son parmetros formales.
37
38
Ejemplo
%}
Package analizador;
%%
{WHITE} {/*Ignore*/}
%%
%class Lexer
%type Token
L = [a-zA-Z_]
D = [0-9]
WHITE=[ \t\r\n]
{L}({L}|{D})*
ID;}
%{
{lexeme=yytext();
("(-"{D}+")")|{D}+
return INT;}
. {return ERROR;}
39
return
{lexeme=yytext();
Ejemplo 1
Aqu nos muestra el ejemplo que hemos realizado, para saber si es correcto le
damos en la accin (compilar) y en la parte de abajo muestra que se compilo con
xito e indica el nmero de filas contadas
Ejemplo 2
Ya que compilo con xito mostraremos la tabla de tokens de dicho ejemplo
Ejemplo 3
A continuacin, mostraremos un error para indicar si los marca, le quitaremos el
punto y coma de la lnea 7 y sale el mensaje de error
CDIGO FUENTE
MANEJO DE ERRORES
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ManejoDeErrores
{
public class TE
{
if (error.Id == id)
{
Tabla_Errores er = new Tabla_Errores();
er.Descripcion = error.Descripcion;
er.Solucion = error.Solucion;
er.Id = error.Id;
TErroresed.Add(er);
}
}
}
}
DESARROLLO DEL PROGRAMA
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Tsimbolos;
using System.Text.RegularExpressions;//using necesario , llama ala
referencia de la libreria de expresiones regulares
using Microsoft.Office.Interop.Excel;
using ManejoDeErrores;
namespace CompEd
{
public partial class Ide : Form
{
int cantLineas =0 ;
string nomarchivox;
TS tabla_simbolos = new TS();
TE tabla_errorres = new TE();
public Ide()
{
InitializeComponent();
}
private void salirToolStripMenuItem_Click(object sender, EventArgs
e)
{
System.Windows.Forms.Application.Exit();
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
//AnlzdrSntctc();
}
private void toolStripButton7_Click(object sender, EventArgs e) {
System.Windows.Forms.Application.Exit();
}
tabla_errorres.inicialestaE();
tabla_simbolos.inicialista();
tabControl1.Visible = false;
PagCodigo.Select();
PagCodigo.DetectUrls = true;
#region area de notificacion
notifyIcon1.Text = " CompEd# 2013";
notifyIcon1.BalloonTipTitle = " <# Hello World";
notifyIcon1.BalloonTipText = "Bienvenido a CompEd# 2013";
notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
this.Click += new EventHandler(notifyIcon1_Click);
notifyIcon1.Visible = true;
notifyIcon1.ShowBalloonTip(3000);
#endregion
}
this.Activate();
}
//-----------------------------METODOS DE ARCHIVOS
-----------------------------------------
excel.Application.Workbooks.Add(true);
int ColumnIndex = 0;
ColumnIndex++;
int rowIndex = 0;
rowIndex++;
ColumnIndex = 0;
ColumnIndex++;
excel.Cells[rowIndex + 1, ColumnIndex] =
row.Cells[col.Name].Value;
}
}
excel.Visible = true;
Worksheet worksheet = (Worksheet)excel.ActiveSheet;
worksheet.Activate();
}
Abrir
";
ofd.ShowDialog();
// ofd.Filter = "Archivos ed#(*.ed)|*.ed";
if (File.Exists(ofd.FileName))
{
using (Stream stream = ofd.OpenFile())
{
//MessageBox.Show("archivo encontrado: "+ofd.FileName);
leerarchivo(ofd.FileName);
nomarchivox = ofd.FileName;
txt_direccion.Text =ofd.FileName;
tabControl1.Visible = true;
}
}
}catch(Exception){
tabla_errorres.addliste(2);
}
reader.Close();
PagCodigo.Text = texto;
// read =reader.ReadLine();
//}
bool existe;
if (File.Exists(nomarchivo))
{
// el archivo existe
existe = true;
}
else
{
// el archivo no extiste
existe = false;
}
return existe;
}
if (File.Exists(saveFile.FileName))
{
// el archivo existe
//------------------- para un log que agrega eventos ..................
//StreamWriter writer = File.AppendText(nomarchivo);
//writer.WriteLine("\n <</ ---Actualizacion del " +
DateTime.Now.ToString() + " />>");
//writer.Write(PagCodigo.Text);
//writer.Close();
}
else
{
// el archivo no extiste
StreamWriter codigonuevo =
File.CreateText(saveFile.FileName);
codigonuevo.Write(PagCodigo.Text);
}
else
{
// el archivo nuevo
StreamWriter codigonuevo = File.CreateText(nomarchivo);
codigonuevo.Write(PagCodigo.Text);
codigonuevo.Flush();
codigonuevo.Close();
}
}
catch (Exception)
{
MessageBox.Show("error al guardar");
}
}
public void leer_archivo_al(string nomarchivo)
{
if (reader.EndOfStream)
{
//MessageBox.Show("ultima linea");
break;
}
else
}
Palabras_Separadas = read.Split(' ');
foreach (var palabra in Palabras_Separadas)
{
#region Medicion del ambito
if (palabra == "{")
{
contador_Ambitoi = contador_Ambitoi + 1;
}
if (palabra == "}")
{
contador_Ambitf = contador_Ambitf + 1;
}
ambito = contador_Ambitoi;
#endregion
//----------------------------------------------------------------------if (tabla_simbolos.compararAL(palabra.ToString()) && palabra != null)//
se manda a comparar la palabra con la tabla de simbolos
{
//
,tam,ambit,
tipo,
descrip
//uneSentencias();
tabla_de_simbolos objnuevo = new tabla_de_simbolos(palabra, "",
numero_de_lineas, -0, ambito,
tabla_simbolos.compararALRef(palabra.ToString()), "palabra nueva",
"palabra que coincide con la Tabla de simbolos", "");
tabla_simbolos.aadir_obj(objnuevo);
PagCodigo.SelectionStart = PagCodigo.Find(palabra);
PagCodigo.SelectionColor = Color.DodgerBlue;
}
else//de no estar en la tabla de simbolos se agrega a
un campo nuevo
{
if (Regex.IsMatch(palabra, @"[a-zA-Z]") && palabra !
= null)//sentencia que revisa los dos texbox
{
//
System.Windows.Forms.MessageBox.Show("esto es una palabra");
tabla_de_simbolos objnuevo = new
tabla_de_simbolos(palabra, "", numero_de_lineas, -0, ambito,
tabla_simbolos.contlineas() + 1, "palabra nueva", "palabra que no
coincide con la Tabla de simbolos,pero no se considera error","");
tabla_simbolos.aadir_obj(objnuevo);
}
else if (Regex.IsMatch(palabra,
@"\d{1}|\d{2}|\d{3}|\d{4}|\d{5}") && palabra != null)
{
//System.Windows.Forms.MessageBox.Show("esto
es un numero");
tabla_de_simbolos objnuevo = new
tabla_de_simbolos(palabra, palabra, numero_de_lineas, -0, ambito,
tabla_simbolos.contlineas() + 1, "numero nuevo", "numero","");
tabla_simbolos.aadir_obj(objnuevo);
PagCodigo.SelectionStart =
PagCodigo.Find(palabra);
PagCodigo.SelectionColor = Color.Aquamarine;
}
else
{
//
System.Windows.Forms.MessageBox.Show("Error en la expresion \n no
cumple con un formato correcto ");
}
}
}//fin del analisis lexico
}
Palabras_Separadas = null;
cantLineas = numero_de_lineas;
}
if (contador_Ambitf != contador_Ambitoi)
{
//MessageBox.Show("error de ambito");
tabla_errorres.addliste(8);
reader.Close();
}
catch (ArgumentNullException)
{
tabla_errorres.addliste(2);
}
catch (Exception)
{
MessageBox.Show("error");
}
for (int i = 1; i < cantLineas; i++) //une los token de cada linea
{
foreach (var token in tabla_simbolos.llamatabla())
{
if (token.NumLinea == i && token != null)
{
if (bandera == 0 && Regex.IsMatch(token.Simbolo,
@"(<#int|<#integer|<#double|<#bool|<#string|<#real|<#boolean)
$"))
{
token.TipoVar = token.Simbolo;
tipov = token.Simbolo;
}
if (bandera != 0)
{
sentencia = sentencia + " " + token.simbolo.ToString();
token.TipoVar = tipov;
}
else
{
sentencia = sentencia + token.simbolo.ToString();
bandera = 1;
}
}
}
sentencias[i] = sentencia;
sentencia = null;
bandera = 0;
tipov = "";
}
return sentencias;
}
#region analizador sintactico
public void AnlzdrSntctc(string[] sentencias)
{
if (Regex.IsMatch(sentencias[i], @"^<#int|<#integer\s+[az](1,15)(\s+:\s+\d(0,32000))*;$"))
{
System.Windows.Forms.MessageBox.Show("esto es una
sentencia int");
#region parte semantica
string[] separanum;
separanum = sentencias[i].Split(' ');
try{
int num ;
num = int.Parse(separanum[3]);
}catch(FormatException e){
}catch(IndexOutOfRangeException e){
tabla_errorres.addliste(10, i);
MessageBox.Show("error de escritura");
}
#endregion
}
else if (Regex.IsMatch(sentencias[i], @"^<#double|
<#real\s+[a-z](1,15)(\s+:\s+\d(0,32000))*;$"))
{
System.Windows.Forms.MessageBox.Show("esto es una
sentencia double");
#region parte semantica
string[] separanum;
separanum = sentencias[i].Split(' ');
try
{
double num;
num = double.Parse(separanum[3]);
}
catch (FormatException e)
{
tabla_errorres.addliste(0,i);
MessageBox.Show("no es un numero double");
}catch(IndexOutOfRangeException e){
tabla_errorres.addliste(10, i);
MessageBox.Show("error de escritura");
#endregion
}
else if (Regex.IsMatch(sentencias[i], @"^<#string|
<#texto\s+[a-z](1,15)(\s+:\s+[a-z](1,15)')*;$"))
{
System.Windows.Forms.MessageBox.Show("esto es una
sentencia string");
}
else if (Regex.IsMatch(sentencias[i], @"^<#bool|
<#boolean\s+[a-z](1,15)(\s+:\s+(true|false))*;$"))
{
System.Windows.Forms.MessageBox.Show("esto es una
sentencia bool");
}
catch (FormatException e)
{
}
else if (Regex.IsMatch(sentencias[i], @"<<*.*>>$"))
{
MessageBox.Show("Esto es un comentario");
}
else if (Regex.IsMatch(sentencias[i], @"[a-z]\s+:\s[a-z]|
(\w)*\s\+\s(\w)*|\d(0,32000)*\s;$"))
{
MessageBox.Show("esto es una sentecia de asignacion");
string[] separavar;
separavar = sentencias[i].Split(' ');
if (Regex.IsMatch(sentencias[i], @"[a-z]\s+:\s(\w)*\s\
+\s(\w)*\s;$"))//-- asignacion del tipo monto : num1 + num2 ;
{
#endregion
}
else if (Regex.IsMatch(sentencias[i], @"^{$"))
{
MessageBox.Show("inicio de ambito");
}
else if (Regex.IsMatch(sentencias[i], @"^}$"))
{
MessageBox.Show("fin de ambito");
}
else if (Regex.IsMatch(sentencias[i], @"<<si_\s\(\s+\w+\s(<|
>|<:|>:|::|!:)\s\w+\s\)\s\{$"))//-{
MessageBox.Show("comienzo de if");
}
else if (Regex.IsMatch(sentencias[i], @"<<ysi_\s\
(\s+\w+\s(<|>|<:|>:|::|!:)\s\w+\s\)\s\{$"))//-{
MessageBox.Show("comienzo de else if");
}
else if (Regex.IsMatch(sentencias[i], @"<<sino\s*\{$"))//-{
MessageBox.Show("comienzo de else");
}
else if (Regex.IsMatch(sentencias[i], @"#ncasd\s\(\s\w+\s(<|
>|<:|>:|::|!:)\s\w+\s\)\s\{$"))//-{
MessageBox.Show("comienzo del switch");
}
else if (Regex.IsMatch(sentencias[i], @"casd\s\
(\s(\w+|\d+)\s\)\s{$"))//-{
MessageBox.Show("comienzo de case");
}
else if (Regex.IsMatch(sentencias[i], @"fcasd\s;$"))//-{
MessageBox.Show("break del case");
}
else if (Regex.IsMatch(sentencias[i], @"#mintrs\s\
(\s\w+\s(<|>|<:|>:|::|!:)\s\w+\s\)\s{$"))
{
MessageBox.Show("inicio de un while");
}
{
MessageBox.Show("mostrar por pantalla \n" +
sentencias[i]);
}
//else if (Regex.IsMatch(sentencias[i],@""))
//{
//MessageBox.Show("");
//}
//else if (Regex.IsMatch(sentencias[i],@""))
//{
//MessageBox.Show("");
//}
//else if (Regex.IsMatch(sentencias[i],@""))
//{
//MessageBox.Show("");
//}
//else if (Regex.IsMatch(sentencias[i],@""))
//{
//MessageBox.Show("");
//}
else
{
if (sentencias[i] != null)
{
tabla_errorres.addliste(9, i);
//MessageBox.Show("Expresion invalida");
}
}
}
#endregion
//System.Windows.Forms.MessageBox.Show("" +
sentencias[i]);
}
}
#endregion
dataGridView2.DataSource = tabla_errorres.llamatablaE();
var cl = colorDialog1.ShowDialog();
if (cl == System.Windows.Forms.DialogResult.OK)
{
//PagCodigo.SelectionColor = colorDialog1.Color; <..... esto
para una parte del texto
PagCodigo.ForeColor = colorDialog1.Color;
}
var fm = fontDialog1.ShowDialog();
if (fm == DialogResult.OK)
{
//PagCodigo.SelectionColor = colorDialog1.Color; <..... esto
para una parte del texto
PagCodigo.Font = fontDialog1.Font;
}
if (tabla_simbolos.revisar_duplicados())
{
tabla_errorres.addliste(11);
}
AnlzdrSntctc(sent);
dataGridView1.DataSource = null;
dataGridView2.DataSource = null;
dataGridView1.DataSource = tabla_simbolos.llamatabla();
dataGridView2.DataSource = tabla_errorres.llamatablaE();
System.Media.SystemSounds.Asterisk.Play();
Acceder a la tabla de smbolos (para hacer parte del trabajo del analizador
semntico).
Chequeo de tipos (del analizador semntico).
Generar cdigo intermedio.
Generar errores cuando se producen.
Metodologia a utilizar???
CONCLUSIN
Aprend que las herramientas que muestran tipos de anlisis de programas fuente,
son muy tiles al momento de crear un programa al codificar un algoritmo, ya que
estas herramientas nos ayudan formateando el texto, corrigiendo errores, dando
tips; para que nosotros como programadores seamos ms eficientes al momento
de
crear
alguna
aplicacin.
Por otro lado, comprend que un compilador, requiere de una sintaxis y lenguajes
especficos, ya que, al igual que el lenguaje humano, si no lo escribimos
Bibliografa
(29 de 10 de 2014). Obtenido de
http://es.wikipedia.org/wiki/Visual_Basic_alfabeto a partir de un lenguaje