Annotation of 43BSDReno/share/doc/ps1/15.yacc/ss6, revision 1.1

1.1     ! root        1: .\"    @(#)ss6 6.1 (Berkeley) 5/8/86
        !             2: .\"
        !             3: .SH
        !             4: 6: Precedence
        !             5: .PP
        !             6: There is one common situation
        !             7: where the rules given above for resolving conflicts are not sufficient;
        !             8: this is in the parsing of arithmetic expressions.
        !             9: Most of the commonly used constructions for arithmetic expressions can be naturally
        !            10: described by the notion of
        !            11: .I precedence
        !            12: levels for operators, together with information about left
        !            13: or right associativity.
        !            14: It turns out that ambiguous grammars with appropriate disambiguating rules
        !            15: can be used to create parsers that are faster and easier to
        !            16: write than parsers constructed from unambiguous grammars.
        !            17: The basic notion is to write grammar rules
        !            18: of the form
        !            19: .DS
        !            20: expr  :  expr  OP  expr
        !            21: .DE
        !            22: and
        !            23: .DS
        !            24: expr  :  UNARY  expr
        !            25: .DE
        !            26: for all binary and unary operators desired.
        !            27: This creates a very ambiguous grammar, with many parsing conflicts.
        !            28: As disambiguating rules, the user specifies the precedence, or binding
        !            29: strength, of all the operators, and the associativity
        !            30: of the binary operators.
        !            31: This information is sufficient to allow Yacc to resolve the parsing conflicts
        !            32: in accordance with these rules, and construct a parser that realizes the desired
        !            33: precedences and associativities.
        !            34: .PP
        !            35: The precedences and associativities are attached to tokens in the declarations section.
        !            36: This is done by a series of lines beginning with a Yacc keyword: %left, %right,
        !            37: or %nonassoc, followed by a list of tokens.
        !            38: All of the tokens on the same line are assumed to have the same precedence level
        !            39: and associativity; the lines are listed in
        !            40: order of increasing precedence or binding strength.
        !            41: Thus,
        !            42: .DS
        !            43: %left  \'+\'  \'\-\'
        !            44: %left  \'*\'  \'/\'
        !            45: .DE
        !            46: describes the precedence and associativity of the four arithmetic operators.
        !            47: Plus and minus are left associative, and have lower precedence than
        !            48: star and slash, which are also left associative.
        !            49: The keyword %right is used to describe right associative operators,
        !            50: and the keyword %nonassoc is used to describe operators, like
        !            51: the operator .LT. in Fortran, that may not associate with themselves; thus,
        !            52: .DS
        !            53: A  .LT.  B  .LT.  C
        !            54: .DE
        !            55: is illegal in Fortran, and such an operator would be described with the keyword
        !            56: %nonassoc in Yacc.
        !            57: As an example of the behavior of these declarations, the description
        !            58: .DS
        !            59: %right  \'=\'
        !            60: %left  \'+\'  \'\-\'
        !            61: %left  \'*\'  \'/\'
        !            62: 
        !            63: %%
        !            64: 
        !            65: expr   :       expr  \'=\'  expr
        !            66:        |       expr  \'+\'  expr
        !            67:        |       expr  \'\-\'  expr
        !            68:        |       expr  \'*\'  expr
        !            69:        |       expr  \'/\'  expr
        !            70:        |       NAME
        !            71:        ;
        !            72: .DE
        !            73: might be used to structure the input
        !            74: .DS
        !            75: a  =  b  =  c*d  \-  e  \-  f*g
        !            76: .DE
        !            77: as follows:
        !            78: .DS
        !            79: a = ( b = ( ((c*d)\-e) \- (f*g) ) )
        !            80: .DE
        !            81: When this mechanism is used,
        !            82: unary operators must, in general, be given a precedence.
        !            83: Sometimes a unary operator and a binary operator
        !            84: have the same symbolic representation, but different precedences.
        !            85: An example is unary and binary \'\-\'; unary minus may be given the same
        !            86: strength as multiplication, or even higher, while binary minus has a lower strength than
        !            87: multiplication.
        !            88: The keyword, %prec, changes the precedence level associated with a particular grammar rule.
        !            89: %prec appears immediately after the body of the grammar rule, before the action or closing semicolon,
        !            90: and is followed by a token name or literal.
        !            91: It
        !            92: causes the precedence of the grammar rule to become that of the following token name or literal.
        !            93: For example, to make unary minus have the same precedence as multiplication the rules might resemble:
        !            94: .DS
        !            95: %left  \'+\'  \'\-\'
        !            96: %left  \'*\'  \'/\'
        !            97: 
        !            98: %%
        !            99: 
        !           100: expr   :       expr  \'+\'  expr
        !           101:        |       expr  \'\-\'  expr
        !           102:        |       expr  \'*\'  expr
        !           103:        |       expr  \'/\'  expr
        !           104:        |       \'\-\'  expr      %prec  \'*\'
        !           105:        |       NAME
        !           106:        ;
        !           107: .DE
        !           108: .PP
        !           109: A token declared
        !           110: by %left, %right, and %nonassoc need not be, but may be, declared by %token as well.
        !           111: .PP
        !           112: The precedences and associativities are used by Yacc to
        !           113: resolve parsing conflicts; they give rise to disambiguating rules.
        !           114: Formally, the rules work as follows:
        !           115: .IP 1.
        !           116: The precedences and associativities are recorded for those tokens and literals
        !           117: that have them.
        !           118: .IP 2.
        !           119: A precedence and associativity is associated with each grammar rule; it is the precedence
        !           120: and associativity of the last token or literal in the body of the rule.
        !           121: If the %prec construction is used, it overrides this default.
        !           122: Some grammar rules may have no precedence and associativity associated with them.
        !           123: .IP 3.
        !           124: When there is a reduce/reduce conflict, or there is a shift/reduce conflict
        !           125: and either the input symbol or the grammar rule has no precedence and associativity,
        !           126: then the two disambiguating rules given at the beginning of the section are used,
        !           127: and the conflicts are reported.
        !           128: .IP 4.
        !           129: If there is a shift/reduce conflict, and both the grammar rule and the input character
        !           130: have precedence and associativity associated with them, then the conflict is resolved
        !           131: in favor of the action (shift or reduce) associated with the higher precedence.
        !           132: If the precedences are the same, then the associativity is used; left
        !           133: associative implies reduce, right associative implies shift, and nonassociating
        !           134: implies error.
        !           135: .PP
        !           136: Conflicts resolved by precedence are not counted in the number of shift/reduce and reduce/reduce
        !           137: conflicts reported by Yacc.
        !           138: This means that mistakes in the specification of precedences may
        !           139: disguise errors in the input grammar; it is a good idea to be sparing
        !           140: with precedences, and use them in an essentially ``cookbook'' fashion,
        !           141: until some experience has been gained.
        !           142: The
        !           143: .I y.output
        !           144: file
        !           145: is very useful in deciding whether the parser is actually doing
        !           146: what was intended.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.