インタプリタにおける字句解析の基本

インタプリタにおける字句解析の基本

記事
IT・テクノロジー
AA=BB*CD*EF/GHIJ
という文字列を下のように
AA
=
BB
*
CD
*
EF
/
GHIJ
分解するのが字句解析です。
flexを使うのも良いのですが、windows環境だと、
色々と制限が多いため、今回は、自力で字句解析を
行います。

なお、c言語は初級者以上を対象とします。
また、なるべく文字列処理が分かりにくくならないように
コメントと、isalpha,isspace,isdigitは使わないようにしました。
//以下ソースです。
#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<string.h>

#define MAX_STR 2048

#define MAX_NP 256
#define MAX_SP 256
char g_str[MAX_STR];
int g_pnt=0;
char Next()
{
    if(!g_str[g_pnt]) return 0;
    return g_str[g_pnt++];
}
int IsMyDigit(char ch) //文字が数値ならば1を返す
{
    if(ch>='0' && ch<='9')
        return 1;
    else
        return 0;
}
int IsMyAlpha(char ch)//文字がアルファベットならば1を返す
{
    if(ch>='A' && ch<='Z' || ch>='a' && ch<='z')
        return 1;
    else
        return 0;
}
void Lex()
{
    char ch;
    char str[100],str2[100];
    int nf,sf;
    char *p;
    int t;
    int num;
    fgets(str2,sizeof(str2)-1,stdin);
    strcpy(g_str,str2);
    while(ch=Next())
    {
            while(ch==' ')
            {
                printf("[space]:\n");
                ch=Next();//スペースなら取り除く
            }
            t=0;sf=0;
            while(IsMyAlpha(ch))//文字がアルファベットならば
            {
                str[t]=ch;//配列に代入して文字列にする
                t++;
                ch=Next();
                sf=1;
            }
            str[t]='\0';//文字列処理の後処理として'\0'を代入
            if(sf)
                printf("%s[文字列]\n",str);
            //sfが1ならstrを表示
            num=0;nf=0;
            while(IsMyDigit(ch))//数値の文字ならば
            {
                num=(num*10)+(ch-'0');//'1'ならば'1'-'0'で数値にしている
                //1桁ずつ10進数の繰り上がりをしている
                ch=Next();
                nf=1;
            }
            if(nf)
                printf("%d[数値]\n",num);
            if(ch=='+' || ch=='-' || ch=='*' || ch=='/')
            printf("%c[オペランド]\n",ch);
    }
}
int main()
{
    Lex();
    return 0;
}

今回はこんな感じで終わりです。次回のインタプリタ処理を書くとしたら
恐らく構文解析を書くと思います。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す