summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-05-26 23:45:44 -0500
committerJohn Wiegley <johnw@newartisans.com>2009-05-26 23:45:44 -0500
commit0e9f782a05ab9bc892af40abef84346a16d3baec (patch)
treef03ab214032d27f2989edf537bcaf8daee11cb28 /src
parentd2062bb54cad108fe7f9e03fdb0f10d18cc721fc (diff)
downloadfork-ledger-0e9f782a05ab9bc892af40abef84346a16d3baec.tar.gz
fork-ledger-0e9f782a05ab9bc892af40abef84346a16d3baec.tar.bz2
fork-ledger-0e9f782a05ab9bc892af40abef84346a16d3baec.zip
Added % suffix operator, as in "$1.00 * 10%"
Diffstat (limited to 'src')
-rw-r--r--src/commodity.cc4
-rw-r--r--src/parser.cc15
-rw-r--r--src/token.cc5
-rw-r--r--src/token.h2
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