やっほー
lexファイルの文法の読み方を解説!地獄の電卓作成編【4】

lexファイルの文法の読み方を解説!地獄の電卓作成編【4】

  • 2020年2月8日
  • 2021年3月29日
  • Zero
  • ,
  • 52view
地獄の電卓作成編!開幕!

前回は「yacc」と「lex」についてお話ししましたが、実践しないとわけ分からんので実際に手を動かしていきます。

プログラミング言語を作るにあたり、まずは電卓を作ってみて、その後本格的に言語作成に入ります。

前回の記事はこちら!

前回はプログラミング言語を作成するための環境を構築しました。 [sitecard subtitle=前回の記事はこちら! url=https://traveler0401.com/zero-2/ target=blank] &n[…]

yacc&lexって何?プログラミング言語の解析手順についても

電卓作成に向けてやること

電卓作成に向けて、少なくとも「lexファイル」と「yaccファイル」は何となく理解しておかないと前に進めません。

ということで今回は、lexファイルについて詳しく見ていきます

lexファイルに記載するべきこと

lex(今回はflexを使用)はレキシカルアナライザを生成するツールです。

レキシカルアナライザは字句解析を行なう(トークンに分割する)ので、lexファイルにはトークンの定義を記載します。

今回は電卓を作成するので、具体的には、

  • +,-などの演算子
  • 1などの整数
  • 1.2などの実数
  • 改行

などについて一つ一つ定義していきます。

lexファイルってどんな感じ?

電卓作成に用いるlexファイルはこんな感じです。

 

今回はファイル名を「calculator.l」としました。

lexファイルは拡張子が「l」です。

lexファイルの区分け

lexファイルは大きく3つに分けられます。

1~11行目 定義部。
主に、スタート状態の定義などを行う。
12~28行目 規則部。
正規表現によってトークンを表現している。
29~ ユーザコード部。
C言語のコードを記載することができる。※今回は記載なし。

上記の区分けを頭に入れた上で、実際にファイルの内容を見ていきます。

lexファイルの読み方

定義部

2~10行目の記載はC言語のプログラムとなっています。

つまり、上記の部分はレキシカルアナライザにそのまま出力されます。

y.tab.h」は後で出てくるyaccで自動生成されるヘッダファイルになりますが、今は特に気にせず進みます。

yywrap」という関数も今は気にせず、「こういうものだ」と解釈して進みましょう。

規則部

15~30行目の記述です。

 

この記載は、「+」というトークンが来たら、「return ADD;」というアクションを返す、という意味になります。

アクションの部分はC言語で記載されています。
また、ADDは「y.tab.h」で定義されるマクロとなります。

 

20~25行目はdouble型の規則を記載しています。

正規表現を使っていますが、要約すると

  • 1~9が1文字あり、かつ0~9が0文字以上
  • 0
  • 0~9が1文字以上あり、かつ「.」、かつ0~9が1文字以上

となります。

 

26行目は空白文字、もしくはタブ文字の場合は何もアクションをしない、という意味です。

 

.」は任意の1文字を意味するので、15~26行目でどれにもマッチしなかった文字が上記に該当し、エラーとなります。

おすすめ本

これおすすめやで。

まとめ

一つ一つ理解していくと少しずつ分かってきますが、C言語が絡むので、ある程度は読めないと今後苦戦しそうですね。

ではさいなら。

次回の記事はこちら!

なんか、すごい、色々書くのが面倒だったのでファイルの記載のみ。すみません。。 %{ #include <stdio.h> #include <stdlib.h> #define YYDEBUG 1 %} […]

yaccファイル!地獄の電卓作成編【5】
lexファイルの文法の読み方を解説!地獄の電卓作成編【4】
フォローしてもらえると泣いて喜びます