Towards Zero-Overhead Disambiguation of Deep Priority Conflicts

**Context** Context-free grammars are widely used for language prototyping and implementation. They allow formalizing the syntax of domain-specific or general-purpose programming languages concisely and declaratively. However, the natural and concise way of writing a context-free grammar is often ambiguous. Therefore, grammar formalisms support extensions in the form of *declarative disambiguation rules* to specify operator precedence and associativity, solving ambiguities that are caused by the subset of the grammar that corresponds to expressions. **Inquiry** Implementing support for declarative disambiguation within a parser typically comes with one or more of the following limitations in practice: a lack of parsing performance, or a lack of modularity (i.e., disallowing the composition of grammar fragments of potentially different languages). The latter subject is generally addressed by scannerless generalized parsers. We aim to equip scannerless generalized parsers with novel disambiguation methods that are inherently performant, without compromising the concerns of modularity and language composition. **Approach** In this paper, we present a novel low-overhead implementation technique for disambiguating deep associativity and priority conflicts in scannerless generalized parsers with lightweight data-dependency. **Knowledge** Ambiguities with respect to operator precedence and associativity arise from combining the various operators of a language. While *shallow conflicts* can be resolved efficiently by one-level tree patterns, *deep conflicts* require more elaborate techniques, because they can occur arbitrarily nested in a tree. Current state-of-the-art approaches to solving deep priority conflicts come with a severe performance overhead. **Grounding** We evaluated our new approach against state-of-the-art declarative disambiguation mechanisms. By parsing a corpus of popular open-source repositories written in Java and OCaml, we found that our approach yields speedups of up to 1.73x over a grammar rewriting technique when parsing programs with deep priority conflicts--with a modest overhead of 1-2 parsing programs without deep conflicts. **Importance** A recent empirical study shows that deep priority conflicts are indeed wide-spread in real-world programs. The study shows that in a corpus of popular OCaml projects on Github, up to 17 deep priority conflicts. However, there is no solution in the literature that addresses efficient disambiguation of deep priority conflicts, with support for modular and composable syntax definitions.

READ FULL TEXT

page 1

page 2

page 3

page 4

research
12/07/2020

Describing the syntax of programming languages using conjunctive and Boolean grammars

A classical result by Floyd ("On the non-existence of a phrase structure...
research
07/04/2018

Program Language Translation Using a Grammar-Driven Tree-to-Tree Model

The task of translating between programming languages differs from the c...
research
04/04/2023

Token-Level Fuzzing

Fuzzing has become a commonly used approach to identifying bugs in compl...
research
02/14/2020

Reusing Static Analysis across Different Domain-Specific Languages using Reference Attribute Grammars

Context: Domain-specific languages (DSLs) enable domain experts to speci...
research
09/05/2023

Parsing Fortran-77 with proprietary extensions

Far from the latest innovations in software development, many organizati...
research
07/08/2019

parboiled2: a macro-based approach for effective generators of parsing expressions grammars in Scala

In today's computerized world, parsing is ubiquitous. Developers parse l...
research
09/18/2019

Default Disambiguation for Online Parsers

Since composed grammars are often ambiguous, grammar composition require...

Please sign up or login with your details

Forgot password? Click here to reset