Visual C++ .NET - necesito ayuda para crear un tokenizador

 
Vista:

necesito ayuda para crear un tokenizador

Publicado por gaby (1 intervención) el 09/06/2008 05:15:12
hola me llamo gaby y porfa neccesito ayuda para lo siguiente:
un programa en c++.net que diga cuales son los simbolos terminales y no terminales de un programa(int, string, ; , while ) o todas o la mayoria de palabras reservadas, y todo esto q lo mande traer de un archivo(un bloc de notas)
esq tengo este codigi pero la verdad no se como funciona:

// scaner_y.cpp : main project file.

#include "stdafx.h"

using namespace System;
using namespace System::IO;
int main(array<System::String ^> ^args)
{

//String^dir="palabras.txt";

String^nomarc=Console::ReadLine();
array<String^>^fijo=gcnew array<String^>(10000);
array<String^>^arr=gcnew array<String^>(10000);
array<String^>^sig=gcnew array<String^>(31);
FileStream^signos=gcnew FileStream("palabras",FileMode::Open,FileAccess::Read);
StreamReader^lector=gcnew StreamReader(signos);
int auxsig=0;
while(lector->Peek()>-1){
sig[auxsig]=lector->ReadLine();
auxsig++;
}
signos->Close();
FileStream^fl=gcnew FileStream(nomarc,FileMode::Open,FileAccess::Read);
StreamReader^lec=gcnew StreamReader(fl);
int j=0;
while(lec->Peek()>-1){
String^cad=lec->ReadLine();
String^comentario="";
String^pal="";
bool agregado=false;
for(int i=0;i<cad->Length;i++)
{
String^carac=cad->Substring(i,1);
bool unodos=false;
for(int temp=0;temp<31;temp++){
if(carac==sig[temp]){
agregado=true;
String^sigdoble="";
if(i<cad->Length-1){
sigdoble=cad->Substring(i,2);
}
for(int x=0;x<31;x++){
if(sigdoble==sig[x]){
arr[j]=pal;
j++;
arr[j]=sigdoble;
j++;
pal="";
unodos=true;
i++;
carac="";
break;
}
}
if(unodos==false){
arr[j]=pal;
j++;
arr[j]=carac;
j++;
pal="";
carac="";
}
break;
}
}
if(carac==" "){
arr[j]=pal;
j++;
pal="";
}
else{
if(carac!=" "){
pal=String::Concat(pal,carac);
agregado=true;
}
}
}
arr[j]=pal;
j++;
pal="";
}
int index=0;
for(int i=0;i<10000;i++){
if(arr[i]=="" || arr[i]==nullptr){
}
else{
fijo[index++]=arr[i];
}
}
lec->Close();
fl->Close();
return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Extracción y clasificación de palabras y símbolos desde un archivo de texto

Publicado por Alejandro (265 intervenciones) el 05/02/2024 19:48:30
¡Hola Gaby! Veo que estás trabajando en un programa en C++/CLI que lee un archivo de texto y extrae palabras y símbolos. Para ayudarte a mejorar el código y cumplir con tu solicitud, primero quiero señalar algunas observaciones y sugerencias:

1. Parece que estás leyendo palabras y símbolos de un archivo de texto y almacenándolos en el array `fijo`. Sin embargo, no estás imprimiendo ni mostrando esos resultados.

2. En tu código, estás leyendo palabras y símbolos, pero no estás distinguiendo entre símbolos terminales y no terminales.

3. Podrías beneficiarte de utilizar la clase `List<>` en lugar de un array fijo, ya que te permite manejar un tamaño dinámico sin preocuparte por su límite superior.

4. Considera dividir tu código en funciones más pequeñas para mejorar la legibilidad y mantenibilidad.

5. Asegúrate de cerrar tus archivos correctamente utilizando bloques `try` y `finally` o utilizando la instrucción `using`.

Basándome en tus necesidades, he realizado algunas modificaciones en tu código para mostrar las palabras y símbolos extraídos. Además, he añadido una pequeña lógica para distinguir entre palabras reservadas y símbolos. Revisa el código a continuación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace System;
using namespace System::IO;
 
void MostrarPalabrasYSimbolos(array<String^>^ palabrasYSimbolos) {
    for (int i = 0; i < palabrasYSimbolos->Length; i++) {
        if (palabrasYSimbolos[i] != "" && palabrasYSimbolos[i] != nullptr) {
            Console::WriteLine(palabrasYSimbolos[i]);
        }
    }
}
 
void ProcesarArchivo(String^ nombreArchivo) {
    array<String^>^ palabrasYSimbolos = gcnew array<String^>(10000);
    array<String^>^ palabrasReservadas = gcnew array<String^>{"int", "string", "while", ";"};
 
    FileStream^ archivo = nullptr;
    StreamReader^ lector = nullptr;
 
    try {
        archivo = gcnew FileStream(nombreArchivo, FileMode::Open, FileAccess::Read);
        lector = gcnew StreamReader(archivo);
 
        int index = 0;
        while (lector->Peek() > -1) {
            String^ linea = lector->ReadLine();
            // Aquí puedes adaptar tu lógica para identificar palabras y símbolos terminales/no terminales
            // ...
 
            palabrasYSimbolos[index++] = linea;
        }
 
        MostrarPalabrasYSimbolos(palabrasYSimbolos);
    } catch (Exception^ ex) {
        Console::WriteLine("Error: " + ex->Message);
    } finally {
        if (lector != nullptr) {
            lector->Close();
        }
        if (archivo != nullptr) {
            archivo->Close();
        }
    }
}
 
int main(array<System::String ^> ^args) {
    Console::WriteLine("Ingrese el nombre del archivo:");
    String^ nombreArchivo = Console::ReadLine();
 
    ProcesarArchivo(nombreArchivo);
 
    return 0;
}

Espero que estas sugerencias y modificaciones te ayuden a avanzar con tu programa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar