Skip to content

Add support for semantic predicates#763

Open
ydah wants to merge 1 commit intoruby:masterfrom
ydah:semantic_predicate
Open

Add support for semantic predicates#763
ydah wants to merge 1 commit intoruby:masterfrom
ydah:semantic_predicate

Conversation

@ydah
Copy link
Member

@ydah ydah commented Dec 18, 2025

Overview

This PR adds support for semantic predicates to Lrama, allowing conditional enabling of grammar rules based on runtime conditions.

Syntax:

rule : {expression}? TOKEN { action } | TOKEN { action } ;

The predicate {expression}? is evaluated at parse time. If it returns true (non-zero), the alternative is enabled.

Example:

widget : {new_syntax}? WIDGET ID NEW_ARG { printf("New syntax\n"); } | {!new_syntax}? WIDGET ID OLD_ARG { printf("Old syntax\n"); } ;

Motivation / Background

Semantic predicates enable context-sensitive parsing, which is useful for:

  • Version-dependent syntax (e.g., supporting both old and new language features)
  • Context-sensitive keywords (e.g., async in JavaScript that behaves differently based on context)
  • Conditional grammar rules based on parser state

This feature is similar to ANTLR4's semantic predicates and fills a gap in Lrama's capabilities for handling context-dependent grammars. Leading predicates (at the start of a rule) affect prediction, while trailing predicates act as validation.

This PR adds support for semantic predicates to Lrama, allowing conditional enabling of grammar rules based on runtime conditions. Syntax: ```yacc rule : {expression}? TOKEN { action } | TOKEN { action } ; ``` The predicate {expression}? is evaluated at parse time. If it returns true (non-zero), the alternative is enabled. Example: ```yacc widget : {new_syntax}? WIDGET ID NEW_ARG { printf("New syntax\n"); } | {!new_syntax}? WIDGET ID OLD_ARG { printf("Old syntax\n"); } ; ``` Motivation / Background Semantic predicates enable context-sensitive parsing, which is useful for: - Version-dependent syntax (e.g., supporting both old and new language features) - Context-sensitive keywords (e.g., async in JavaScript that behaves differently based on context) - Conditional grammar rules based on parser state This feature is similar to ANTLR4's semantic predicates and fills a gap in Lrama's capabilities for handling context-dependent grammars. Leading predicates (at the start of a rule) affect prediction, while trailing predicates act as validation.
@ydah ydah force-pushed the semantic_predicate branch from 428b80f to 11c67b4 Compare December 18, 2025 14:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant