diff options
author | John Wiegley <johnw@newartisans.com> | 2009-05-26 23:45:44 -0500 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2009-05-26 23:45:44 -0500 |
commit | 0e9f782a05ab9bc892af40abef84346a16d3baec (patch) | |
tree | f03ab214032d27f2989edf537bcaf8daee11cb28 | |
parent | d2062bb54cad108fe7f9e03fdb0f10d18cc721fc (diff) | |
download | fork-ledger-0e9f782a05ab9bc892af40abef84346a16d3baec.tar.gz fork-ledger-0e9f782a05ab9bc892af40abef84346a16d3baec.tar.bz2 fork-ledger-0e9f782a05ab9bc892af40abef84346a16d3baec.zip |
Added % suffix operator, as in "$1.00 * 10%"
-rw-r--r-- | src/commodity.cc | 4 | ||||
-rw-r--r-- | src/parser.cc | 15 | ||||
-rw-r--r-- | src/token.cc | 5 | ||||
-rw-r--r-- | src/token.h | 2 |
4 files changed, 22 insertions, 4 deletions
diff --git a/src/commodity.cc b/src/commodity.cc index 3e4d1160..67a86b87 100644 --- a/src/commodity.cc +++ b/src/commodity.cc @@ -499,14 +499,14 @@ void commodity_t::parse_symbol(std::istream& in, string& symbol) { // Invalid commodity characters: // SPACE, TAB, NEWLINE, RETURN - // 0-9 . , ; - + * / ^ ? : & | ! = + // 0-9 . , ; - + * / ^ ? : & | ! = % // < > { } [ ] ( ) @ static int invalid_chars[256] = { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 20 */ 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + /* 20 */ 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, /* 30 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 40 */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, diff --git a/src/parser.cc b/src/parser.cc index 39004758..1c78e30d 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -44,10 +44,23 @@ expr_t::parser_t::parse_value_term(std::istream& in, token_t& tok = next_token(in, tflags); switch (tok.kind) { - case token_t::VALUE: + case token_t::VALUE: { node = new op_t(op_t::VALUE); node->set_value(tok.value); + + token_t& postfix_tok = next_token(in, tflags.plus_flags(PARSE_OP_CONTEXT)); + if (postfix_tok.kind == token_t::PERCENT) { + ptr_op_t prev(node); + node = new op_t(op_t::O_DIV); + node->set_left(prev); + ptr_op_t hundred = new op_t(op_t::VALUE); + hundred->set_value(100L); + node->set_right(hundred); + } else { + push_token(postfix_tok); + } break; + } case token_t::IDENT: { string ident = tok.value.as_string(); diff --git a/src/token.cc b/src/token.cc index fde6a0e3..d173c7ec 100644 --- a/src/token.cc +++ b/src/token.cc @@ -278,6 +278,11 @@ void expr_t::token_t::next(std::istream& in, const uint_least8_t pflags) kind = STAR; break; + case '%': + in.get(c); + kind = PERCENT; + break; + case '?': in.get(c); kind = QUERY; diff --git a/src/token.h b/src/token.h index a9b75dd4..85374f6e 100644 --- a/src/token.h +++ b/src/token.h @@ -84,9 +84,9 @@ struct expr_t::token_t : public noncopyable KW_DIV, // div EXCLAM, // !, not + PERCENT, // % KW_AND, // &, &&, and KW_OR, // |, ||, or - KW_MOD, // % KW_IF, // if KW_ELSE, // else |