Last active
August 15, 2016 11:37
-
-
Save thosakwe/9676ac73b44f87ddfe97f8dd37d9eb23 to your computer and use it in GitHub Desktop.
Some parser thing in Dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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