regex — c ++ с использованием итерационной функции для компилятора

Поэтому я пытался создать небольшой лексический сканер, который разбивал бы текст на части и определял тип каждого токена. На выходе должен быть текстовый файл с номером строки токена & токен, введите в каждой строке. Если токен не принят каким-либо RE, он должен сообщить о значимой ошибке, показывающей номер строки токена, токен и ошибку. Я использовал библиотеку regexp в C ++, и теперь я пытаюсь включить функцию итератора в приведенный ниже код, но я не знал, как использовать ее здесь.

#include <iostream>
#include <string>
#include <regex>
#include <sstream>
#include <fstream>
using namespace std;

int main()
{
ofstream myfile;
myfile.open("mytext1.txt");
myfile << " int 33.2 + bla 059 3 " << endl;
myfile << " void nn + fbla 09 3 " << endl;
myfile << " int float + bsla 09 3.2 " << endl;
myfile.close();

string s;
regex keywords("int|if|else|while|float|return|void|breack|for");
regex id("[[:alpha:]]+[[:d:]]*[[:alpha:]]*", regex_constants::icase);
regex  integer("[[:d:]]+");
regex  floatt("[[:d:]]+[.]+[[:d:]]+");
regex symbolls("[&&]|[||]|[<=]|[>=]|[==]|[<]|[>]|[!=]|[=]|[(]|[)]|[{]|[}]|[;]|[,]|[.]|[+]|[-]|[*]|[/]|[/*]|[*/]");
regex comment("//[[:w:]]*");
ifstream myfile2("mytext1.txt");

//int linenum= 1;
if (myfile2.is_open())
{
while (getline(myfile2, s, ' '))
{
cout << s << ",";
//cout <<linenum<< s << ",";

bool match = regex_match(s, floatt);
if (match) cout << "float number" << endl;
match = regex_match(s, integer);
if (match)cout << "integer number" << endl;
match = regex_match(s, keywords);
if (match){ cout << "keywords" << endl; goto a;
}
match = regex_match(s, id);
if (match)cout << "identifer" << endl;
a:  match = regex_match(s, comment);
if (match)cout << "comment" << endl;
match = regex_match(s, symbolls);
if (match)cout << "symbolls" << endl;}

} myfile2.close();

system("pause");
return 0;
}

0

Решение

символы регулярное выражение не делает то, что вы думаете, что делает.

Проблемы:
Метачары как литералы нужно избегать.
— Классы символов без квантификаторов соответствуют только одному символу.
— Чередования чередуются слева направо (например, a|aw будет соответствовать только совпадению aмы).
Исправление состоит в том, чтобы поставить самый длинный первым aw|a,

Полезный совет: избегайте использования posix, если это не нужно.

Насколько функция regex_match()в C ++ для этого обычно требуется регулярное выражение, чтобы соответствовать всей строке.
Чтобы найти подстроки, используйте regex_search(),

Как правило, написать синтаксический анализатор довольно сложно, так как каждый символ должен анализироваться последовательно. На любом этапе каждый токен должен переводить логику в состояние, которое должно принимать только определенные символы или другие токены.

В любом случае, удачи.
Ниже приведено несколько регулярных выражений вашего оригинала.

  keywords  "int|if|else|while|float|return|void|breack|for"-----------
int
|  if
|  else
|  while
|  float
|  return
|  void
|  breack
|  for

id  "[a-zA-Z]+[0-9]*[a-zA-Z]*"-----------
[a-zA-Z]+ [0-9]* [a-zA-Z]*

integer  "[0-9]+"-----------
[0-9]+

floatt  "[0-9]+[.]+[0-9]+"-----------
[0-9]+ [.]+ [0-9]+

symbols  "[&]{2}|[|]{2}|<=|>=|[=]{2}|!=|/\\*|\\*/|[<>(){};,.+*/=-]"-----------
[&]{2}
|  [|]{2}
|  <=
|  >=
|  [=]{2}
|  !=
|  /\*
|  \*/
|  [<>(){};,.+*/=-]comment
-----------
// [a-zA-Z0-9_]*
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]