lark icon indicating copy to clipboard operation
lark copied to clipboard

Grammar Syntax For Unordered Groups

Open DennisAtExpleo opened this issue 1 year ago • 2 comments

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)? ";"

DennisAtExpleo avatar Jun 14 '24 15:06 DennisAtExpleo

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

erezsh avatar Jun 14 '24 15:06 erezsh

Oh, lol! I thought you meant group theory. As we all know that usually finite groups come without any possible ordering that is compatible with the group law. 😂🤓

FruitfulApproach avatar Sep 04 '24 05:09 FruitfulApproach