Skip to content

Instantly share code, notes, and snippets.

@thosakwe
Last active August 15, 2016 11:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thosakwe/9676ac73b44f87ddfe97f8dd37d9eb23 to your computer and use it in GitHub Desktop.
Save thosakwe/9676ac73b44f87ddfe97f8dd37d9eb23 to your computer and use it in GitHub Desktop.
Some parser thing in Dart
foo(stream) {
if (stream.lookahead("if")) {
var ifNode = stream.consume("if");
var elseIfNode = stream.maybe("else if") || stream.maybe("poop")
}
}
var dot = (str) => str.consume(".");
var minus = (str) => str.consume("-");
var parseIf = (str) => str.consume("if");
var parseElse = (str) => str.consume("else");
// Use a generator to collect?
digits = new TokenGenerator((str) sync* {
while(str.peek().isNumber())
yield str.next();
})
// Parse in sequence
var parseElseIf = parseElse + parseIf;
// Parse maybe
var parseElseMaybeIf = parseElse + maybe(parseIf)
// Parse thrice
var parseElseIfIfIf = parseElse + ntimes(parseIf, 3)
// Parse unlimited
var soManyDots = unlimited(dot);
// Parse an integer or floating point
var floatingPoint = maybe(minus) + digits + dot + digits;
var integer = maybe(minus) + digits;
var number = integer | floatingPoint;
main() async {
var file = new File("foo.bar");
var stream = file.openRead().transform(TokenStream.create(skip: [
" ",
"\n",
"\r",
"\r\n"
]));
var alternatives = [parseIf, parseElse, parseElseIfIfIf, number];
// "first" finds any of the alternatives
// var candidates = stream.first(alternatives);
// Use "next" to select largest token
var token = stream.next(alternatives);
if (token == null) {
// Error reporting isn't so hard, either :)
print("Error at foo.bar:${stream.position} - Expected ${getNames(alternatives)}");
} else {
print("First available token: ${token.text}");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment