|
|
1.1 root 1: 5/18/78
2: A new version of Yacc has been installed which contains some new
3: features relating to error recovery, detection of funny conditions in the
4: grammar, and strong typing. Existing grammars should continue to work,
5: with the possible exception of somewhat better error recovery behavior.
6: More details follow:
7:
8: *** Ratfor and EFL Yacc are dead. Long live C!
9:
10: *** The y.tab.c file now uses the # line feature to reflect
11: most error conditions in actions, etc., back to the yacc source
12: file, rather than the y.tab.c file. As always with such features,
13: lookahead may cause the line number to be one too large
14: occasionally.
15:
16: *** The error recovery algorithm has been changed to cause the
17: parser never to reduce on a state where there is a shift
18: on the special token `error'. This has the effect of causing
19: the error recovery action to take place somewhat closer to the
20: location of the error than previously. It does not affect the
21: behavior of the parser in the absence of errors. The parse
22: tables may be 1-2% larger as a result of this change.
23:
24: *** Yacc now detects the existence of nonterminals in the grammar
25: which can never derive any strings of tokens (even the empty string).
26: The simplest example is the grammar:
27: %%
28: s : s 'a' ;
29: Here, one must reduce `s' in order to reduce `s': the
30: parser would always report error. If such nonterminals are
31: present, Yacc reports all such, then terminates.
32:
33: *** There is a new reserved word, %start. When used in the declarations
34: section, it may be used to declare the start symbol of the grammar.
35: If %start does not appear, the start symbol is, as at present, the
36: first nonterminal symbol encountered.
37:
38: *** Yacc produced parsers are notorious for producing many many
39: comments from lint. The problem is the value stack of the
40: parser, which typically may contain integers, pointers, and
41: possibly even floating point, etc., values. The lack
42: of tight specification of this stack leads to potential
43: nonportability, and considerable loss of the diagnostic power
44: of lint. Thus, some new features have been added which make use
45: of the new structure and union facilities of C. In effect,
46: the user of Yacc may `honestly' declare the value stack, as
47: well as the lexical interface variable, yylval, to be unions
48: of all the types desired. Yacc will keep track of the types
49: declared for all terminals and nonterminals, and automatically
50: insert the appropriate union tag for all constructions such
51: as $1, $$, etc. It is up to the user to supply the appropriate
52: union declaration, and to declare the type of all the terminal
53: and nonterminal symbols which will have values. If the type
54: declaration feature is used at all, it must be used correctly;
55: if it is not used, the default values are integers, as at present.
56: The new type declaration features are described below:
57:
58: *** There is a new keyword, %union. A construction such as
59: %union {
60: int inttag;
61: float floattag;
62: struct mumble *ptrtag;
63: }
64: can be used, in the declarations section, to declare
65: the type of the yacc stack. The declaration is
66: effectively copied to the y.tab.c file, and, if the -d
67: option is present, to the y.tab.h file as well. The
68: declaration is used to declare the typedef YYSTYPE, which is the
69: type of the value stack. If the -d option is present,
70: the declaration
71: extern YYSTYPE yylval;
72: is also placed onto the y.tab.h file. Note that the lexical
73: analyzer must be changed to use the appropriate union tag when
74: assigning values. It is not necessary that the %union
75: mechanism be used, as long as there is a union type YYSTYPE
76: defined in the declarations section.
77:
78: *** The %token, %left, %right, and %nonassoc declarations now
79: accept a union tag, enclosed in angle brackets (<...>), immediately
80: after the keyword. All tokens mentioned in that declaration are
81: taken to have the appropriate type.
82:
83: *** There is a new keyword, %type, also followed by a union tag
84: in angle brackets, which may be used in the declarations section to
85: declare nonterminal symbols to have a particular type.
86:
87: In both cases, whenever a $$ or $n is encountered in an action,
88: the appropriate union tag is supplied by Yacc. Once any type is
89: declared, it is an error to use a $$ or $n whose type is unknown.
90: It is also illegal to have a grammar rule whose LHS has a type,
91: but the rule has no action and the default action { $$ = $1; }
92: would be inapplicable because $1 had a different type.
93:
94: *** There are occasional times when the type of something is
95: not known (for example, when an action within a rule returns a
96: value). In this case, the $$ and $n syntax is extended
97: to permit the declaration of the type: the syntax is
98: $<tag>$
99: and
100: $<tag>n
101: respectively. This rather strange syntax is necessitated by the
102: need to distinguish the <> surrounding the tag from the < and >
103: operators of C in the action. It is anticipated that the usage
104: will be rare.
105:
106: *** As always, report gripes, bugs, suggestions to SCJ ***
107:
108: 12/01/76
109: A newer version of Yacc has been installed which copies the actions directly
110: into the parser, rather than gathering them into a separate routine.
111: The advantages include
112: 1. It's faster
113: 2. You can return a value from yyparse (and stop parsing...) by
114: saying `return(x);' in an action
115: 3. There are macros which simulate various interesting parsing
116: actions:
117: YYERROR causes the parser to behave as if a syntax
118: error had been encountered (i.e., do error recovery)
119: YYACCEPT causes a return from yyparse with a value of 0
120: YYABORT causes a return from yyparse with a value of 1
121:
122: The repositioning of the actions may cause scope problems
123: for some people who include lexical analyzers in funny places.
124: This can probably be avoided by using another
125: new feature: the `-d' option.
126: Invoking Yacc with the -d option causes the #defines
127: generated by Yacc to be written out onto a file
128: called "y.tab.h". This can then be included as desired
129: in lexical analyzers, etc.
130:
131: 11/28/76
132: A new version of Yacc has been installed which permits actions within
133: rules. For such actions, $$ and $1, $2, etc. continue to have their
134: usual meanings. An error message is returned if any $n refers to
135: a value lying to the right of the action in the rule.
136:
137: These internal actions are assumed to return a value, which is accessed
138: through the $n mechanism.
139:
140: In the y.output file, the actions are referred to by created nonterminal
141: names of the form $$nnn.
142:
143: All actions within rules are assumed to be distinct. If some actions
144: are the same, Yacc might report reduce/reduce conflicts which could
145: be resolved by explicitly identifying identical actions; does anyone
146: have a good idea for a syntax to do this?
147:
148: In the new Yacc, the = sign may now be omitted in action constructions
149: of the form ={ ... }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.