1.词法与文法分析程序功能: 主要语句:begin<语句串>end
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“成功”,否则输出“错误”。
2.符号与种别码对照表:
| 单词符号 | 种别码 | 单词符号 | 种别码 | 
| begin | 1 | : | 17 | 
| if | 2 | := | 18 | 
| then | 3 | < | 20 | 
| while | 4 | <= | 21 | 
| do | 5 | <> | 22 | 
| end | 6 | > | 23 | 
| l(l|d)* | 10 | >= | 24 | 
| dd* | 11 | = | 25 | 
| + | 13 | ; | 26 | 
| - | 14 | ( | 27 | 
| * | 15 | ) | 28 | 
| / | 16 | # | 0 | 
3.文法描述词法规则:
源程序及运行结果:
#include <stdio.h> 
#include <string.h>  
char prog[100],token[8],ch; 
char *rwtab[6]={"begin","if","then","while","do","end"}; 
int syn,p,m,n,sum; 
int kk; 
 
void factor(void); 
void expression(void); 
void yucu(void); 
void term(void); 
void statement(void); 
void lrparser(void); 
void scaner(void); 
 
 
int main(void) 
{ 
    p=kk=0; 
    printf("\n请输入一串字符串,以#结束: \n"); 
 
    do 
    { 
        scanf("%c",&ch); 
        prog[p++]=ch; 
    }while(ch!=‘#‘); 
 
    p=0; 
    scaner(); 
    lrparser(); 
    //getch();用户获得字符串 
} 
 
void lrparser(void) 
{ 
    if(syn==1) 
    {  
        scaner();       /*读下一个单词符号*/ 
        yucu();     /*调用yucu()函数;*/ 
 
        if(syn==6) 
        { 
            scaner(); 
            if((syn==0)&&(kk==0)) 
            printf("成功!\n"); 
        } 
        else 
        { 
            if(kk!=1) printf("这条字符串无法结束!\n"); 
            kk=1; 
        } 
    } 
    else 
    {  
        printf("无法开始!\n"); 
        kk=1; 
    } 
     
    return; 
} 
 
void yucu(void) 
{  
    statement();         /*调用函数statement();*/ 
 
    while(syn==26) 
    { 
        scaner();          /*读下一个单词符号*/ 
        if(syn!=6)  
            statement();         /*调用函数statement();*/ 
    }  
     
    return; 
} 
 
void statement(void) 
{ 
    if(syn==10) 
    { 
        scaner();        /*读下一个单词符号*/ 
        if(syn==18) 
        { 
            scaner();      /*读下一个单词符号*/ 
            expression();      /*调用函数statement();*/ 
        } 
        else 
        { 
            printf("符号 ‘:=‘ 是错的!\n"); 
            kk=1; 
        } 
    } 
    else 
    {  
        printf("错误的句子!\n"); 
        kk=1; 
    } 
     
    return; 
} 
 
void expression(void) 
{ 
    term(); 
 
    while((syn==13)||(syn==14)) 
    { 
        scaner();             /*读下一个单词符号*/ 
        term();               /*调用函数term();*/ 
    } 
     
    return; 
} 
 
void term(void) 
{  
    factor(); 
 
    while((syn==15)||(syn==16)) 
    {  
        scaner();             /*读下一个单词符号*/ 
        factor();              /*调用函数factor(); */ 
    } 
     
    return; 
} 
 
void factor(void) 
{  
    if((syn==10)||(syn==11)) 
    { 
        scaner(); 
    } 
    else if(syn==27) 
    {  
        scaner();           /*读下一个单词符号*/ 
        expression();        /*调用函数statement();*/ 
 
        if(syn==28) 
        { 
            scaner();          /*读下一个单词符号*/ 
        } 
        else  
        { 
            printf("错误在‘(‘\n"); 
            kk=1; 
        } 
    } 
    else 
    {  
        printf("句子语法错误!\n"); 
        kk=1; 
    } 
     
    return; 
} 
void scaner(void) 
{ 
    sum=0; 
 
    for(m=0;m<8;m++) 
        token[m++]=NULL; 
     
    m=0; 
    ch=prog[p++]; 
     
    while(ch==‘ ‘) 
        ch=prog[p++]; 
     
    if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))) 
    {  
        while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘))) 
        { 
            token[m++]=ch; 
            ch=prog[p++]; 
        } 
        p--; 
        syn=10; 
        token[m++]=‘\0‘; 
        for(n=0;n<6;n++) 
        if(strcmp(token,rwtab[n])==0) 
        { 
            syn=n+1; 
            break; 
        } 
    } 
    else if((ch>=‘0‘)&&(ch<=‘9‘)) 
    { 
        while((ch>=‘0‘)&&(ch<=‘9‘)) 
        {  
            sum=sum*10+ch-‘0‘; 
            ch=prog[p++]; 
        } 
        p--; 
        syn=11; 
    } 
    else 
    switch(ch) 
    { 
        case ‘<‘: 
            m=0; 
            ch=prog[p++]; 
            if(ch==‘>‘) 
            {  
                syn=21; 
            } 
            else if(ch==‘=‘) 
            {  
                syn=22; 
            } 
            else 
            {  
                syn=20; 
                p--; 
            } 
        break; 
         
        case ‘>‘: 
            m=0; 
            ch=prog[p++]; 
            if(ch==‘=‘) 
            {  
                syn=24; 
            } 
            else 
            { 
                syn=23; 
                p--; 
            } 
        break; 
         
        case ‘:‘: 
            m=0; 
            ch=prog[p++]; 
            if(ch==‘=‘) 
            { 
                syn=18; 
            } 
            else 
            { 
                syn=17; 
                p--; 
            } 
            break; 
             
        case ‘+‘: 
            syn=13; 
        break; 
         
        case ‘-‘:  
            syn=14; 
        break; 
         
        case ‘*‘: 
            syn=15; 
        break; 
         
        case ‘/‘:  
            syn=16; 
        break; 
         
        case ‘(‘:  
            syn=27; 
        break; 
         
        case ‘)‘:  
            syn=28; 
        break; 
         
        case ‘=‘: 
            syn=25; 
        break; 
         
        case ‘;‘:  
            syn=26; 
        break; 
         
        case ‘#‘: 
            syn=0; 
        break; 
         
        default: 
            syn=-1; 
        break; 
    } 
} 

原文:http://www.cnblogs.com/whr7116365/p/5924031.html