一個簡單的EBNF範式的實現

 最近無事
在看書的時候發現了這個東西
剎那間突然覺得大學時候編譯原理書上的的什麼語法分析書、上下文無關等晦澀難懂的概念清晰了許多
今天把它貼出來
希望也能讓你回想起些往事。。。

至於EBNF範式是什麼東西,網上有詳細的介紹,在此就不作贅述。
在這裏,使用EBNF範式來實現一個簡單算術運算的語法描述,然後用C語言實現。

該算術運算要實現的功能:
(1)能夠進行加法、乘法運算,且乘法優先於加法運算
(2)實現'('、')'運算,且其優先級高於乘法運算

使用EBNF範式修改後的簡單整數算術運算的語法描述:
expr-->expr+term|term
term-->term*factor|factor
factor-->(expr)|number
number-->number digit|digit
digit-->0|1|2|3|4|5|6|7|8|9

實現代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int token;      //holds the current input character for the parse
void error(void)
{
         printf("parse error/n");
        exit(1);
}

void getToken(void)
{
        token=getchar();
}

void match(char c)
{
        if(token==c)   getToken();
        else   error();
}

//command-->expr'/n'
void command(void)
{
        int result=expr();
         if(token=='/n')
        printf("The result is :%d/n",result);
        else error();
}

//expr-->term { '+'  term}
int expr(void)
{
        int result=term();
        while(token=='+')
        {
                match('+');
                result+=term();
        }
        return result;
}

//term-->factor { '*' factor}
int term(void)
{
        int result=factor();
        while(token=='*')
        {
                match('*');
                result*=factor();
        }
        return result;
}

//factor-->‘(’ expr ')' | number
int factor(void)
{
        int result;
        if(token=='(')
        {
                match('(');
                result=expr();
                match(')');
        }
        else
                result=number();
        return result;
}

//number-->digit { digit }
int number(void)
{
        int result=digit();
        while(isdigit(token))
        {
        result=10*result+digit();
        }
        return result;
}

//digit-->'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
int digit(void)
{
        int result;
        if(isdigit(token))
        {
                result=token-'0';
                match(token);
        }
        else
                error();
        return result;
}

void parse(void)
{
        getToken();
        command();
}

main()
{
        parse();
        return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章