簡體   English   中英

基於EBNF語法的C ++下降遞歸解析器實現

[英]Descent recursive parser implementation in C++, based on EBNF Grammar

我已經在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 ++實現實現為解析器。 謝謝。

首先,這不是真正的C ++。 <iostream.h>從未成為C ++標准的一部分,因此至少已過時15年。 除了cout之外,沒有C ++了。 程序化方法,使用固定的char數組而不是動態可調整字符串 ,所包含的標頭以及的缺乏使程序的其余部分成為純C代碼。

要從文件而不是從控制台解析輸入,只需打開相應的文件 ,從那里獲取輸入並解析它。 您可能想先重構程序,例如使用字符串而不是容易出錯的char[] ,可能拋出異常而不是在出現錯誤時退出應用程序,然后將解析器邏輯包裝到一個類中

我在那里突出顯示了一些單詞,閱讀您的代碼后,我認為您可能並不熟悉。 在您選擇的C ++教科書中查找它們。 如果要創建更復雜的程序,它將對您有很大幫助。

像這樣

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

似乎比您已經編寫的代碼容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM