Comments (10)
I'll also note that !?rule
works but switching the order to ?!rule
is not allowed.
from lark.
Hi Richard, one simple way to keep a token in the tree, is to give it a name. For example:
?type: "(" type ")"
| BOOL
| type "→" type
BOOL: "bool"
However, a little design suggestion: It's usually better to name branches (for example, using an alias) rather than leave unnecessary tokens. It makes the tree easier to process later, when using transformers, and imho just in general.
from lark.
one simple way to keep a token in the tree, is to give it a name
Yeah, I considered that too. I ended up needing to name almost all of the my tokens which was a bit heavyweight for me. The !rule
approach works better for my particular needs. I just thought I'd suggest having a lightweight way to enable token keeping on a per-token basis rather than per-rule (!rule
) or per-grammar (keep_all_tokens
). If you don't see the need then I can live with using !rule
.
It's usually better to name branches (for example, using an alias) rather than leave unnecessary tokens.
I totally agree, if what you are doing is writing a parser for a known language. Which probably 99% of the time is what users of lark will be doing.
I'm doing something a bit different though, I'm taking user-supplied EBNF, using that to parse user-supplied strings, Doing Stuff with the resulting parse tree, and then displaying it. So because I don't actually know the language being parsed, if I throw away tokens I have no way to recover and render them later.
from lark.
I'm not entirely against adding a modifier to anonymous tokens (perhaps: "token"! )
I'll be happy to hear more about this use-case. Maybe it will persuade me that such a modifier is useful, or maybe I can suggest a better solution. Also, I'm curious about the purpose of your project. (email is okay too)
from lark.
One use-case I can think of is a less invasive solution to determine the location of a subtree (see #12). Let's say I have a rule like that:
fun_decl: "fun" NAME "(" param_list? ")" "->" type_ident "{" stmt_list? "}"
It might be desirable to access the first and last terminals (resp. "fun" and "}") to determine the start and end locations of a function declaration.
from lark.
If Tree nodes (i.e. rules) had a 'range' attribute, indicating the start and end position of the rule in the text, would that solve the problem?
Nevermind, let's discuss this in issue #12
from lark.
@richardcooper Did you manage to make it work with keep_all_tokens?
If not, I have a suggestion for you, if you don't mind getting a little creative.
from lark.
keep_all_tokens
isn't fully implemented yet is it? I'm currently using !rules
like this:
!?type: bracketed_type
| "Bool"
| type "→" type
?bracketed_type: "(" type ")"
in order to keep the "→" but discard the brackets.
I'm open to more creative solutions.
from lark.
Sorry, my mistake, I just now pushed the patch to master. keep_all_tokens should work now.
I'll get back to you regarding the creative solution, it still needs some working out.
from lark.
Closing this issue. Feel free to open a new one if you need anything else.
from lark.
Related Issues (20)
- Please remove the duplicate PYPI record HOT 1
- Transformer raises AttributeError when a tree is only a token HOT 1
- Import lark grammar written in one python project into another HOT 2
- Need help figuring out why some characters are captured in __ANON_ HOT 2
- Need help with terminals not showing up as expected
- Transforming tree after standalone parser results in different AST HOT 4
- Making a comment by using regular expression HOT 5
- earley very, very slow HOT 24
- Cant read `meta` from Tree or Token? HOT 5
- How to define lark grammar for best parsing performance HOT 8
- Unable to parse Arabic text HOT 3
- Incorrect start_pos / end_pos in the tree HOT 8
- Add `outlines` in the list of projects using Lark HOT 2
- Lark.open_from_package() does not support namespace packages HOT 2
- Stand-alone program cannot be run HOT 4
- Issue of installing lark in Python HOT 1
- Pipe in terminal regex not working as expected HOT 1
- Transformer Not Applying Expected Transformations in Lark Parser HOT 3
- Deprecation Warning HOT 6
- accepts() vs choices() in InteractiveParser HOT 10
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 lark.