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

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

#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();
    }
}

 

posted @ 2014-02-25 23:24  hcs2024  阅读(231)  评论(0编辑  收藏  举报