一个简单的语法制导翻译器

本文介绍了一个逐步完善的中缀表达式转后缀表达式的翻译器实现过程,从基本加减运算开始,逐步增加了对数字、括号及乘除的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚刚开始学习编译原理,重新开始写一个翻译器,从最简单的开始写一个最简单的例子,将中缀表达式改写成后缀表达式(单个数字)

#include<stdio.h>

char lookhead;
int main()
{
    void term();
    lookhead=getchar();
    term();
    while(1)
    {
        if(lookhead == '+')
        {
            lookhead=getchar();
            term();
            putchar('+');
        }
        if(lookhead == '-')
        {
            lookhead=getchar();
            term();
            putchar('-');
        }
    }
    
return 0;    
}

void term()
{
    if(lookhead>='0'&&lookhead<='9')
    {
        putchar(lookhead);
        lookhead=getchar();
    }
    else
    {
        printf("error");
    }
}

 改进版

#include<stdio.h>

char lookhead;
int main()
{
    char myget();
    void term();
    void rest();
    lookhead=myget();
    term();
    rest();
return 0;    
}

char myget()
{
    char mylook;
    mylook = getchar();
    for(;;mylook = getchar())
    {
        if(mylook ==' '||mylook =='\t')
        {
            ;
        }
        else
        {
            return mylook;
        }
    }
    
}

void rest()
{
    while(1)
    {
        if(lookhead == '+')
        {
            lookhead=myget();
            term();
            putchar('+');
            putchar(' ');
            continue;
        }
        if(lookhead == '-')
        {
            lookhead=myget();
            term();
            putchar('-');
            putchar(' ');
            continue;
        }

    }
}
void term()
{
    int n;
    if(lookhead>='0' && lookhead<='9')
    {
        n=0;
        do
        {
            n = n*10 + lookhead - '0';
            lookhead=myget();
        }while(lookhead >= '0' && lookhead<='9');
        printf("%d ",n);
    }
    else
    {
        printf("error");
    }
}

 改进版2(加入括号和乘除)

#include<stdio.h>

char lookhead;
int main()
{
    char myget();
    void term();
    void factor();
    void expr();
    lookhead=myget();
    factor();
    term();
    expr();
return 0;    
}

char myget()
{
    char mylook;
    mylook = getchar();
    for(;;mylook = getchar())
    {
        if(mylook ==' '||mylook =='\t')
        {
            ;
        }
        else
        {
            return mylook;
        }
    }
    
}

void expr()
{
    
    
        if(lookhead == '+')
        {
            lookhead=myget();
            expr();

            term();
            putchar('+');
            putchar(' ');
        }
        if(lookhead == '-')
        {
            lookhead=myget();
            expr();

            term();
            putchar('-');
            putchar(' ');
        }
        term();

    
}
void term()
{
    
    
        if(lookhead == '*')
        {
            lookhead=myget();
            term();
            putchar('*');
            putchar(' ');
            factor();
        }
        if(lookhead == '/')
        {
            lookhead=myget();
            term();
            putchar('/');
            putchar(' ');
            factor();
        }
        factor();

    

}
void factor()
{
    int n;
    if(lookhead>='0' && lookhead<='9')
    {
        n=0;
        do
        {
            n = n*10 + lookhead - '0';
            lookhead=myget();
        }while(lookhead >= '0' && lookhead<='9');
        printf("%d ",n);
    }
    if(lookhead == '(')
    {
        lookhead =myget();
        do
        {
            expr();

        }while(lookhead != ')');
        lookhead =myget();
    }
}

 

转载于:https://www.cnblogs.com/lovehyy/articles/3568098.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值