编译原理(第三版)词法分析器

Posted --lr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理(第三版)词法分析器相关的知识,希望对你有一定的参考价值。

/*
    begin x:=9; if x > 0 then x:= 2*x+1/3; end #
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _KEY_WORD_END "waiting for your expanding"
typedef struct
{
    int typenum;
    char *word;
}WORD;
char input[255];
char token[255]="";
int p_input;
int p_token;
char ch;
char* rwtab[] = {"begin","if","then","while","do","end",_KEY_WORD_END};
WORD * scaner();

int main()
{
    int over = 1;
    WORD* oneword = new WORD;
    printf("Enter Your words(end with #):");
    scanf("%[^#]s",input);
    p_input = 0;
    printf("Your words:\n%s\n",input);
    while(over < 1000 &&over !=-1)
    {
        oneword = scaner();
        if(oneword->typenum <1000)
            printf("(%d,%s)\n",oneword->typenum,oneword->word);
        over = oneword->typenum;
    }
    printf("\npress # to exit:");
    scanf("%[^#]s",input);
    return 0;
}
char m_getch()
{
    ch = input[p_input];
    p_input = p_input+1;
    return(ch);
}
void getbc()
{
    while(ch ==  ||ch == 10)
    {
        ch = input[p_input];
        p_input++;
    }
}
void concat()
{
    token[p_token] = ch;
    p_token++;
    token[p_token] = \0;
}
int letter()
{
    if((ch >= a&& ch <= z)|| (ch >=A&&ch <= Z))
        return 1;
    else
        return 0;
}
int digit()
{
    if(ch >= 0&&ch <=9)return 1;
    else return 0;
}
int reserve()
{
    int i = 0;
    while(strcmp(rwtab[i],_KEY_WORD_END))
    {
        if(!strcmp(rwtab[i],token))
            return i+1;
        i++;
    }
    return 10;
}
void retract()
{
    p_input--;
}

char* dtb()
{
    return NULL;
}

WORD* scaner()
{

    WORD* myword = new WORD;
    myword->typenum = 10;
    myword->word = "";
    p_token = 0;
    m_getch();
    getbc();
    if(letter())
    {
        while(letter()||digit())
        {
            concat();
            m_getch();
        }
        retract();
        myword->typenum = reserve();
        myword->word = token;
        return(myword);
    }
    else if(digit())
    {
        while(digit())
        {
            concat();
            m_getch();
        }
        retract();
        myword->typenum = 11;
        myword->word = token;
        return(myword);
    }
    else switch(ch)
    {
        case=:m_getch();
            if(ch == =)
            {
                myword->typenum = 25;
                myword->word = "==";
                return(myword);
            }
            retract();
            myword->typenum = 21;
            myword->word = "=";
            return(myword);
            break;
        case+:
            myword->typenum = 13;
            myword->word = "+";
            return(myword);
            break;
        case-:
            myword->typenum = 14;
            myword->word = "-";
            return(myword);
            break;
        case*:
            myword->typenum = 15;
            myword->word = "*";
            return(myword);
            break;
        case/:
            myword->typenum = 16;
            myword->word = "/";
            return(myword);
            break;
        case(:
            myword->typenum = 27;
            myword->word = "(";
            return(myword);
            break;
        case):
            myword->typenum = 28;
            myword->word = ")";
            return(myword);
            break;
        case[:
            myword->typenum = 28;
            myword->word = "[";
            return(myword);
            break;
        case]:
            myword->typenum = 29;
            myword->word = "]";
            return(myword);
            break;
        case{:
            myword->typenum = 30;
            myword->word = "{";
            return(myword);
            break;
        case}:
            myword->typenum = 31;
            myword->word = "}";
            return(myword);
            break;
        case,:
            myword->typenum = 32;
            myword->word = ",";
            return(myword);
            break;
        case::m_getch();
            if(ch == =)
            {
                myword->typenum = 18;
                myword->word = ":=";
                return(myword);
            }
            retract();
            myword->typenum = 17;
            myword->word = ":";
            return(myword);
            break;
        case;:
            myword->typenum = 26;
            myword->word = ";";
            return(myword);
            break;
        case>:m_getch();
            if(ch == =)
            {
                myword->typenum = 24;
                myword->word = ">=";
                return(myword);
            }
            retract();
            myword->typenum = 23;
            myword->word = ">";
            return(myword);
            break;
        case<:m_getch();
            if(ch == =)
            {
                myword->typenum = 22;
                myword->word = "<=";
                return(myword);
            }
            else if(ch == >)
            {
                myword->typenum = 21;
                myword->word = "<>";
                return(myword);
            }
            retract();
            myword->typenum = 20;
            myword->word = "<";
            return(myword);
            break;
        case!:m_getch();
            if(ch == =)
            {
                myword->typenum = 40;
                myword->word = "!=";
                return(myword);
            }
            retract();
            myword->typenum = -1;
            myword->word = "ERROR";
            return(myword);
            break;
        case#:
            myword->typenum = 0;
            myword->word = "#";
            return(myword);
            break;
        case\0:
            myword->typenum = 1000;
            myword->word = "OVER";
            return(myword);
            break;
        default: myword->typenum = -1;
            myword->word = "ERROR";
            return(myword);
    }
}

 

以上是关于编译原理(第三版)词法分析器的主要内容,如果未能解决你的问题,请参考以下文章

编译原理 实验一 java语言实现对C语言词法分析

编译原理 实验一 java语言实现对C语言词法分析

编译原理习题—LL文法构造预测分析器递归下降分析LRSLRLR分析—陈意云张昱第三版第三章

编译原理 第三章 词法分析(下)

编译原理-第三章 词法分析-3.7 从正则表达式到自动机-从NFA到DFA的转换

编译原理词法分析