0

我已经在 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++ 实现实现为解析器。谢谢你。

4

2 回答 2

2

首先,这不是真正的 C++。<iostream.h>从来没有成为 C++ 标准的一部分,因此已经过时了至少 15 年。除了这一cout部分,没有剩下的 C++ 了。程序方法、使用固定的 char 数组而不是动态的 reziable字符串、包含的标头和缺少使程序的其余部分成为纯 C 代码。

要解析来自文件而不是控制台的输入,只需打开相应的filestream,从那里获取输入并解析它。您可能希望首先重构您的程序,例如使用字符串而不是容易出错的char[],可能会抛出异常而不是在出现错误时退出应用程序,然后将解析器逻辑包装到一个中。

我在那里突出显示了一些单词,阅读您的代码,我认为您可能不熟悉这些单词。在您选择的 C++ 教科书中查找它们。如果您想创建更复杂的程序,它将对您有很大帮助。

于 2013-04-26T06:36:11.623 回答
1

像这样的东西

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

似乎比您已经编写的代码更容易。

于 2013-04-26T06:32:21.203 回答