Comments (4)
Hi Richard, thank you for bringing this to my attention.
It embarrasses me to admit, but apparently there is a bug in my lalr generator. It's possible that your grammar is not lalr(1)-compatible, but then lark should produce a clear exception. The fact that it didn't, but instead produced wrong results, is troubling. I will have to look deeper into it.
I believe the non-determinism will disappear once that bug is resolved.
Regardless, there is also a small error in your grammar: The regular expressions for "var" and "true"/"false" are in collision, which means that variable names like "falsetto" can make the lexer produce undesired results. It's better to avoid regexps if at all possible: Lark can automatically resolve a collision between a regexp and a string, but not between two regexps.
Anyway, until I fix my bug, allow me to suggest that you use the Earley algorithm, which parses your grammar correctly. It still uses a lexer, so you won't feel a big difference in performance (and probably won't notice at all).
Here is your grammar with tiny modifications, working with Earley: (It works on my machine ™️ )
from lark import Lark
parser = Lark("""
?term: "(" term ")"
| "true" -> true
| "false" -> false
| "if" term "then" term "else" term
| var
| "λ" var ":" type "." term -> lambda
| term term
?type: "(" type ")"
| "Bool" -> bool
| type "→" type
?var: VAR
VAR: ("a".."z")+ "'"*
%import common.WS
%ignore WS
""", start='term', lexer='standard', parser='earley', ambiguity='explicit')
print(parser.parse("(λa:(Bool→Bool). a) (λb:Bool. b)").pretty())
I hope this helps. I will keep you updated regarding the bug in the lalr parser generator.
from lark.
Hi again, I did not yet address the issue of lark's misreporting of grammar errors, however --
I did fix the bug which made some branches disappear. Apparently there was a subtle bug that you activated with the "term: term term" production. Well, it's fixed now, and I get consistent and seemingly correct results running the modified grammar with LALR.
So, replace the last line with:
""", start='term', lexer='standard', parser='lalr')
And let me know if works, or if there are other issues hindering your progress.
(I'm keeping the issue open, since the error reports are still problematic.)
from lark.
Using the 'lalr ' parser in the latest code does seem to have fixed both the vanishing branch bug and the non-determinism when I use the modified grammar. Thank you!
When I use my original grammar (with all the regexes) the vanishing branch bug is fixed but the non-determinism is still present (As expected)
I had originally used regexes because I want to keep those terminals. I'll open a new issue about that.
from lark.
I'm considering this issue as fixed. The only thing left is to improve the error messages.
from lark.
Related Issues (20)
- 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
- No such file or directory: 'COMMON.lark' HOT 4
- Grammar Syntax For Unordered Groups HOT 1
- Is it possible to parse parts of the input? HOT 12
- Forgiving syntax HOT 3
- Post 1388 changes HOT 4
- Dynamic Earley: Incorrect value for SymbolNode.end
- Inconsistent parse results from simple ambiguous grammar HOT 4
- Superfluous identical ambiguities in Earley HOT 2
- Porting from pyparsing match_previous_literal HOT 4
- _TERMINAL appears in tree HOT 1
- Lexer matches shorter literals before longer literals HOT 1
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.