Синтаксический анализатор (ввести формулу и проверить правильность записи) - C (СИ)
Формулировка задачи:
Объясните,как написать эту программу. Ввести формулу и проверить правильность записи. Формула следующего вида:
<формула>::=<цифра>|(<формула><знак><формула>)
<>::=+|-|*
<цифра>::=0|1|2|3|4|5|6|7|8|9
Решение задачи: «Синтаксический анализатор (ввести формулу и проверить правильность записи)»
textual
Листинг программы
#include <string.h>
#include <stdio.h>
using namespace std;
int isDigit(char s)
{
return ((s>='0') && (s<='9'))?1:0;
}
int isOp(char s)
{
return ((s=='+')||(s=='-')||(s=='*'))?1:0;
}
int isFormula(char *f, int beg, int end)
{
int n,i,j,c,k,nbeg;
if ((beg==end) && isDigit(f[beg])) return 1;
if ((isDigit(f[beg]) != 0) && (isOp(f[beg+1]) != 0)) return isFormula(f,(beg+2),end);
if (f[beg]=='(')
{
c=0;
for (i=beg; i<=end; i++)
{
if (f[i]=='(') c++;
if (f[i]==')') c--;
if (c==0)
{
k=i+1;
nbeg=i+2;
break;
}
}
if (c != 0) return 0;
if (k < end)
{
if (isOp(f[k])) return isFormula(f, beg+1,k-2) * isFormula(f,nbeg,end);
}
else
{
return isFormula(f, beg+1,k-2);
}
}
return 0;
}
int main(int argc, char *argv[])
{
char *F="1+2+((3-4)*(6+7))";
int n,p;
n=strlen(F);
p=isFormula(F,0,n-1);
if (p)
printf("%s - is correct formula\n",F);
else
printf("%s - is not correct formula\n",F);
system("PAUSE");
return EXIT_SUCCESS;
}