lark-parser / lark

Lark is a parsing toolkit for Python, built with a focus on ergonomics, performance and modularity.
MIT License
4.62k stars 395 forks source link

Grammar Syntax For Unordered Groups #1422

Open DennisAtExpleo opened 3 weeks ago

DennisAtExpleo commented 3 weeks ago

Preamble: I've read the docs and searched the issues regarding this topic beforehand and I'm actually kind of surprised it didn't come up yet. So excuse me if I overlooked something here.

Is there a dedicated grammar syntax for unordered groups in lark? Say I want to define a DSL in Lark grammar and I have a set of qualifiers similar to C/C++ which can precede the declaration of a variable in any order, e.g.

private static int a;
static private int b;

Is there a dedicated syntax for this in lark grammar? At the moment, I am solving it by creating an additional terminal which includes all possible combinations of the unordered elements:

decl: qualifier "int" ID ("=" INTEGER)? ";"

qualifier: ("private"? "static"?) | ("static"? "private"?) 

This gets pretty clumsy as soon as you have more than three elements. If not already implemented, I would suggest a solution similar to the syntax in xText, where unordered groups can be defined by combining them using the "&" operator like this:

decl: ("private"? & "static"?) "int" ID ("=" INTEGER)? ";"
erezsh commented 3 weeks ago

Lark doesn't have this feature.

It was implemented in my previous parsing library: https://github.com/erezsh/plyplus/blob/master/plyplus/plyplus.py#L326

It shouldn't be too hard to port this function into Lark's load_grammar.py