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

bison+flexを使う #32

Closed hangingman closed 1 year ago

hangingman commented 3 years ago

bisonはC++のコードを出力できるらしい Re: What are the benefits to migrate from Bison++ to Bison

リファクタリング

開発環境準備

実装

マイグレーション

残り、flexをc++インターフェースで使うかどうかというところとopennaskの実装をbnfcの生成コードで置き換えていくという作業がある

メモリーリークも解決した( #51 )ので、2022年は暇を見つけて上記の続きをやる

メモリーアドレッシング・モード

実装にけっこう悩んでいたが、評価時に単純に左から順に連結していけばいいかも

# 擬似コード
for (int i = 0; i < オペランドのサイズ; i++) {
    オペランドと( 即値 or  ラベル)を取り出して機械語の結果を連結していく
}

ディスプレイスメントでどういうパターンがあるのかがわかりずらい

たぶん以下のパターンしかない?

BASE + (INDEX*SCALE) + DISPLACEMENT

* BASE: ベースレジスタ
* INDEX: インデックスレジスタ、配列の添え字のようなもの
* SCALE: 2,4,8 のいずれか。配列要素のサイズを指定する
* DISPLACEMENT: アドレス、もしくはベースレジスタからのオフセットを示す。定数。

osaskプロジェクトだと REG[REG+X] ぐらいしかパターンはなさそう 下記のようなパターンがあるっぽい https://web.archive.org/web/20230616085837/https://faculty.kfupm.edu.sa/COE/aimane/assembly/pagegen-64.aspx.htm

➔ 上記部分は最終的にEBNFを書き換えて攻略した #73 で継続して実施

hangingman commented 3 years 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つの非終在的な非終在のための抽象クラスが必要です。

hangingman commented 3 years ago

お試しで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" ;