HobbyOSs / opennask

nask clone assembly, it can boot tiny OS with Linux
https://github.com/HobbyOSs/opennask/wiki/%E5%8B%95%E4%BD%9C%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF
GNU General Public License v3.0
20 stars 3 forks source link

EBNF版のnask_parseで実装を置き換える #85

Closed hangingman closed 5 months ago

hangingman commented 1 year ago

残り必要なテストケース

差分があるものを列挙している

ブートローダー

naskfunc.nas

21日目からはテストケースは不要で、とりあえず完全一致してればいいかな

実装必要な話

昔作成したテストはもう少し作り直すかも 5日目までできてしまえば、あとは昔のコードを削除してバージョンを2.0.0にしたい

<program> ::= <block> | <compound statement>
<block> ::= <unlabelled block> | <label>: <block>

<unlabelled block> ::= <block head> ; <compound tail>

<block head> ::= begin <declaration> | <block head> ; <declaration>
<compound statement> ::= <unlabelled compound> | <label>: <compound statement>
<unlabelled compound> ::= begin <compound tail>
<compound tail> ::= <statement> end | <statement> ; <compound tail>
hangingman commented 5 months ago

PEGで書き直したところすべてパースに成功したので、続きは別リポジトリで実施する https://github.com/HobbyOSs/gosk/commit/a27895528f1e8ff4d2b417c6f9d9881cd1d4da9c

bisonでできなかった理由としてはbnfc(内部はbison)のデフォルト構文解析アルゴリズムがLALR(1)だったため。

naskの文法ではどうしてもtoken先読みが必要だった(ラベルとかセグメントレジスタとか) %glr-parserにすればbisonでもできるようだが、カスタマイズが難度高すぎで諦めた。 結果としてPEGで書くのが楽だったという結論になる。 というわけでクローズ。