たなしょのメモ

日々勉強していることをつらつらと

Cコンパイラを作る

このサイトがめちゃくちゃ面白くて作ってみようと思い作ってみることにしました。

www.sigbus.info

少しずつ初めてトークナイザを導入するところまできたのでここからブログを書いていこいうと思います。

 

構造体

 typedef struct {
   int ty;      // トークンの型
   int val;     // tyがTK_NUMの場合、その数値
   char *input; // トークン文字列(エラーメッセージ用)
 } Token;

久しぶりに構造体を使うので完全に忘れてたのでサンプルプログラムでも書いて勉強しますか。

#include <stdio.h>
#include <string.h>

struct sample {
int num;
char name[30];
};

typedef struct sample sample_data;

void main() {
sample_data smp = {
{1, "テスト1"},
{2, "テスト2"},
{3, "テスト3"},
{4, "テスト4"}
};


for (int i = 0; i < 4; i++) {
printf("番号:%d テスト名:%s\n", smp[i].num, smp[i].name);
}

}

 ある程度思い出してきました。

sampleという構造体を作成して、中身はint型のnumとchar型の配列name。

typedefで構造体名を変更してsample_dataという名前に変更します。

smaple_data smpで再定義した構造体にデータを定義します。

出力すると、

番号:1 テスト名:テスト1
番号:2 テスト名:テスト2
番号:3 テスト名:テスト3
番号:4 テスト名:テスト4 

 smp[0].num は1、smp[0].nameはテスト1が出力されます。あとは順番に出力されるイメージです。

isspace

isspaceは文字が標準空白文字かを判定する関数。

標準空白文字だとtrueを返す。

サンプルプログラムにすると。

#include <stdio.h>
#include <ctype.h>

void main() {
char *p;

p = "t e s t ";

for (int i = 0; i < sizeof(p) / sizeof(p[0]); i++) {
if (isspace(p[i])) {
printf("空白です\n");
} else {
printf("%c\n", p[i]);
}
}
}

 出力は下記

t
空白です
e
空白です
s
空白です
t
空白です 

 まだわからない関数もあるし明日もメモ。