编译原理实验---语法分析器

对着背影说爱祢 提交于 2019-12-28 01:44:25

编译原理实验—语法分析器

一、算术表达式文法

VN = { E, T, E’, F, T’ }
其中:E为开始符号;
VT = { +, -, , /, (, ), id, num }
其中:id代表标识符,要求是长度不超过10的字母序列;num代表常数,要求是正整数;
文法规则集如下:
E→TE’
E’→+TE’| -TE’ |ε
T→FT’
T’→
FT’| /FT’ |ε
F→(E) | id | num

二、文法中每个非终结符的First集和Follow集

在这里插入图片描述

三、由产生式F→(E) | id | num构造的递归下降分解程序示例:

PROCEDURE F
IF SYM=`id` THEN ADVANCE
ELSE 
IF SYM=`num` THEN ADVANCE
ELSE
IF SYM=`(` THEN
BEGIN
ADVANCE;
E
IF SYM=`)` THEN ADVANCE
ELSE ERROR
END
ELSE ERROR

其中,SYM代表输入串指针所指的符号;ADVANCE代表把输入指针调至下一输入符号。

四、程序代码

#include<iostream>
#include<stdio.h>
#include <cctype>
#include <string.h>
#include <iomanip>
#include<cstdlib>
using namespace std;

char a[100];
string b[100];
static int j=0;
static int p=0;
void E();
void E1();
void T();
void T1();
void F();
bool isnum();
bool isid();
void error();

int main()
{

    int k=0;
    char c;
    c = getchar();
    while (c != '\n')
    {
        a[k]=c;
        k++;
        c = getchar();
    }
    for(int i=0; i<=k; i++) //开始进行数组a[]内字符识别
    {
        switch(a[i])
        {

        case ' ':
            break;

        case '\n':
            break;

        case '\t':
            break;

        case '+':
        {
            b[j]+=a[i];
            j++;
        };
        break;

        case '-':
        {
            b[j]+=a[i];
            j++;
        };
        break;

        case '*':
        {
            b[j]+=a[i];
            j++;
        };
        break;

        case '/':
        {
            b[j]+=a[i];
            j++;
        };
        break;

        case '(': //识别符号(
        {
            b[j]=a[i];
            j++;
        } ;
        break;

        case ')': //识别符号)
        {
            b[j]=a[i];
            j++;
        } ;
        break;

        default:
        {
            if(a[i]>='a'&&a[i]<='z')//识别标识符
            {
                b[j]+=a[i];
                if(a[i+1]<'a'||a[i+1]>'z')
                {
                    j++;
                }
            }

            if(a[i]>='0'&&a[i]<='9')//识别整数
            {
                b[j]+=a[i];

                if(a[i+1]<'0'||a[i+1]>'9')
                {
                    j++;
                }
            }
        };
        break;
        }
    }

    for(int i=0;i<j;i++)
    {
        cout<<b[i];
    }

    E();

    if(p==j)
    {
        cout<<"编译通过!"<<endl;
    }else
    {
        cout<<"编译错误!"<<endl;
    }

    return 0;
}

bool isnum(string s)
{
    int len = s.length();
    for(int i=0; i<len; i++)
    {
        if(!isdigit(s[i]))
        {
            return false;
        }
    }
    return true;
}

bool isid(string s)
{
    int len = s.length();
    for(int i=0; i<len; i++)
    {
        if(!isalpha(s[i]))
        {
            return false;
        }
    }
    return true;
}

void error()
{
    cout<<"错误!"<<endl;
    exit(0);
}

void E()
{
    T();
    E1();
}

void E1()
{
    if(b[p]=="+")
    {
        p++;
        T();
        E1();
    }
    else if(b[p]=="-")
    {
        p++;
        T();
        E1();
    }
}

void T()
{
    F();
    T1();
}

void T1()
{
    if(b[p]=="*")
    {
        p++;
        F();
        T1();
    }
    else if(b[p]=="/")
    {
        p++;
        F();
        T1();
    }
}

void F()
{
    if(isid(b[p]))
    {
        p++;
    }
    else if(isnum(b[p]))
    {
        p++;
    }
    else
    {
        if(b[p]=="(")
        {
            p++;
            E();
            if(b[p]==")")
            {
                p++;
            }
            else
            {
                error();
            }
        }
        else
        {
            error();
        }
    }
}

五、运行结果

在这里插入图片描述
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!