48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
-
-
-
+
+
+
-
+
-
+
|
uint64_t Compiler::execute( istream& source, const ptr< string >& filename )
{
sema::Context c( m_pEnv, builtins::RootIdentity(), GetValueType< uint64_t >() );
auto r = make_shared< parse::Resolver >( make_shared< lex::Lexer >( source, filename ), c );
parse::Parser p( r );
auto cfgBuilder = make_shared< sema::CFGBuilder >();
p.setCFGBuilder( cfgBuilder );
p.setCurrentBB( cfgBuilder->entryBB() );
auto cfg = make_shared< llr::CFG >();
p.setCFG( cfg );
p.setCurrentBB( cfg->entryBB() );
p.parseSequence();
if( !r->eos() )
{
cout << "syntax error.\n";
return 0;
}
if( !cfgBuilder->entryBB()->canBeExecuted() )
if( !cfg->entryBB()->canBeExecuted() )
{
cout << "front end can not be executed.\n";
return 0;
}
execute::VM vm;
auto result = vm.execute( cfgBuilder->entryBB() );
auto result = vm.execute( cfg->entryBB() );
if( !result )
return 1;
return *FromValue< uint64_t >( *result );
}
|