]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/spirit/example/x3/calc/calc8/main.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / spirit / example / x3 / calc / calc8 / main.cpp
CommitLineData
7c673cae
FG
1/*=============================================================================
2 Copyright (c) 2001-2014 Joel de Guzman
3
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6=============================================================================*/
7///////////////////////////////////////////////////////////////////////////////
8//
9// Now we'll introduce variables and assignment. This time, we'll also
10// be renaming some of the rules -- a strategy for a grander scheme
11// to come ;-)
12//
13// This version also shows off grammar modularization. Here you will
14// see how expressions and statements are built as modular grammars.
15//
16// [ JDG April 9, 2007 ] spirit2
17// [ JDG February 18, 2011 ] Pure attributes. No semantic actions.
18// [ JDG May 17, 2014 ] Ported from qi calc7 example.
19//
20///////////////////////////////////////////////////////////////////////////////
21
22#include "ast.hpp"
23#include "vm.hpp"
24#include "compiler.hpp"
25#include "statement.hpp"
26#include "error_handler.hpp"
27#include "config.hpp"
28#include <iostream>
29
30///////////////////////////////////////////////////////////////////////////////
31// Main program
32///////////////////////////////////////////////////////////////////////////////
33int
34main()
35{
36 std::cout << "/////////////////////////////////////////////////////////\n\n";
37 std::cout << "Statement parser...\n\n";
38 std::cout << "/////////////////////////////////////////////////////////\n\n";
39 std::cout << "Type some statements... ";
40 std::cout << "An empty line ends input, compiles, runs and prints results\n\n";
41 std::cout << "Example:\n\n";
42 std::cout << " var a = 123;\n";
43 std::cout << " var b = 456;\n";
44 std::cout << " var c = a + b * 2;\n\n";
45 std::cout << "-------------------------\n";
46
47 std::string str;
48 std::string source;
49 while (std::getline(std::cin, str))
50 {
51 if (str.empty())
52 break;
53 source += str + '\n';
54 }
55
56 using client::parser::iterator_type;
57 iterator_type iter(source.begin());
58 iterator_type end(source.end());
59
7c673cae
FG
60 client::vmachine vm; // Our virtual machine
61 client::code_gen::program program; // Our VM program
62 client::ast::statement_list ast; // Our AST
63
64 using boost::spirit::x3::with;
65 using client::parser::error_handler_type;
66 using client::parser::error_handler_tag;
67 error_handler_type error_handler(iter, end, std::cerr); // Our error handler
68
69 // Our compiler
70 client::code_gen::compiler compile(program, error_handler);
71
72 // Our parser
73 auto const parser =
74 // we pass our error handler to the parser so we can access
75 // it later on in our on_error and on_sucess handlers
76 with<error_handler_tag>(std::ref(error_handler))
77 [
78 client::statement()
79 ];
80
81 using boost::spirit::x3::ascii::space;
82 bool success = phrase_parse(iter, end, parser, space, ast);
83
84 std::cout << "-------------------------\n";
85
86 if (success && iter == end)
87 {
88 if (compile(ast))
89 {
90 std::cout << "Success\n";
91 std::cout << "-------------------------\n";
92 vm.execute(program());
93
94 std::cout << "-------------------------\n";
95 std::cout << "Assembler----------------\n\n";
96 program.print_assembler();
97
98 std::cout << "-------------------------\n";
99 std::cout << "Results------------------\n\n";
100 program.print_variables(vm.get_stack());
101 }
102 else
103 {
104 std::cout << "Compile failure\n";
105 }
106 }
107 else
108 {
109 std::cout << "Parse failure\n";
110 }
111
112 std::cout << "-------------------------\n\n";
113 return 0;
114}