lexer.c

来自「C写的语法分析 递归了程序法语法分析 来自龙书」· C语言 代码 · 共 64 行

C
64
字号
#include "global.h"

char lexbuf[BSIZE];
int lineno = 1;
int tokenval = NONE;

int lexan()
{
    int t;
    while(1)
    {
        t = getchar();
        if(t == '\n')
        {
            lineno = lineno + 1;
        }
        else if(isdigit(t))//t是数字
        {
            ungetc(t,stdin);
            scanf("%d",&tokenval);
            return NUM;
        }
        else if(isalpha(t))//t是字母
        {
            int p,b=0;
            while(isalnum(t))
            {
                lexbuf[b] = t;
                t = getchar();
                p = b + 1;
                if(b >= BSIZE)
                {
                    error("compiler error!");
                }
            }
            lexbuf[b] = EOS;
            if(t != EOF)
            {
                ungetc(t,stdin);
            }
            p = lookup(lexbuf);
            if(p == 0)
            {
                p = insert(lexbuf,ID);
            }
            tokenval = p;
            return symtable[p].token;
        }
        else if(t == EOF)
        {
            return DONE;
        }
        else if(t == ' ' || t == '\t')
        {
            ;
        }
        else
        {
            tokenval = NONE;
            return t;
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?