Closed hangingman closed 1 year ago
ref https://github.com/hangingman/gosk/blob/master/spec.md
<プログラム>::=<文>*
<文>::=<ラベル>|<変数宣言>|<コンフィグ>|<ニーモニック>
<ラベル>::=<識別子> ":"
<変数宣言>::=<変数名> "EQU" <式>
<コンフィグ>::="[" <コンフィグ命令> <文字列リテラル> "]"
<コンフィグ命令>::="BITS" | "INSTRSET" | "OPTIMIZE" | "FORMAT" | "PADDING" | "PADSET" | "OPTION" | "SECTION" | "ABSOLUTE" | "FILE"
<コンフィグ引数>::= <文字列リテラル>
<ニーモニック>::=<オペコード> { <式> "," } * {<式>}
<式>::=<要素> <比較演算子> <要素>
| <要素> '+' <要素>
| <要素> '-' <要素>
| <要素> '*' <要素>
| <要素> '/' <要素>
| <要素> '%' <要素>
| <要素>
<要素>::= <数字リテラル>
| <16進数リテラル>
| <識別子>
| <文字列リテラル>
<比較演算子>::='=='|'!='|'>'|'<'|'>='|'<='
<文字列リテラル>::="\"" <文字>* "\"
<数字リテラル>::=<数字>+
<16進数リテラル>::="0x" {<数字>|a-z|A-Z}* -{0,1}${0,1}
<文字>::=a|b|...|z|A|B|...|Z|_|
<識別子>::=[a-zA-Z][a-zA-Z_0-9$]*
<数字>::=[0-9]
解析ツリーを構築する方法の例として、次の式の文法を考慮してください。
pgm -> stmt* stmt -> id = exp | print id exp -> exp + exp | exp - exp | exp * exp | exp / exp | ( exp ) | - exp | id | number
非終端はPGM、STMT、およびEXPであるため、これら3つの非終在的な非終在のための抽象クラスが必要です。
お試しでbnfcを使ってBNFを書いてみた
comment ";" ;
comment "#" ;
Prog. Program ::= [Stmt] ;
(:[]). [Stmt] ::= Stmt ;
(:). [Stmt] ::= Stmt [Stmt] ;
Label. Stmt ::= Ident ":" ;
Assign. Stmt ::= Ident "EQU" Exp ;
Config. Stmt ::= "[" ConfigType String "]" ;
Mnemonic. Stmt ::= Opcode [MnemonicArgs] ;
(:[]). [MnemonicArgs] ::= MnemonicArgs ;
(:). [MnemonicArgs] ::= MnemonicArgs "," [MnemonicArgs] ;
MnemonicArg. MnemonicArgs ::= Exp ;
Eeq. Exp ::= Factor "==" Factor ;
Eneq. Exp ::= Factor "!=" Factor ;
Elthen. Exp ::= Factor "<" Factor ;
Egrthen. Exp ::= Factor ">" Factor ;
Ele. Exp ::= Factor "<=" Factor ;
Ege. Exp ::= Factor ">=" Factor ;
Plus. Exp ::= Factor "+" Factor ;
Minus. Exp ::= Factor "-" Factor ;
Mul. Exp ::= Factor "*" Factor ;
Div. Exp ::= Factor "/" Factor ;
Mod. Exp ::= Factor "%" Factor ;
Imm. Exp ::= Factor ;
FNumber. Factor ::= Integer ;
FHex. Factor ::= Hex ;
FIdent. Factor ::= Ident ;
FString. Factor ::= String ;
token Hex '0' ('x'|'X') (digit | ["abcdef"] | ["ABCDEF"])+ '-'* '$'* ;
ConfBits. ConfigType ::= "BITS" ;
ConfInst. ConfigType ::= "INSTRSET" ;
ConfOpti. ConfigType ::= "OPTIMIZE" ;
ConfForm. ConfigType ::= "FORMAT" ;
ConfPadd. ConfigType ::= "PADDING" ;
ConfPads. ConfigType ::= "PADSET" ;
ConfSect. ConfigType ::= "SECTION" ;
ConfAbso. ConfigType ::= "ABSOLUTE" ;
ConfFile. ConfigType ::= "FILE" ;
Opcodes1. Opcode ::= "AAA" ;
Opcodes2. Opcode ::= "AAD" ;
Opcodes3. Opcode ::= "AAS" ;
Opcodes4. Opcode ::= "AAM" ;
Opcodes5. Opcode ::= "ADC" ;
Opcodes6. Opcode ::= "ADD" ;
Opcodes7. Opcode ::= "AND" ;
Opcodes8. Opcode ::= "ALIGN" ;
Opcodes9. Opcode ::= "ALIGNB" ;
Opcodes10. Opcode ::= "ARPL" ;
Opcodes11. Opcode ::= "BOUND" ;
Opcodes12. Opcode ::= "BSF" ;
Opcodes13. Opcode ::= "BSR" ;
Opcodes14. Opcode ::= "BSWAP" ;
Opcodes15. Opcode ::= "BT" ;
Opcodes16. Opcode ::= "BTC" ;
Opcodes17. Opcode ::= "BTR" ;
Opcodes18. Opcode ::= "BTS" ;
Opcodes19. Opcode ::= "CALL" ;
Opcodes20. Opcode ::= "CBW" ;
Opcodes21. Opcode ::= "CDQ" ;
Opcodes22. Opcode ::= "CLC" ;
Opcodes23. Opcode ::= "CLD" ;
Opcodes24. Opcode ::= "CLI" ;
Opcodes25. Opcode ::= "CLTS" ;
Opcodes26. Opcode ::= "CMC" ;
Opcodes27. Opcode ::= "CMP" ;
Opcodes28. Opcode ::= "CMPSB" ;
Opcodes29. Opcode ::= "CMPSD" ;
Opcodes30. Opcode ::= "CMPSW" ;
Opcodes31. Opcode ::= "CMPXCHG" ;
Opcodes32. Opcode ::= "CPUID" ;
Opcodes33. Opcode ::= "CWD" ;
Opcodes34. Opcode ::= "CWDE" ;
Opcodes35. Opcode ::= "DAA" ;
Opcodes36. Opcode ::= "DAS" ;
Opcodes37. Opcode ::= "DB" ;
Opcodes38. Opcode ::= "DD" ;
Opcodes39. Opcode ::= "DEC" ;
Opcodes40. Opcode ::= "DIV" ;
Opcodes41. Opcode ::= "DQ" ;
Opcodes42. Opcode ::= "DT" ;
Opcodes43. Opcode ::= "DW" ;
Opcodes44. Opcode ::= "END" ;
Opcodes45. Opcode ::= "ENTER" ;
Opcodes46. Opcode ::= "EXTERN" ;
Opcodes47. Opcode ::= "F2XM1" ;
Opcodes48. Opcode ::= "FABS" ;
Opcodes49. Opcode ::= "FADD" ;
Opcodes50. Opcode ::= "FADDP" ;
Opcodes51. Opcode ::= "FBLD" ;
Opcodes52. Opcode ::= "FBSTP" ;
Opcodes53. Opcode ::= "FCHS" ;
Opcodes54. Opcode ::= "FCLEX" ;
Opcodes55. Opcode ::= "FCOM" ;
Opcodes56. Opcode ::= "FCOMP" ;
Opcodes57. Opcode ::= "FCOMPP" ;
Opcodes58. Opcode ::= "FCOS" ;
Opcodes59. Opcode ::= "FDECSTP" ;
Opcodes60. Opcode ::= "FDISI" ;
Opcodes61. Opcode ::= "FDIV" ;
Opcodes62. Opcode ::= "FDIVP" ;
Opcodes63. Opcode ::= "FDIVR" ;
Opcodes64. Opcode ::= "FDIVRP" ;
Opcodes65. Opcode ::= "FENI" ;
Opcodes66. Opcode ::= "FFREE" ;
Opcodes67. Opcode ::= "FIADD" ;
Opcodes68. Opcode ::= "FICOM" ;
Opcodes69. Opcode ::= "FICOMP" ;
Opcodes70. Opcode ::= "FIDIV" ;
Opcodes71. Opcode ::= "FIDIVR" ;
Opcodes72. Opcode ::= "FILD" ;
Opcodes73. Opcode ::= "FIMUL" ;
Opcodes74. Opcode ::= "FINCSTP" ;
Opcodes75. Opcode ::= "FINIT" ;
Opcodes76. Opcode ::= "FIST" ;
Opcodes77. Opcode ::= "FISTP" ;
Opcodes78. Opcode ::= "FISUB" ;
Opcodes79. Opcode ::= "FISUBR" ;
Opcodes80. Opcode ::= "FLD" ;
Opcodes81. Opcode ::= "FLD1" ;
Opcodes82. Opcode ::= "FLDCW" ;
Opcodes83. Opcode ::= "FLDENV" ;
Opcodes84. Opcode ::= "FLDL2E" ;
Opcodes85. Opcode ::= "FLDL2T" ;
Opcodes86. Opcode ::= "FLDLG2" ;
Opcodes87. Opcode ::= "FLDLN2" ;
Opcodes88. Opcode ::= "FLDPI" ;
Opcodes89. Opcode ::= "FLDZ" ;
Opcodes90. Opcode ::= "FMUL" ;
Opcodes91. Opcode ::= "FMULP" ;
Opcodes92. Opcode ::= "FNCLEX" ;
Opcodes93. Opcode ::= "FNDISI" ;
Opcodes94. Opcode ::= "FNENI" ;
Opcodes95. Opcode ::= "FNINIT" ;
Opcodes96. Opcode ::= "FNOP" ;
Opcodes97. Opcode ::= "FNSAVE" ;
Opcodes98. Opcode ::= "FNSTCW" ;
Opcodes99. Opcode ::= "FNSTENV" ;
Opcodes100. Opcode ::= "FNSTSW" ;
Opcodes101. Opcode ::= "FPATAN" ;
Opcodes102. Opcode ::= "FPTAN" ;
Opcodes103. Opcode ::= "FPREM" ;
Opcodes104. Opcode ::= "FPREM1" ;
Opcodes105. Opcode ::= "FRNDINT" ;
Opcodes106. Opcode ::= "FRSTOR" ;
Opcodes107. Opcode ::= "FSAVE" ;
Opcodes108. Opcode ::= "FSCALE" ;
Opcodes109. Opcode ::= "FSETPM" ;
Opcodes110. Opcode ::= "FSIN" ;
Opcodes111. Opcode ::= "FSINCOS" ;
Opcodes112. Opcode ::= "FSQRT" ;
Opcodes113. Opcode ::= "FST" ;
Opcodes114. Opcode ::= "FSTCW" ;
Opcodes115. Opcode ::= "FSTENV" ;
Opcodes116. Opcode ::= "FSTP" ;
Opcodes117. Opcode ::= "FSTSW" ;
Opcodes118. Opcode ::= "FSUB" ;
Opcodes119. Opcode ::= "FSUBP" ;
Opcodes120. Opcode ::= "FSUBR" ;
Opcodes121. Opcode ::= "FSUBRP" ;
Opcodes122. Opcode ::= "FTST" ;
Opcodes123. Opcode ::= "FUCOM" ;
Opcodes124. Opcode ::= "FUCOMP" ;
Opcodes125. Opcode ::= "FUCOMPP" ;
Opcodes126. Opcode ::= "FXAM" ;
Opcodes127. Opcode ::= "FXCH" ;
Opcodes128. Opcode ::= "FXTRACT" ;
Opcodes129. Opcode ::= "FYL2X" ;
Opcodes130. Opcode ::= "FYL2XP1" ;
Opcodes131. Opcode ::= "HLT" ;
Opcodes132. Opcode ::= "IDIV" ;
Opcodes133. Opcode ::= "IMUL" ;
Opcodes134. Opcode ::= "IN" ;
Opcodes135. Opcode ::= "INC" ;
Opcodes136. Opcode ::= "INCO" ;
Opcodes137. Opcode ::= "INSB" ;
Opcodes138. Opcode ::= "INSD" ;
Opcodes139. Opcode ::= "INSW" ;
Opcodes140. Opcode ::= "INT" ;
Opcodes141. Opcode ::= "INT3" ;
Opcodes142. Opcode ::= "INTO" ;
Opcodes143. Opcode ::= "INVD" ;
Opcodes144. Opcode ::= "INVLPG" ;
Opcodes145. Opcode ::= "IRET" ;
Opcodes146. Opcode ::= "IRETD" ;
Opcodes147. Opcode ::= "IRETW" ;
Opcodes148. Opcode ::= "JA" ;
Opcodes149. Opcode ::= "JAE" ;
Opcodes150. Opcode ::= "JB" ;
Opcodes151. Opcode ::= "JBE" ;
Opcodes152. Opcode ::= "JC" ;
Opcodes153. Opcode ::= "JCXZ" ;
Opcodes154. Opcode ::= "JE" ;
Opcodes155. Opcode ::= "JECXZ" ;
Opcodes156. Opcode ::= "JG" ;
Opcodes157. Opcode ::= "JGE" ;
Opcodes158. Opcode ::= "JL" ;
Opcodes159. Opcode ::= "JLE" ;
Opcodes160. Opcode ::= "JMP" ;
Opcodes161. Opcode ::= "JNA" ;
Opcodes162. Opcode ::= "JNAE" ;
Opcodes163. Opcode ::= "JNB" ;
Opcodes164. Opcode ::= "JNBE" ;
Opcodes165. Opcode ::= "JNC" ;
Opcodes166. Opcode ::= "JNE" ;
Opcodes167. Opcode ::= "JNG" ;
Opcodes168. Opcode ::= "JNGE" ;
Opcodes169. Opcode ::= "JNL" ;
Opcodes170. Opcode ::= "JNLE" ;
Opcodes171. Opcode ::= "JNO" ;
Opcodes172. Opcode ::= "JNP" ;
Opcodes173. Opcode ::= "JNS" ;
Opcodes174. Opcode ::= "JNZ" ;
Opcodes175. Opcode ::= "JO" ;
Opcodes176. Opcode ::= "JP" ;
Opcodes177. Opcode ::= "JPE" ;
Opcodes178. Opcode ::= "JPO" ;
Opcodes179. Opcode ::= "JS" ;
Opcodes180. Opcode ::= "JZ" ;
Opcodes181. Opcode ::= "LAHF" ;
Opcodes182. Opcode ::= "LAR" ;
Opcodes183. Opcode ::= "LDS" ;
Opcodes184. Opcode ::= "LEA" ;
Opcodes185. Opcode ::= "LEAVE" ;
Opcodes186. Opcode ::= "LES" ;
Opcodes187. Opcode ::= "LFS" ;
Opcodes188. Opcode ::= "LGDT" ;
Opcodes189. Opcode ::= "LGS" ;
Opcodes190. Opcode ::= "LIDT" ;
Opcodes191. Opcode ::= "LLDT" ;
Opcodes192. Opcode ::= "LMSW" ;
Opcodes193. Opcode ::= "LOCK" ;
Opcodes194. Opcode ::= "LODSB" ;
Opcodes195. Opcode ::= "LODSD" ;
Opcodes196. Opcode ::= "LODSW" ;
Opcodes197. Opcode ::= "LOOP" ;
Opcodes198. Opcode ::= "LOOPE" ;
Opcodes199. Opcode ::= "LOOPNE" ;
Opcodes200. Opcode ::= "LOOPNZ" ;
Opcodes201. Opcode ::= "LOOPZ" ;
Opcodes202. Opcode ::= "LSL" ;
Opcodes203. Opcode ::= "LSS" ;
Opcodes204. Opcode ::= "LTR" ;
Opcodes205. Opcode ::= "MOV" ;
Opcodes206. Opcode ::= "MOVSB" ;
Opcodes207. Opcode ::= "MOVSD" ;
Opcodes208. Opcode ::= "MOVSW" ;
Opcodes209. Opcode ::= "MOVSX" ;
Opcodes210. Opcode ::= "MOVZX" ;
Opcodes211. Opcode ::= "MUL" ;
Opcodes212. Opcode ::= "NEG" ;
Opcodes213. Opcode ::= "NOP" ;
Opcodes214. Opcode ::= "NOT" ;
Opcodes215. Opcode ::= "OR" ;
Opcodes216. Opcode ::= "ORG" ;
Opcodes217. Opcode ::= "OUT" ;
Opcodes218. Opcode ::= "OUTSB" ;
Opcodes219. Opcode ::= "OUTSD" ;
Opcodes220. Opcode ::= "OUTSW" ;
Opcodes221. Opcode ::= "POP" ;
Opcodes222. Opcode ::= "POPA" ;
Opcodes223. Opcode ::= "POPAD" ;
Opcodes224. Opcode ::= "POPAW" ;
Opcodes225. Opcode ::= "POPF" ;
Opcodes226. Opcode ::= "POPFD" ;
Opcodes227. Opcode ::= "POPFW" ;
Opcodes228. Opcode ::= "PUSH" ;
Opcodes229. Opcode ::= "PUSHA" ;
Opcodes230. Opcode ::= "PUSHD" ;
Opcodes231. Opcode ::= "PUSHAD" ;
Opcodes232. Opcode ::= "PUSHAW" ;
Opcodes233. Opcode ::= "PUSHF" ;
Opcodes234. Opcode ::= "PUSHFD" ;
Opcodes235. Opcode ::= "PUSHFW" ;
Opcodes236. Opcode ::= "RCL" ;
Opcodes237. Opcode ::= "RCR" ;
Opcodes238. Opcode ::= "RDMSR" ;
Opcodes239. Opcode ::= "RDPMC" ;
Opcodes240. Opcode ::= "REP" ;
Opcodes241. Opcode ::= "REPE" ;
Opcodes242. Opcode ::= "REPNE" ;
Opcodes243. Opcode ::= "REPNZ" ;
Opcodes244. Opcode ::= "REPZ" ;
Opcodes245. Opcode ::= "RESB" ;
Opcodes246. Opcode ::= "RESD" ;
Opcodes247. Opcode ::= "RESQ" ;
Opcodes248. Opcode ::= "REST" ;
Opcodes249. Opcode ::= "RESW" ;
Opcodes250. Opcode ::= "RET" ;
Opcodes251. Opcode ::= "RETF" ;
Opcodes252. Opcode ::= "RETN" ;
Opcodes253. Opcode ::= "ROL" ;
Opcodes254. Opcode ::= "ROR" ;
Opcodes255. Opcode ::= "RSM" ;
Opcodes256. Opcode ::= "SAHF" ;
Opcodes257. Opcode ::= "SAL" ;
Opcodes258. Opcode ::= "SAR" ;
Opcodes259. Opcode ::= "SBB" ;
Opcodes260. Opcode ::= "SCASB" ;
Opcodes261. Opcode ::= "SCASD" ;
Opcodes262. Opcode ::= "SCASW" ;
Opcodes263. Opcode ::= "SETA" ;
Opcodes264. Opcode ::= "SETAE" ;
Opcodes265. Opcode ::= "SETB" ;
Opcodes266. Opcode ::= "SETBE" ;
Opcodes267. Opcode ::= "SETC" ;
Opcodes268. Opcode ::= "SETE" ;
Opcodes269. Opcode ::= "SETG" ;
Opcodes270. Opcode ::= "SETGE" ;
Opcodes271. Opcode ::= "SETL" ;
Opcodes272. Opcode ::= "SETLE" ;
Opcodes273. Opcode ::= "SETNA" ;
Opcodes274. Opcode ::= "SETNAE" ;
Opcodes275. Opcode ::= "SETNB" ;
Opcodes276. Opcode ::= "SETNBE" ;
Opcodes277. Opcode ::= "SETNC" ;
Opcodes278. Opcode ::= "SETNE" ;
Opcodes279. Opcode ::= "SETNG" ;
Opcodes280. Opcode ::= "SETNGE" ;
Opcodes281. Opcode ::= "SETNL" ;
Opcodes282. Opcode ::= "SETNLE" ;
Opcodes283. Opcode ::= "SETNO" ;
Opcodes284. Opcode ::= "SETNP" ;
Opcodes285. Opcode ::= "SETNS" ;
Opcodes286. Opcode ::= "SETNZ" ;
Opcodes287. Opcode ::= "SETO" ;
Opcodes288. Opcode ::= "SETP" ;
Opcodes289. Opcode ::= "SETPE" ;
Opcodes290. Opcode ::= "SETPO" ;
Opcodes291. Opcode ::= "SETS" ;
Opcodes292. Opcode ::= "SETZ" ;
Opcodes293. Opcode ::= "SGDT" ;
Opcodes294. Opcode ::= "SHL" ;
Opcodes295. Opcode ::= "SHLD" ;
Opcodes296. Opcode ::= "SHR" ;
Opcodes297. Opcode ::= "SHRD" ;
Opcodes298. Opcode ::= "SIDT" ;
Opcodes299. Opcode ::= "SLDT" ;
Opcodes300. Opcode ::= "SMSW" ;
Opcodes301. Opcode ::= "STC" ;
Opcodes302. Opcode ::= "STD" ;
Opcodes303. Opcode ::= "STI" ;
Opcodes304. Opcode ::= "STOSB" ;
Opcodes305. Opcode ::= "STOSD" ;
Opcodes306. Opcode ::= "STOSW" ;
Opcodes307. Opcode ::= "STR" ;
Opcodes308. Opcode ::= "SUB" ;
Opcodes309. Opcode ::= "TEST" ;
Opcodes310. Opcode ::= "TIMES" ;
Opcodes311. Opcode ::= "UD2" ;
Opcodes312. Opcode ::= "VERR" ;
Opcodes313. Opcode ::= "VERW" ;
Opcodes314. Opcode ::= "WAIT" ;
Opcodes315. Opcode ::= "WBINVD" ;
Opcodes316. Opcode ::= "WRMSR" ;
Opcodes317. Opcode ::= "XADD" ;
Opcodes318. Opcode ::= "XCHG" ;
Opcodes319. Opcode ::= "XLATB" ;
Opcodes320. Opcode ::= "XOR" ;
bisonはC++のコードを出力できるらしい Re: What are the benefits to migrate from Bison++ to Bison
リファクタリング
33 editorconfig でコードのフォーマットを固定
34 ログが多すぎるので少なくする
開発環境準備
35 bison/flexをCIで動かせるようにする対応
実装
36 lexer/parserを仮に設定し字句解析と構文解析
37 BNFCで生成したソースを使う
38 アドレス指定の際の「exp:exp」のようなテキストを読めるようにする
マイグレーション
残り、flexをc++インターフェースで使うかどうかというところとopennaskの実装をbnfcの生成コードで置き換えていくという作業がある
[x] flexをc++インターフェースで使うかどうか検討して実装
[x] opennaskの実装をbnfcの生成コードで置き換え
40
41
43
44
45
47
48
49
50
54
55
57
69
70
メモリーリークも解決した( #51 )ので、2022年は暇を見つけて上記の続きをやる
メモリーアドレッシング・モード
実装にけっこう悩んでいたが、評価時に単純に左から順に連結していけばいいかも
ディスプレイスメントでどういうパターンがあるのかがわかりずらい
たぶん以下のパターンしかない?
osaskプロジェクトだと
REG[REG+X]
ぐらいしかパターンはなさそう 下記のようなパターンがあるっぽい https://web.archive.org/web/20230616085837/https://faculty.kfupm.edu.sa/COE/aimane/assembly/pagegen-64.aspx.htm➔ 上記部分は最終的にEBNFを書き換えて攻略した #73 で継続して実施