Closed hangingman closed 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" ;
ref #32
最終的なBNF