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

Rename calc++.cc -> nask_parse.cpp, add lexer/parser #36

Closed hangingman closed 3 years ago

hangingman commented 3 years ago

ref #32

最終的なBNF

program
: stmts { $$ = ast::Program($1); }
;
stmts
: stmt { $$ = std::list<ast::Statement>(); $$.push_back($1); }
| stmts stmt { $$ = $1; $1.push_back($2); }
;
stmt
: IDENT COLON { $$ = ast::LabelStmt($1); }
| IDENT ASSIGN exp { $$ = ast::DeclareStmt($<std::string>1, $3); }
| LBRACKET CONFIG CONST_STRING RBRACKET { $$ = ast::ConfigStmt($<std::string>2, $<std::string>3); }
| OPCODE mnemonic_args { $$ = ast::MnemonicStmt($1, $2); }
;
mnemonic_args
: exp { $$ = std::list<ast::ExpNode>(); $$.push_back($1); }
| mnemonic_args COMMA exp { $$ = $1; $$.push_back($<ast::ExpNode>2); }
;
exp: factor CMP factor { $$ = ast::CmpNode( $<std::string>1, $2,  $<std::string>3); }
| factor '+' factor { $$ = ast::CalcNode($<std::string>1, "+", $<std::string>3); }
| factor '-' factor { $$ = ast::CalcNode($<std::string>1, "-", $<std::string>3); }
| factor '*' factor { $$ = ast::CalcNode($<std::string>1, "*", $<std::string>3); }
| factor '/' factor { $$ = ast::CalcNode($<std::string>1, "/", $<std::string>3); }
| factor '%' factor { $$ = ast::CalcNode($<std::string>1, "%", $<std::string>3); }
| factor { $$ = ast::ImmediateNode($<std::string>1);  }
;
factor:
| "number"
| "hex"
| "ident"
| "const_string"
;