Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include <unordered_set>
- using namespace std;
- unordered_set<string> keywords = {
- "procedure",
- "Real",
- "var",
- "String",
- "begin",
- "if",
- "then",
- "else",
- "Delete",
- "End",
- };
- unordered_set<string> delims = {
- ",",
- "+",
- ":",
- ")",
- "(",
- ";",
- "[",
- "]",
- "<",
- ">",
- "'",
- };
- enum type
- {
- keyword,
- delim,
- delim2,
- ident,
- number,
- str,
- error,
- };
- struct Lexem {
- Lexem(const string &value, type type)
- : value(value)
- , type(type)
- {}
- string value;
- type type;
- };
- int main()
- {
- vector<Lexem> lexems;
- fstream f("C:\\Users\\Rihards\\Desktop\\compiler\\comp.txt", ios::in);
- // ios::in File open for reading
- string temp;
- //if (kappa[i]=='\0');
- int linecount = 1;
- while (!f.eof())
- {
- while (isspace(f.peek()))
- {
- if (f.peek() == '\n')
- linecount++;
- f.get();
- }
- if (isalpha(f.peek()))
- {
- do {
- temp += f.get();
- } while (isalpha(f.peek()));
- type t = ident;
- if (keywords.find(temp) != keywords.end()) {
- t = keyword;
- }
- lexems.push_back(Lexem(temp, t));
- }
- else if (isdigit(f.peek()))
- {
- do {
- temp += f.get();
- } while (isdigit(f.peek()));
- lexems.push_back(Lexem(temp, number));
- }
- else //массив делимторов
- {
- if (f.peek() == ':')
- {
- type t = delim;
- temp += f.get();
- if (f.peek() == '=') {
- temp += f.get();
- t = delim2;
- }
- lexems.push_back(Lexem(temp, t));
- }
- else if (f.peek() == '<')
- {
- type t = delim;
- temp += f.get();
- if (f.peek() == '>') {
- temp += f.get();
- t = delim2;
- }
- lexems.push_back(Lexem(temp, t));
- }
- else if (f.peek() == '\'')
- {
- lexems.push_back(Lexem("'", delim));
- f.get();
- while (f.peek() != '\'')
- {
- temp += f.get();
- }
- lexems.push_back(Lexem(temp, str));
- lexems.push_back(Lexem("'", delim));
- f.get();
- }
- else
- {
- type t = error;
- temp += f.get();
- if (delims.find(temp) != delims.end()) {
- t = delim;
- }
- lexems.push_back(Lexem(temp, t));
- }
- }
- temp.clear();
- }
- for (int i = 0; i < lexems.size(); i++) {
- cout << lexems[i].type << '\t' << lexems[i].value << endl;
- }
- cout << "0=keywords, 1=delimiters, 2=double delimiters, 3=identificator, 4=constants, 5=strings, 6=errors"<<endl;
- f.close(); //закрывать файловую переменную. файл нам еще пригодится!
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement