Pascalを動かしてみた。
先日の飲み会でid:amachangに構文解析について説明できなかったので、構文解析の復習をするためにPascalを動かしてみた。Pascalの文法はLL(1)文法で、これはプログラム全体の形が定められている下向き構文解析を行う文法。今はほとんどのプログラミング言語が自由度の高いLALR(1)などの文法を採用している。Pascalで用いられているLL(1)文法は簡単に解析を行える代わりに文法の制限がきつくて、C言語のような自由度が少ない。そんなPascalを実際に動かしてみたよ、という話し。
パスカルの処理系にはFree Pascal Copilerを選択。Windows/ThinkPadのcoLinuxで動かしてるFedora6で
# yum install fpc.i386
としてインストール完了。
サンプルプログラムは
program hello; const n : integer = 3; m : integer = 4; begin WriteLn('n=', n, 'M*n=', n+m*n); end.
で、コンパイルして実行
LOCALHOST /home/suzuki/pascal% fpc hello.pas Free Pascal Compiler version 2.0.4 [2006/09/16] for i386 Copyright (c) 1993-2006 by Florian Klaempfl Target OS: Linux for i386 Compiling hello.pas Linking hello 6 Lines compiled, 0.1 sec LOCALHOST /home/suzuki/pascal% ./hello n=3M*n=15
まぁ、特に問題もなく動いた。WikipediaによるとPascalはその簡潔な文法のために1回の捜査でコンパイルを行うことができるので高速らしい。コンパイル時にそれにかかった時間を表示させているのはそれを誇示するためか。
Pascalのサンプルはここから持ってきた。上のページをみるとやはり文法の制限がきついことがわかる。どこかで似たような文法を見たと思ったらVHDLに似ている。
さて、LL(1)なのだから最左導出をして、n+m*nが(n+m)*nになるんじゃないかと思っていたのだが、そうでもないようだ。演算子による優先順位はしっかり設定できている様子。なぜだ?