いきなりですが、今日の記事は科学的でありません。科学風かもしれないという程度のことです。
一般に言語解析では、大雑把に言って構文解析(ここに字句解析も含む)と意味解析に分けられると思っています。逆に人工言語では、その2つを決定する必要があると思っています。つまりプログラミング言語に対する仕様とは、主にその2つを定めることだと思っているということです(そしてプログラミング言語として実用的にするには標準ライブラリやその他周辺環境も定める必要があるでしょう)。
そこで、ABの仕様定義の一環として、ActiveBasicに厳密な言語構文の定義を与える試みを行ってみようと思います。と言っても、コンパイラの挙動を後追いするだけです。つまり現在のABコンパイラで通りそうな構文を考えます。ただし、コンパイラに通らなくてもバグと見做したり個人的希望としたりあるいは単に無視したりして、そのまま構文を決めることがあるかもしれません。
また、こういうことは独学なので、明らかに変なことを書いてしまうことがあるかもしれません。もしあれば、どしどしコメントください。
構文の定義には、そのための言語を用いることが一般的です。正規表現もその種の言語なのですが、大半のプログラミング言語の定義には力不足であることが理論的に明らかになっています。そこで、BNF(バッカス・ナウア記法)を拡張した拡張BNFというものがよく用いられるのですが、どうも統一された書き方がないようです。そのため、これから説明するものはオレオレBNFになっていると思います。
厳密なようで曖昧な定義を与えるので、退屈なら読み飛ばしてください。こういうことは、まず実例を見たほうが速いでしょうから。
- S
- abc
ここでSの後ろに::=が表示されていてほしいのですが(今はまだそうなりません、そのうちCSS書き換えます)、Internet Explorerではバージョン7でも表示されないらしいです。諦めてください。私も普段はIEコンポーネント使いなので見えていません。以下オレオレBNFで確実に現れる記号を挙げておきます。効果は実際に使用したところでわかると思います。なお、必要に応じてその他の正規表現の表記を随時導入するかもしれません。
- ::=
- 構文定義
- ‘x’
- 終端記号x
- | または 改行
- 和集合
- *
- 0回以上繰り返し
- +
- 1回以上繰り返し
- ?
- 0回もしくは1回出現
- ()
- グルーピング(優先順位変更)
優先順位は、大体この順です。なお、終端記号は、ソースコードに直接現れるもののことです。逆に非終端記号は、どこかで::=の左側に現れて定義されるもののことを言います。
|から()までは正規表現と同じです。なお*, +, ?はなくても問題ありません(表現力に違いは生じません)が、一応用意しておきます。
オレオレBNFの定義の仕方がちっとも厳密ではありませんが、そもそもこれからやろうとしていることは、ActiveBasicに厳密な言語構文の定義を与える(あくまで)試みです。できることがわかったら、後で厳密なBNFの定義を与えることを考えましょう。
始める前の最後に、これから考える構文の定義は前処理が済んだソースを対象とします。つまり、#ナントカの指令を解釈し、コメントを削除し、行末に_ (下線)がある行と次の行を論理的に連結した状態ということです。
長い前置きがようやく終わったので、簡単そうなところから始めます。
- 八進数字
- ‘0’ | ‘1’ | ‘2’ | ‘3’ | ‘4’ | ‘5’ | ‘6’ | ‘7’
- 十進数字
- 八進数字 | ‘8’ | ‘9’
- 十六進数字
- 十進数字
- ‘A’ | ‘B’ | ‘C’ | ‘D’ | ‘E’ | ‘F’
- ‘a’ | ‘b’ | ‘c’ | ‘d’ | ‘e’ | ‘f’
これくらいはABとも関係ない一般的なことでしょう。こういう調子で定義付けていきます。十六進数字では早速|の代わりに改行して縦に並べる記法を採っています。
- 八進数字列
- 八進数字+
- 十進数字列
- 十進数字+
- 十六進数字列
- 十六進数字+
数字が並んだものというのは後々使いまわせそうな気がするので、一旦、数字列としておきます。なお、例えば八進数字列では「八進数字列? 八進数字」や「八進数字 | 八進数字列 八進数字」などといった具合に、再帰的な定義も可能です。
- 八進整数接頭辞
- ‘&o’ | ‘&O’
- 十六進整数接頭辞
- ‘&h’ | ‘&H’
- 八進整数リテラル
- 八進整数接頭辞
二進法用に&bなんてあってもいいと思うのは私だけではないと思います。
- 十進整数リテラル
- 十進数字列
- 八進整数リテラル
- ‘&’ (‘O’ | ‘o’) 八進数字列
- 十六進整数リテラル
- ‘&’ (‘H’ | ‘h’) 十六進数字列
- 整数リテラル
- 八進整数リテラル
- 十進整数リテラル
- 十六進整数リテラル
書くのが遅れましたが、A B Cと横に並んでいたら、それが順番に現れると言うことを意味します。
後はこれを、全てを終えるか飽きるまで続けるわけです。まだ当分は飽きないでしょう。次回へ続きます。
スポンサード リンク |