Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do some changes regarding types and parsing #3

Merged
merged 2 commits into from Oct 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 9 additions & 5 deletions .devcontainer/devcontainer.json
Expand Up @@ -4,12 +4,16 @@
"dockerfile": "Dockerfile",
// Update VARIANT to pick a Dart version
"args": {
"VARIANT": "2"
}
"VARIANT": "2",
},
},
// Set *default* container specific settings.json values on container create.
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
"editor.formatOnSave": true,
"terminal.integrated.shell.linux": "/usr/bin/zsh",
"editor.fontLigatures": true,
"workbench.colorTheme": "Default Dark+",
"editor.fontFamily": "'Jetbrains Mono', Menlo, Monaco, 'Courier New', monospace",
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
Expand All @@ -18,8 +22,8 @@
"redhat.vscode-yaml",
"luanpotter.dart-import",
"jeroen-meijer.pubspec-assist",
"kumar-harsh.graphql-for-vscode"
]
"kumar-harsh.graphql-for-vscode",
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
Expand Down
47 changes: 42 additions & 5 deletions lib/src/grammar.dart
Expand Up @@ -7,15 +7,20 @@ class BeancountGrammar extends GrammarParser {
class BeancountGrammarDefinition extends GrammarDefinition {
const BeancountGrammarDefinition();

@override
Parser start() => ref(value).end();
Parser token(Parser parser) => parser.flatten().trim(anyOf(' \t\r'));

Parser value() => ref((transaction() |
balance() |
accountAction() |
padAction() |
noteAction() |
customAction() |
option() |
fullLineComment())
fullLineComment() |
orgModeSection() |
blankLine() |
ignoredDirective())
.star);

Parser numberToken() => ref(
Expand All @@ -25,7 +30,8 @@ class BeancountGrammarDefinition extends GrammarDefinition {
char('.').seq(digit().plus()).optional());
Parser stringToken() =>
ref(token, char('"') & pattern('^"').star() & char('"'));
Parser flagToken() => ref(token, char('*') | char('!') | string('txn'));
Parser flagToken() =>
ref(token, char('*') | char('!') | string('txn') | string('P'));
Parser dateToken() => ref(
token,
digit().times(4) &
Expand Down Expand Up @@ -80,11 +86,31 @@ class BeancountGrammarDefinition extends GrammarDefinition {
accountToken() &
currencies() &
comment();
Parser padAction() =>
dateToken() & string('pad') & accountToken() & accountToken() & comment();
Parser noteAction() =>
dateToken() & string('note') & accountToken() & stringToken() & comment();
Parser customAction() =>
dateToken() &
string('custom') &
stringToken() &
(accountToken() |
costToken() |
stringToken() |
dateToken() |
currencyToken())
.star() &
comment();
Parser option() =>
string('option') & stringToken() & stringToken() & comment();
Parser fullLineComment() =>
ref(token, char(';') & noneOf('\n').star() & whitespace().star());
Parser comment() => ref(token, fullLineComment() | whitespace().star());
ref(token, char(';') & noneOf('\n').star() & char('\n').optional());
Parser comment() => ref(token,
fullLineComment() | whitespacenlb().star() & char('\n').optional());
Parser orgModeSection() => ref(
token, char('*').plus() & noneOf('\n').star() & char('\n').optional());
Parser blankLine() => char('\n');
Parser ignoredDirective() => noneOf('\n').plus().flatten() & comment();

Parser accountActionPrimitive() => string('open') | string('close');
Parser accountPreffixPrimitive() =>
Expand All @@ -97,3 +123,14 @@ class BeancountGrammarDefinition extends GrammarDefinition {
Parser lowercaseCharacterPrimitive() => pattern('0-9a-z_-');
Parser tagsCharacterPrimitive() => pattern('0-9a-zA-Z-_');
}

Parser<String> whitespacenlb([String message = 'whitespace expected']) {
return CharacterParser(const WhitespaceCharPredicateNonLinebreak(), message);
}

class WhitespaceCharPredicateNonLinebreak extends WhitespaceCharPredicate {
const WhitespaceCharPredicateNonLinebreak();

@override
bool test(int value) => value == 10 ? false : super.test(value);
}