Comments (9)
Hi!
There's no built-in combinator; I think it would be reasonably easy to write one, using similar tactics to Sprache's implementation - keen to explore how it might look.
If you want to drop this into your own project I think it's roughly:
interface ILocated
{
TextSpan Location { get; set; }
}
static TextParser<T> WithLocation<T>(this TextParser<T> parser)
where T: ILocated
{
return i => {
var inner = parser(i);
if (!inner.HasValue) return inner;
inner.Value.Location = inner.Location;
return inner;
};
}
(Sketched in browser, no idea whether or not this will compile as-is ;-))
HTH,
Nick
from superpower.
Thanks for the follow-up! That's great.
I think the proper span length could be reported using something like:
return i => {
var inner = parser(i);
if (!inner.HasValue) return inner;
inner.Value.Location = inner.Location.Until(inner.Remainder);
return inner;
};
Let's leave this open as a nod towards implementing it within Superpower sometime in the future :-)
from superpower.
I have been trying to get this to work on a TokenListParser instead of a TextParser but I can't figure out how to retrieve the Token source position from the parsed TokenListParserResult. I want to have similar behaviour to the Positioned() method from Sprache but my grammar is fully Tokenized at this stage. I have bellow my adaptation of the WithLocation method but for TokenListParser. Is this possible with the current interface of Superpower? Am I missing something?
public static TokenListParser<TKind, T> WithLocation<TKind, T>(this TokenListParser<TKind, T> parser)
where T : ILocated
{
return i => {
var inner = parser(i);
if (!inner.HasValue) return inner;
inner.Value.Location = //Can't figure out how to retrieve position information from inner
return inner;
};
}
from superpower.
Hi @JoeMGomes - unfortunately no time to dig in properly but hopefully this helps:
The start index of the match within the input will be inner.Location.First().Position.Absolute
.
The exclusive end index will be inner.Remainder.First().Position.Absolute
.
In the second case it's also possible that the remainder token list will be empty, which would mean "matched until end of stream".
from superpower.
Ah, thank you! I’ll look at it and write back if there will be problems hard to fix. (Or if it goes smoothly, anyway.)
from superpower.
Hi again, I’ve tested this code, and it works like a charm!
…Almost. Length
of all TextSpan
s returned seems always be the same (and to be the full length of the string parsed). Is it expected? I used Superpower 2.3.0 from NuGet, and here is my source and some examples.
I’m okay with having only start positions, though. Thanks once more!
from superpower.
This modification works nicely. 🙂
from superpower.
The start index of the match within the input will be
inner.Location.First().Position.Absolute
.
This worked nicely for me! Thank you very much! Any reason for this not to be part of Superpower?
from superpower.
That's good to know @JoeMGomes 👍
Just design and implementation time constraints, currently, but it seems like a worthwhile inclusion for the future 👍
from superpower.
Related Issues (20)
- Zero allocation parsing? HOT 1
- Unit Testing? HOT 1
- Is it normal that NaturalUInt32 raise System.OverflowException : Value was either too large or too small for a UInt32 ? HOT 2
- [Request] Need a new introductory blog for v2 (or v3) HOT 1
- Questions: My On Going Questions HOT 4
- Parsing confusion: Zero-width parsers, what rewinds and when, and properly returning a "failed" parse? HOT 4
- [Question] New Release? HOT 1
- Thank you for writing superpower HOT 1
- Better `Message` HOT 5
- Improve error reporting for some failed match scenarios HOT 9
- Using backslash in CStyle QuotedString causes syntax error HOT 1
- `OptionalOrNull()` HOT 2
- Send parser value into another parser HOT 1
- Tokenizer and Parser Assistance HOT 3
- TokenizerBuilder and Mapping CLR Types HOT 2
- Dynamically referencing Parsers via Decorators for TokenizerBuilder HOT 2
- Some way to check the next token HOT 3
- Missing: Cheat sheet for upgrading from Sprache to Superpower HOT 1
- How to handle consecutive delimiters HOT 6
- dotnet 8 upgrade? HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from superpower.