コメントスパムが酷いので一時的にコメントできないようにしています。しばらくしたら元に戻しますのでご協力お願いします。

さて、構文解析というより字句解析の段階が続いています。それもそろそろ終わりです。今日は、空白文字とその他の記号です。

空白類文字
空白 | 水平タブ
改行
改行文字
区切り子
‘+’ | ‘-‘ | ‘*’ | ‘/’ | ‘\’ | ‘^’ | ‘=’ | ‘< ' | '>‘ | ‘.’ | ‘->’
‘%’ | ‘&’ | ‘!’ | ‘#’ | ‘$’
‘(‘ | ‘)’ | ‘[‘ | ‘]’ | ‘:’ | ‘…’

空白類文字からは改行文字を外しました。BASICの構文は、どちらかというとフリースタイルではなく行志向のためです。感覚的には「空白類文字は、改行以外の全ての空白文字」としたいところです。前回識別子のときに、仮名漢字などもが識別子に使えるするべきではないかと書きましたが、それが実現されるなら、その際には当然全角空白なども使用可能となるべきです。そうは思ったものの、試しにVisual C++ 2005のコンパイラに全角空白を含むソースコードを食わせたところ、C3872エラーとなり、空白としては使用できませんでした。

区切り子は、C(正確にはJIS X 3010)から借りた言葉です。C言語の系統の言語に比べれば、記号類の使用は遥かに少ないです(あっちは予約語が少ない分、記号を多用していますからね)。ところで、C/C++などでは、1つの字句と認識されるものでも、現在のABコンパイラでは1つの字句として扱っていないものがありました。それは比較演算子、複合代入演算子、インクリメント・デクリメント演算子です。次のコードのように、間に空白を置いても使用可能です。

#console

Dim a = 0

a + = 5

If a < = 5 Then
	a + +
End If

Print a
Sleep(-1)

Dim p As *POINTAPI
p = GC_malloc_atomic(SizeOf (POINTAPI))
'p - > x = a エラー
p -> x = a 'Ok

Dim f = New Foo
If f = f Then
End If

Class Foo
	Function Operator = =(x As Foo)
	End Function
End Class

'Declare Function wsprintf2 CDECL Lib "user32" Alias "wsprintfA" ( _
    lpText As *CHAR,
    lpFormat As *CHAR,
    . . .) As Long 'エラー

もし、このような空白を開けることが不可能があれば、区切り子には’++’や’>=’を追加していました。実際、->と…は空白を間に置けないことから1つの字句と判断し
、区切り子に入れました。最初に書いたとおり、現状のコンパイラの実装を基にした決定です。


次回はようやくですが、字句解析部分を終わりにします。


スポンサード リンク

この記事のカテゴリ