%% %name SubstitutionGrm %pos int %arg (lookup): string -> string %term DOLLAR | TEXT of string | LEFT_PARENTHESIS | LEFT_BRACE | RIGHT_PARENTHESIS | RIGHT_BRACE | EOF %nonterm STRING of string | LIST of string list | PORTION of string | VARIABLE of string | PARENTHESIZED of string list | INSIDE_PARENTHESES of string list | BRACED of string list | INSIDE_BRACES of string list %eop EOF %noshift EOF %start STRING %% STRING: LIST (concat LIST) LIST: (nil) | PORTION LIST (PORTION :: LIST) PORTION: TEXT (TEXT) | VARIABLE (lookup VARIABLE) VARIABLE: DOLLAR TEXT (TEXT) | PARENTHESIZED (concat PARENTHESIZED) | BRACED (concat BRACED) PARENTHESIZED: LEFT_PARENTHESIS INSIDE_PARENTHESES RIGHT_PARENTHESIS (INSIDE_PARENTHESES) INSIDE_PARENTHESES: (nil) | TEXT INSIDE_PARENTHESES (TEXT :: INSIDE_PARENTHESES) | LEFT_PARENTHESIS INSIDE_PARENTHESES RIGHT_PARENTHESIS INSIDE_PARENTHESES ("(" :: INSIDE_PARENTHESES1 @ ")" :: INSIDE_PARENTHESES2) BRACED: LEFT_BRACE INSIDE_BRACES RIGHT_BRACE (INSIDE_BRACES) INSIDE_BRACES: (nil) | TEXT INSIDE_BRACES (TEXT :: INSIDE_BRACES) | LEFT_BRACE INSIDE_BRACES RIGHT_BRACE INSIDE_BRACES ("{" :: INSIDE_BRACES1 @ "}" :: INSIDE_BRACES2)