de base de l'analyseur lexical qui lit un fichier texte en entrée et écrit tous les “jetons” pour un fichier de sortie ligne par ligne
writing a very basic lexical analyzer in standard
C++ (std usage is allowed) that reads a text file
as input and writes all the "tokens" to an output
file line by line
● All items that are separated by white space are
tokens
● White space includes
● Space(s)
● Newlines
● Tabs
Input file having this
if (x > 50)
x=0
Output file should be like this
if
(
x
>
50
)
x
=
0
Edit 3
Ok, donc im presque là, j'ai fait un fichier d'entrée qui prend tout ce qui y est écrit et puis tokenizes et montre sur l'écran. un fichier de sortie est généré bt quand il montre cette sortie de Sortie de jetons 0033F8C8 je pense que sa l'adresse du tableau. maintenant, tout ce que je dois faire est de stocker le résultat soit affiché sur l'écran doit aller dans le fichier texte de sortie et sur l'écran, il doit imprimer voir votre fichier de sortie de vos données sont segmentées.
code edit 3
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using std::ifstream;
#include <cstring>
using namespace std;
const int MAX_CHARS_PER_LINE = 512;
const int MAX_TOKENS_PER_LINE = 20;
const char* const DELIMITER = " ";
int main()
{
//create a file-reading object
ifstream infile;
infile.open("input.txt"); //open a file
if (!infile.good())
return 1; //exit if file not found
ofstream outfile;
outfile.open("output.txt");
if (!outfile)
{
cout << "error opening fiLe";
}
//read each line of the file
while (!infile.eof())
{
//read an entire line into memory
char buf[MAX_CHARS_PER_LINE];
infile.getline(buf, MAX_CHARS_PER_LINE);
//parse the line into blank-delimited tokens
int n = 0; //a for-loop index
//array to store memory addresses of the tokens in buf
const char* token[MAX_TOKENS_PER_LINE] = {}; //initialize to 0
//parse the line
token[0] = strtok(buf, DELIMITER); //first token
if (token[0]) //zero if line is blank
{
for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
{
token[n] = strtok(0, DELIMITER); //subsequent tokens
if (!token[n]) break; //no more tokens
}
}
//process (print) the tokens
for (int i = 0; i < n; i++) //n = #of tokens
cout << "Token[" << i << "] = " << token[i] << endl;
cout << endl;
outfile<< "Output tokens" <<token;
infile.close();
outfile.close();
}
system("pause");
return 0;
}
- Ajouter un peu de code, de sorte que nous pouvons vous aider lorsque vous êtes coincé.
- utilisation
strtok
ouregular expression
strtok
est mal, il modifie le C chaîne de Style qui lui est passé.- Merci beaucoup @ThomasMatthews ; tout ce que j'écris dans le fichier d'entrée simplifie par la conversion en jetons, en dehors de dire qu'il soit il s'agit d'un opérateur ou d'un identificateur ou quoi que ce soit d'autre. je veux lier un fichier à ouvrir, convertir les espaces en tabulations et des espaces en jetons, puis enregistrez la nouvelle sortie dans l'autre fichier texte
- Si vous pensez que ma réponse est utile, veuillez cliquer sur la case à cocher.
- Voulez-vous écrire le programme ou vous voulez quelqu'un pour l'écrire?
- pourriez-vous s'il vous plaît regardez mon edit 3 et le nouveau code que j'ai fait!
Vous devez vous connecter pour publier un commentaire.
Depuis que vous avez marquées à votre question, comme C++, je recommande d'utiliser le langage C++ fonctions car ils sont plus sûrs (moins de défauts injecté) que C.
Par exemple, remplacer
char *
avecstd::string
. Lestd::string
a plus de fonctionnalités pour lexing ou à la recherche de C-Style de fonctions de chaîne (str*()
).Pour vos projets, je ne recommande pas d'utiliser des expressions régulières. En le faisant travailler correctement, il peut vous prendre plus de temps que de mettre en œuvre un simple analyseur lexical.
Edit 1
Pour plus d'aide, veuillez modifier votre question avec les règles de syntaxe de la langue de l'analyse.
Une technique simple consiste à isoler des "mots" ou identificateurs de symboles.
Également lire sur Backus-Naur notation
Votre question est trop compliquée (en grand format) pour répondre à StackOverflow.
Edit 2 - Exemple
Vous devrez compléter le code ci-dessus pour chercher des symboles et des chiffres.