diff options
author | Igbanam Ogbuluijah <390059+igbanam@users.noreply.github.com> | 2024-06-25 09:34:03 +0000 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2024-06-25 14:26:16 -0700 |
commit | d4e3c6be764dfa0d70fa96847d1325bcd37bc0cc (patch) | |
tree | a621b3e2f62e00378383e66d58f727ac286949b6 /src/query.cc | |
parent | f8624f59419090aa59ab2f75626a7b1102558dfd (diff) | |
download | fork-ledger-d4e3c6be764dfa0d70fa96847d1325bcd37bc0cc.tar.gz fork-ledger-d4e3c6be764dfa0d70fa96847d1325bcd37bc0cc.tar.bz2 fork-ledger-d4e3c6be764dfa0d70fa96847d1325bcd37bc0cc.zip |
Fix Query Parser for Automated Transactions (#1)
* Add failing test for use case
TBH I don't know what I'm doing here, but this seems to fail for the
right reasons enough to reflect the parser bug here.
* Append to the ident on a closing brace ')'
When parsing the automated rule, a scanner reads the line left-to-right
char-by-char. The default behaviour is to append the char under the
cursor to some `ident` string. When the cursor is on a ')', it skips the
default handling and switches into some special handling: it tries to
test the string it's reading if it's one of the keywords it knows, to
select which type of token just got scanned. If what was scanned is not
a known token, it defaults to `token_t::TERM` and returns a new token
with the currently accumulated `ident` as a `token_t::TERM`. Issue is,
since it skipped the appending to do some custom handling, the
`token_t::TERM` will always be without its closing brace. The scanner
needs to append the character under the cursor if it's falling through
to default processing.
* fix test case
- ensure proper spacing for the posting to have an amount
- ensure the posting balances against an account
- the meaning of the number after `->` is the exit code
* undo wrong approach
* consume_next if unbalanced_braces
* how this can be extended
Diffstat (limited to 'src/query.cc')
-rw-r--r-- | src/query.cc | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/query.cc b/src/query.cc index 705ba151..a157b4d1 100644 --- a/src/query.cc +++ b/src/query.cc @@ -36,6 +36,17 @@ namespace ledger { +// TODO: Extend this to handle all characters which define enclosures +bool query_t::lexer_t::unbalanced_braces(string str) { + int balance = 0; + for (char& c : str) { + if (c == '(') ++balance; + else if (c == ')') + if (--balance < 0) return true; + } + return balance != 0; +} + query_t::lexer_t::token_t query_t::lexer_t::next_token(query_t::lexer_t::token_t::kind_t tok_context) { @@ -157,6 +168,8 @@ query_t::lexer_t::next_token(query_t::lexer_t::token_t::kind_t tok_context) break; case ')': + if (unbalanced_braces(ident)) + consume_next = true; if (! consume_next && tok_context == token_t::TOK_EXPR) goto test_ident; // fall through... |