|
|
1.1 ! root 1: .\" @(#)ssb 6.1 (Berkeley) 5/8/86 ! 2: .\" ! 3: .SH ! 4: Appendix B: Yacc Input Syntax ! 5: .PP ! 6: This Appendix has a description of the Yacc input syntax, as a Yacc specification. ! 7: Context dependencies, etc., are not considered. ! 8: Ironically, the Yacc input specification language ! 9: is most naturally specified as an LR(2) grammar; the sticky ! 10: part comes when an identifier is seen in a rule, immediately ! 11: following an action. ! 12: If this identifier is followed by a colon, it is the start of the ! 13: next rule; otherwise ! 14: it is a continuation of the current rule, which just happens to have ! 15: an action embedded in it. ! 16: As implemented, the lexical analyzer looks ! 17: ahead after seeing an identifier, and ! 18: decide whether the next token (skipping blanks, newlines, comments, etc.) ! 19: is a colon. ! 20: If so, it returns the token C_IDENTIFIER. ! 21: Otherwise, it returns IDENTIFIER. ! 22: Literals (quoted strings) are also returned as IDENTIFIERS, ! 23: but never as part of C_IDENTIFIERs. ! 24: .sp ! 25: .nf ! 26: .ta .6i 1.2i 1.8i 2.4i 3i 3.6i ! 27: ! 28: /* grammar for the input to Yacc */ ! 29: ! 30: /* basic entities */ ! 31: %token IDENTIFIER /* includes identifiers and literals */ ! 32: %token C_IDENTIFIER /* identifier (but not literal) followed by colon */ ! 33: %token NUMBER /* [0-9]+ */ ! 34: ! 35: /* reserved words: %type => TYPE, %left => LEFT, etc. */ ! 36: ! 37: %token LEFT RIGHT NONASSOC TOKEN PREC TYPE START UNION ! 38: ! 39: %token MARK /* the %% mark */ ! 40: %token LCURL /* the %{ mark */ ! 41: %token RCURL /* the %} mark */ ! 42: ! 43: /* ascii character literals stand for themselves */ ! 44: ! 45: %start spec ! 46: ! 47: %% ! 48: ! 49: spec : defs MARK rules tail ! 50: ; ! 51: ! 52: tail : MARK { \fIIn this action, eat up the rest of the file\fR } ! 53: | /* empty: the second MARK is optional */ ! 54: ; ! 55: ! 56: defs : /* empty */ ! 57: | defs def ! 58: ; ! 59: ! 60: def : START IDENTIFIER ! 61: | UNION { \fICopy union definition to output\fR } ! 62: | LCURL { \fICopy C code to output file\fR } RCURL ! 63: | ndefs rword tag nlist ! 64: ; ! 65: ! 66: rword : TOKEN ! 67: | LEFT ! 68: | RIGHT ! 69: | NONASSOC ! 70: | TYPE ! 71: ; ! 72: ! 73: tag : /* empty: union tag is optional */ ! 74: | \'<\' IDENTIFIER \'>\' ! 75: ; ! 76: ! 77: nlist : nmno ! 78: | nlist nmno ! 79: | nlist \',\' nmno ! 80: ; ! 81: ! 82: nmno : IDENTIFIER /* NOTE: literal illegal with %type */ ! 83: | IDENTIFIER NUMBER /* NOTE: illegal with %type */ ! 84: ; ! 85: ! 86: /* rules section */ ! 87: ! 88: rules : C_IDENTIFIER rbody prec ! 89: | rules rule ! 90: ; ! 91: ! 92: rule : C_IDENTIFIER rbody prec ! 93: | '|' rbody prec ! 94: ; ! 95: ! 96: rbody : /* empty */ ! 97: | rbody IDENTIFIER ! 98: | rbody act ! 99: ; ! 100: ! 101: act : \'{\' { \fICopy action, translate $$, etc.\fR } \'}\' ! 102: ; ! 103: ! 104: prec : /* empty */ ! 105: | PREC IDENTIFIER ! 106: | PREC IDENTIFIER act ! 107: | prec \';\' ! 108: ; ! 109: .fi ! 110: .bp
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.