TextEditor EBNF
From Event-B
EBNF for the TextEditor's syntax
parse_unit = comment? 'machine' identifier_literal ('refines' identifier_literal (',' identifier_literal)*)? ('sees' identifier_literal (',' identifier_literal)*)? ('variables' identifier_list)? ('invariants' labeled_predicate_with_theorem+)? ('variant' variant)? ('events' event+)? end | comment? 'context' identifier_literal ('extends' identifier_literal (',' identifier_literal)*)? ('sets' identifier_list)? ('constants' identifier_list)? ('axioms' labeled_predicate_with_theorem+)? end ; variant = comment? expression ; event = comment? convergence? 'event' identifier_literal event_refinement? ('any' identifier_list)? ('where' labeled_predicate+)? ('with' labeled_predicate+)? ('then' labeled_action+)? ; convergence = 'ordinary' | 'convergent' | 'anticipated' ; event_refinement = 'refines' identifier_literal (',' identifier_literal)* | 'extends' identifier_literal ; labeled_action = comment? '@' identifier_literal action ; labeled_predicate = comment? '@' identifier_literal predicate ; labeled_predicate_with_theorem = comment? '@' identifier_literal predicate | comment? 'theorem' '@' identifier_literal predicate ; identifier = comment? identifier_literal ; identifier_list = identifier (',' identifier)* ; comment = '//' string-to-next-linebreak | '/*' string '*/' ;