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;
}
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


0