#-- attempts to parse a tokenized grammar. The strategy will #-- will be basically shift-reduce. This may be a parser parser #-- delete blank lines /^[ ]*$/d; #-- delete comment lines comming from the lexer /^#/ { i\ p;d; } #-- add the current line to the hold space H; x; #-- convert line breaks to the bar character s/\n/|/g; i\ -------------------------------- p; #-- Grammar Rule: Rule-Left-Side --> Rule-Left-Side Identifier /|RULE-LEFT-SIDE([^)]*)|IDENTIFIER([^)]*)|$/ { s/|RULE-LEFT-SIDE(\([^)]*\))|IDENTIFIER(\([^)]*\))$/|RULE-LEFT-SIDE(\/|\1|\2[:left-bracket:]\\[:left-bracket:][^[:right-bracket:]]*\\[:right-bracket:][:right-bracket:])/; i\ --------------------------------\ Reduce: Rule-Left-Side --> Rule-Left-Side Identifier p; } #-- Grammar Rule: Rule-Left-Side --> Identifier Identifier /|IDENTIFIER([^)]*)|IDENTIFIER([^)]*)|$/ { s/|IDENTIFIER(\([^)]*\))|IDENTIFIER(\([^)]*\))|ARROW$/|RULE-LEFT-SIDE(\/|\1[:left-bracket:]\\[:left-bracket:][^[:right-bracket:]]*\\[:right-bracket:][:right-bracket:])|\2[:left-bracket:]\\[:left-bracket:][^[:right-bracket:]]*\\[:right-bracket:][:right-bracket:])/; i\ --------------------------------\ Reduce: Rule-Left-Side --> Identifier Identifier p; } #-- Grammar Rule: Rule-Left-Side Arrow --> Identifier Arrow /|IDENTIFIER([^)]*)|ARROW$/ { s/|IDENTIFIER(\([^)]*\))|ARROW$/|RULE-LEFT-SIDE(\/|\1[:left-bracket:]\\[:left-bracket:][^[:right-bracket:]]*\\[:right-bracket:][:right-bracket:])|ARROW/; i\ --------------------------------\ Reduce: Rule-Left-Side Arrow --> Identifier Arrow p; } #-- Grammar Rule: Conditional-Substitution --> #-- Condition Left-Brace Substitution Right-Brace /|CONDITION([^)]*)|LEFT-BRACE|SUBSTITUTION([^)]*)|RIGHT-BRACE$/ { s/|CONDITION(\([^)]*\))|LEFT-BRACE|SUBSTITUTION(\([^)]*\))|RIGHT-BRACE$/|CONDITIONAL-SUBSTITUTION(\1 [:newline:]{[:newline:] \2[:newline:]})/; i\ --------------------------------\ Reduce: Condition-Substitution --> Condition Left-Brace Substitution\ Right-Brace p; } #-- Grammar Rule: #-- Substitution --> Identifier Replacement-Set Semi-Colon; /|IDENTIFIER([^)]*)|REPLACEMENT-SET([^)]*)|SEMI-COLON$/ { s/|IDENTIFIER(\([^)]*\))|REPLACEMENT-SET(\([^)]*\))|SEMI-COLON$/|SUBSTITUTION(-RHS- \1\&lbrak;\2\&rbrak;)/; i\ --------------------------------\ Reduce: Substitution ..> Identifier Replacement-set Semi-Colon p; } #-- Grammar Rule: Condition --> Identifier Quoted-String; /|IDENTIFIER([^)]*)|QUOTED-STRING([^)]*)$/ { s/|IDENTIFIER(\([^)]*\))|QUOTED-STRING(\([^)]*\))$/|CONDITION(\1\&lbrak;\2\&rbrak;)/; i\ --------------------------------\ Reduce: Condition --> Identifier Quoted-String; p; } #-- Grammar Rule: Replacement-Set --> Replacement-Set Attribute-Reference; /|REPLACEMENT-SET([^)]*)|ATTRIBUTE-REFERENCE([^)]*)$/ { s/|REPLACEMENT-SET(\([^)]*\))|ATTRIBUTE-REFERENCE(\([^)]*\))$/|REPLACEMENT-SET(\1 \2)/; i\ --------------------------------\ Reduce: Replacement-Set --> Replacement-Set Attribute-Reference; p; } #-- Grammar Rule: Replacement-Set --> Replacement-Set Quoted-String; /|REPLACEMENT-SET([^)]*)|QUOTED-STRING([^)]*)$/ { s/|REPLACEMENT-SET(\([^)]*\))|QUOTED-STRING(\([^)]*\))$/|REPLACEMENT-SET(\1 \2)/; i\ --------------------------------\ Reduce: Replacement-Set --> Replacement-Set Quoted-String; p; } #-- Grammar Rule: Replacement-Set --> Assignment-Equals Quoted-String; /|ASSIGNMENT-EQUALS|QUOTED-STRING([^)]*)$/ { s/|ASSIGNMENT-EQUALS|QUOTED-STRING(\([^)]*\))$/|REPLACEMENT-SET(\1)/; i\ --------------------------------\ Reduce: Replacement-Set --> Assignment-Equals Quoted-String; p; } #-- Grammar Rule: Replacement-Set --> Assignment-Equals Attribute-Reference; /|ASSIGNMENT-EQUALS|ATTRIBUTE-REFERENCE([^)]*)$/ { s/|ASSIGNMENT-EQUALS|ATTRIBUTE-REFERENCE(\([^)]*\))$/|REPLACEMENT-SET(\1)/; i\ --------------------------------\ Reduce: Replacement-Set --> Assignment-Equals Attribute-Reference; p; } x;