Cadabra
Computer algebra system for field theory problems
Loading...
Searching...
No Matches
PreProcessor.hh
Go to the documentation of this file.
1/*
2
3Cadabra: a field-theory motivated computer algebra system.
4Copyright (C) 2001-2014 Kasper Peeters <kasper.peeters@phi-sci.com>
5
6This program is free software: you can redistribute it and/or
7modify it under the terms of the GNU General Public License as
8published by the Free Software Foundation, either version 3 of the
9License, or (at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19*/
20
21#pragma once
22
23#include <iostream>
24#include <string>
25#include <vector>
26
27enum { tok_arrow=0xac, tok_unequals=0xad, tok_wedge=0xae, tok_pow=0xaf, tok_set_option=0xb0, tok_declare=0xb1, tok_sequence=0xb2, tok_siblings=0xb3 };
28
35
37 public:
39 friend std::istream& operator>>(std::istream&, preprocessor&);
40 friend std::ostream& operator<<(std::ostream&, const preprocessor&);
41
42 void erase();
43 void strip_outer_brackets() const;
65 };
66 // FIXME: we really need a way to associate multiple characters to a single operator,
67 // since that would allow for ".." (sequence), ":=" (define), ">=" and so on. The current
68 // '.' is a hack and is treated as such: when it occurs there is an additional check for
69 // a followup '.'.
70 const static char32_t *const order_names[];
71 private:
72 void parse_(const std::u32string&);
73 void parse_internal_();
77 bool unwind_(unsigned int tolevel, unsigned int bracketgoal=0, bool usebracket=true) const;
78 char32_t get_token_(char32_t prev_token);
79 void show_and_throw_(const std::string& str) const;
80
81 void bracket_strings_(char32_t cb, std::u32string& obrack, std::u32string& cbrack) const;
82 bool is_infix_operator_(char32_t c) const;
83 bool is_link_(char32_t c) const;
84 unsigned int is_opening_bracket_(char32_t c) const;
85 unsigned int is_closing_bracket_(char32_t c) const;
86 unsigned int is_bracket_(char32_t c) const;
87 bool is_already_bracketed_(const std::u32string& str) const;
88 bool is_digits_(const std::u32string& str) const;
89 unsigned int current_bracket_(bool deep=false) const;
90 void print_stack() const; // for debuggging purposes
91
92 bool default_is_product_() const;
93 unsigned int cur_pos;
94 std::u32string cur_str;
95
96 // A backslash followed by a bracket is also a bracket (gets code
97 // of the bracket plus 128).
98 const static char32_t open_brackets[];
99 const static char32_t close_brackets[];
100
101 class accu_t {
102 public:
103 accu_t();
104 void erase();
105
106 bool head_is_generated; // when infix -> postfix has occurred
107 std::u32string accu;
108 unsigned int order;
109 std::vector<std::u32string> parts;
110 unsigned int bracket;
111 bool is_index; // whether the bracket was prefixed with ^ or _
112 };
113 mutable accu_t cur;
114 mutable std::vector<accu_t> accus;
115 };
116
117std::ostream& operator<<(std::ostream&, const preprocessor&);
118std::istream& operator>>(std::istream&, preprocessor&);
119
120
@ tok_wedge
Definition PreProcessor.hh:27
@ tok_unequals
Definition PreProcessor.hh:27
@ tok_pow
Definition PreProcessor.hh:27
@ tok_arrow
Definition PreProcessor.hh:27
@ tok_sequence
Definition PreProcessor.hh:27
@ tok_siblings
Definition PreProcessor.hh:27
@ tok_set_option
Definition PreProcessor.hh:27
@ tok_declare
Definition PreProcessor.hh:27
std::ostream & operator<<(std::ostream &, const preprocessor &)
Definition PreProcessor.cc:67
std::istream & operator>>(std::istream &, preprocessor &)
Definition PreProcessor.cc:55
Definition PreProcessor.hh:101
std::vector< std::u32string > parts
Definition PreProcessor.hh:109
bool head_is_generated
Definition PreProcessor.hh:106
bool is_index
Definition PreProcessor.hh:111
unsigned int bracket
Definition PreProcessor.hh:110
unsigned int order
Definition PreProcessor.hh:108
std::u32string accu
Definition PreProcessor.hh:107
void erase()
Definition PreProcessor.cc:496
accu_t()
Definition PreProcessor.cc:491
Preprocessing class which takes infix mathematical notation with all sorts of maths shortcuts and tra...
Definition PreProcessor.hh:36
static const char32_t open_brackets[]
Definition PreProcessor.hh:52
bool verbatim_
Definition PreProcessor.hh:74
bool unwind_(unsigned int tolevel, unsigned int bracketgoal=0, bool usebracket=true) const
Definition PreProcessor.cc:342
void strip_outer_brackets() const
Definition PreProcessor.cc:505
friend std::ostream & operator<<(std::ostream &, const preprocessor &)
Definition PreProcessor.cc:67
preprocessor()
Definition PreProcessor.cc:79
void parse_(const std::u32string &)
Definition PreProcessor.cc:520
unsigned int is_bracket_(char32_t c) const
Definition PreProcessor.cc:167
unsigned int current_bracket_(bool deep=false) const
Definition PreProcessor.cc:118
static const char32_t orders[]
Definition PreProcessor.hh:39
void bracket_strings_(char32_t cb, std::u32string &obrack, std::u32string &cbrack) const
Definition PreProcessor.cc:324
bool eat_initial_whitespace_
Definition PreProcessor.hh:76
friend std::istream & operator>>(std::istream &, preprocessor &)
Definition PreProcessor.cc:55
unsigned int cur_pos
Definition PreProcessor.hh:93
bool is_infix_operator_(char32_t c) const
Definition PreProcessor.cc:89
bool is_digits_(const std::u32string &str) const
Definition PreProcessor.cc:141
bool is_already_bracketed_(const std::u32string &str) const
Definition PreProcessor.cc:174
std::vector< accu_t > accus
Definition PreProcessor.hh:114
accu_t cur
Definition PreProcessor.hh:113
void erase()
Definition PreProcessor.cc:511
std::u32string cur_str
Definition PreProcessor.hh:94
unsigned int is_closing_bracket_(char32_t c) const
Definition PreProcessor.cc:149
bool next_is_product_
Definition PreProcessor.hh:75
bool is_link_(char32_t c) const
Definition PreProcessor.cc:84
static const char32_t close_brackets[]
Definition PreProcessor.hh:53
static const char32_t *const order_names[]
Definition PreProcessor.hh:44
void parse_internal_()
Definition PreProcessor.cc:540
bool default_is_product_() const
Definition PreProcessor.cc:131
unsigned int is_opening_bracket_(char32_t c) const
Definition PreProcessor.cc:158
void print_stack() const
Definition PreProcessor.cc:96
char32_t get_token_(char32_t prev_token)
Definition PreProcessor.cc:183
void show_and_throw_(const std::string &str) const
Definition PreProcessor.cc:526
order_labels
Definition PreProcessor.hh:47
@ order_wedge
Definition PreProcessor.hh:51
@ order_colon
Definition PreProcessor.hh:62
@ order_prod
Definition PreProcessor.hh:50
@ order_unequals
Definition PreProcessor.hh:56
@ order_less_than
Definition PreProcessor.hh:57
@ order_set_option
Definition PreProcessor.hh:61
@ order_arrow
Definition PreProcessor.hh:60
@ order_equals
Definition PreProcessor.hh:55
@ order_pow
Definition PreProcessor.hh:48
@ order_conditions
Definition PreProcessor.hh:59
@ order_comma
Definition PreProcessor.hh:63
@ order_plus
Definition PreProcessor.hh:53
@ order_factorial
Definition PreProcessor.hh:47
@ order_greater_than
Definition PreProcessor.hh:58
@ order_tilde
Definition PreProcessor.hh:64
@ order_frac
Definition PreProcessor.hh:49
@ order_minus
Definition PreProcessor.hh:52
@ order_dot
Definition PreProcessor.hh:54