OneLang32/OneLang32Console(0, 0, 0, 7/Nishi-Funabashi #7) -SyntaxAnalyzerの追加. etc...

構文解析器SyntaxAnalyzerと構文情報を持つSyntaxInfoを追加した。

SyntaxInfo.hは、

構造体にした。
まだ、IDしか実装してない。

SyntaxAnalyzer.hは、

SyntaxInfoのvector、m_vecsiSyntaxTableに各文(もしくはそれらの集まり)の構文情報がリストで入る。
AnalyzeでCLexicalAnalyzerのポインタを引数に取る。

SyntaxAnalyzer.cppは、

とりあえず今回は、トークンの0番目だけ出力。

LexicalAnalyzer.hは、

GetTokenが増えた。

LexicalAnalyzer.cppでは、

GetTokenの実装では、uiNo番目のトークンを返す。

トークンの出力をいったんコメントアウト

main.cppでは、

構文解析を追加。

実行すると、

argv[1] = test.1
CLexicalAnalyzer::Analyze!
----- start -----
----- end -----
CSyntaxAnalyzer::Analyze Start
GetToken(0) = /
CSyntaxAnalyzer::Analyze End
続行するには何かキーを押してください . . .

構文解析で最初のトークン"/"だけ出力してる。

-SyntaxAnalyzerの追加. · bg1bgst333/OneLang32@1a96101 · GitHub

OneLang32/OneLang32Console(0, 0, 0, 6/Nishi-Funabashi #6) -デバッグ時のコマンドライン引数対応. etc...

デバッグ時のコマンドライン引数対応するのと、ワイド文字への対応を実装した。

プロパティでコマンドライン引数を指定
プロパティでコマンドライン引数を指定

プロパティでコマンドライン引数を指定して、作業ディレクトリも暫定でセットして、これでデバッガからもtest.1が読めるようにした。

リリースビルド
リリースビルド

リリースビルドも同様に。

これはいいとして、メインはワイド文字対応。

LexicalAnalyzer.cppで、

コマンドプロンプトはワイド文字が苦手なので、ソースのコメントなどにワイド文字があっても大丈夫なように、そもそもソースそのものは出力しない。

読み込まれるテキストはCTextFileクラスによって、UTF16のワイド文字に変換されている。
その上で、0xffを超えれば、その文字はワイド文字。
トークンが空なら、ワイド文字から始まるトークンなので、先頭に"<WCS>"と付ける。
今回はそうでない場合でも、例えば、"aあ”のようにアルファベットから始まって、ワイド文字に来た場合は、先頭を見て、そうであれば、先頭に"<WCS>"を付ける。
そして、この2つのパターンの場合、トークンを連結する。
"aあaあ"の場合、2つ目の"あ"の時、トークンは空ではないし、先頭は"<WCS>"の"<"になっているはずなので、二重に"<WCS>"を付けてしまうことはない。

m_vectstrTokenListの中からfindで、"<WCS>"があるかを探し、あった場合は、"<WCS>"とだけ出力して、内容は出力しない。
それ以外は出力する。
これでコンソール出力が途中で切れたりしない。

今回から、しばらくは、C言語の"Hello, world!"をいかにOneLang風に削っていくかを試していくので、test.1は、

C言語の"Hello, world!"プログラムにした。
("/* aあaあ */"という一応先程のケースのテストコメントも入れている。)

実行すると、

argv[1] = test.1
CLexicalAnalyzer::Analyze!
----- start -----
----- end -----
/
*
<Space>
<WCS>
<Space>
*
/
<CR>
<LF>
#
include
<Space>
<
stdio
.
h
>
<Space>
/
*
<Space>
<WCS>
<Space>
*
/
<CR>
<LF>
/
*
<Space>
<WCS>
<Space>
*
/
<CR>
<LF>
/
*
<Space>
<WCS>
<Space>
*
/
<CR>
<LF>
int
<Space>
main
(
void
)
{
<Space>
/
*
<Space>
<WCS>
.
<Space>
*
/
<CR>
<LF>
<CR>
<LF>
<Space>
<Space>
/
*
<Space>
<WCS>
<Space>
*
/
<CR>
<LF>
<Space>
<Space>
printf
(
"
Hello
,
<Space>
world
!
\
n
"
)
;
<Space>
/
*
<Space>
<WCS>
"
Hello
,
<Space>
world
!
"
<WCS>
.
<Space>
*
/
<CR>
<LF>
<CR>
<LF>
<Space>
<Space>
/
*
<Space>
<WCS>
<Space>
*
/
<CR>
<LF>
<Space>
<Space>
return
<Space>
0
;
<Space>
/
*
<Space>
<WCS>
0
<WCS>
.
<Space>
*
/
<CR>
<LF>
<CR>
<LF>
}
続行するには何かキーを押してください . . .

このように、本来、ワイド文字が出力される部分には、"<WCS>"が出力されている。

-デバッグ時のコマンドライン引数対応. · bg1bgst333/OneLang32@e6f7aa5 · GitHub

OneLang32/OneLang32Console(0, 0, 0, 5/Nishi-Funabashi #5) -スペースもトークンすることにした.

当初は、スペースは読み飛ばすことも考えていたが、ダブルクォートなどの中のスペースは消失させてはいけないし、今後の機能の充実を考えると、スペースをトークンとすることが必要になったので、そのように修正した。

LexicalAnalyzer.cppで、

スペースの時は、それまでの文字列があるならトークンリストに追加して、さらにトークンリストに"<Space>"を追加する。そして、トークンは空の状態にリセットする。

これで、test.1の字句解析をすると、

C:\Project\Cloud\github.com\OneLang32\debug console>OneLang32Console.exe test.1
argv[1] = test.1
CLexicalAnalyzer::Analyze!
----- start -----
ho + ge
foo b/ar
ABC /  XYZ
----- end -----
ho
<Space>
+
<Space>
ge
<CR>
<LF>
foo
<Space>
b
/
ar
<CR>
<LF>
ABC
<Space>
/
<Space>
<Space>
XYZ

C:\Project\Cloud\github.com\OneLang32\debug console>

スペースもトークンのひとつとなる。

-スペースもトークンすることにした. · bg1bgst333/OneLang32@0e4a619 · GitHub