Реализация рекурсивного синтаксического анализатора спуска в C ++, основанная на грамматике EBNF

Я реализовал рекурсивный анализатор спуска в C ++, который основан на грамматике EBNF и ее псевдокоде. Вот код:

#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
char s[100];
int pos=-1,len;

void asignstmt();
void variable();
void expression();
void term();
void primary();
void subscriptlist();
void identifier();
void letter();
void digit();
void error();

void main()
{
clrscr();
cout<<"Enter the String ";
cin>>s;
len=strlen(s);
s[len]='$';
asignstmt();
if (len==pos)
cout<<"string Accepted";
else
cout<<"Strig not Accepted";

getch();
}
void asignstmt()
{
pos++;
cout<<pos<<" "<<s[pos]<<endl;
if(pos<len)
{
variable();

if(s[pos]== '=')
{
pos++;cout<<pos<<" "<<s[pos]<<endl;
expression();
}
else
error();
}
}

void variable()
{
identifier();
if(s[pos]=='[')
{
pos++;cout<<pos<<" "<<s[pos]<<endl;
subscriptlist();
if(s[pos]==']')
pos++;
}
}

void expression()
{
term();
while (s[pos]=='+'  ||   s[pos]=='-')
{
pos++; cout<<pos<<" "<<s[pos]<<endl;
term();
}
}

void term()
{
primary();
while (s[pos]=='*'  ||   s[pos]=='/')
{
pos++; cout<<pos<<" "<<s[pos]<<endl;
primary();
}
}void primary()
{
if ((s[pos]>='A'|| s[pos]>='a') &&(s[pos]<='Z'|| s[pos]<='z'))
variable();
else if ( s[pos]>='0' && s[pos]<='9')
digit();
else if ( s[pos]=='(')
{ pos++;    cout<<pos<<" "<<s[pos]<<endl;
expression();
if(s[pos]==')')
pos++;  cout<<pos<<" "<<s[pos]<<endl;
}
else
error();
}

void subscriptlist()
{
expression();
if(s[pos]==',')
pos++;  cout<<pos<<" "<<s[pos]<<endl;
expression();

}

void identifier()
{
int fl=pos;
letter();
if(pos==fl)
error();
while ( (s[pos]>='A'&& s[pos]<='Z') ||(s[pos]>='a'&& s[pos]<='z')||(s[pos]>='0'&& s[pos]<='9'))
{    letter();
digit();
}
}
void letter()
{
if((s[pos]>='A'&& s[pos]<='Z') ||(s[pos]>='a'&& s[pos]<='z'))
pos++;
cout<<pos<<" "<<s[pos]<<endl;
}

void digit()
{
if(s[pos]>='0' && s[pos]<='9')
pos++;
cout<<pos<<" "<<s[pos]<<endl;
}

void error()
{
cout<<"Error Due to grammar Mismatch"<<endl;
getch();
exit(0);
}

Эта программа просто принимает ввод (ввод будет действительным оператором присваивания без пробелов) от пользователя. Проверяет, правильно ли указан оператор присваивания или нет. Затем печатает сообщение о принятии или отклонении входной строки.

Моя цель этой реализации — создать парсер. У меня есть этот код, который работает / распознает правильный оператор присваивания. Но я не могу реализовать это как синтаксический анализатор, в котором: он будет принимать файл .cpp в качестве аргумента, проверять его посимвольно и проверять, имеет ли он правильный оператор присваивания или нет.

Например, если имя моего анализатора — userParser.cpp, а файл кода пользователя, содержащий оператор присваивания, — sample.cpp, то команда Like: userParser sample.cpp должна выполнить синтаксический анализатор и проверить файл на правильный синтаксис оператора присваивания. Пожалуйста, помогите мне реализовать реализацию c ++ как парсер. Спасибо.

-1

Решение

Прежде всего, это не совсем C ++. <iostream.h> никогда не был частью стандарта C ++ и поэтому устарел как минимум 15 лет. И помимо cout часть, C ++ не осталось. Процедурный подход, использование фиксированного массива char вместо динамического reziable строка, заголовки, которые вы включаете, и отсутствие классы сделайте остальную часть вашей программы чистым C-кодом.

Чтобы разобрать ввод из файла вместо консоли, просто откройте соответствующий FileStream, получить вход оттуда и разобрать его. Возможно, вы захотите сначала немного реорганизовать свою программу, например, используя строка вместо ошибок char[]Может быть, бросить исключение вместо того, чтобы просто выйти из приложения в случае ошибок, а затем обернуть логику парсера в учебный класс.

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

2

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

Что-то вроде этого

#include <fstream.h>
#include <iostream.h>

int main(int argc, char** argv)
{
if (argc != 2)
{
cerr << "Wrong number of arguments\n";
return 1;
}
ifstream file(argv[1]);
file >> s;
...
}

Кажется, проще, чем код, который вы уже написали.

1

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