blob: ccae274939a7ddf9c2709dfcf3f261b99f966a47 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
* Notes on improving error handling in MCS
(from Axel Schreiner <ats@cs.rit.edu>)
I included the 'recover' example with C# as well. Currently the package
is at <http://www.cs.rit.edu/~ats/projects/jay/>. I did change some
names and the embedding that the user does somewhat, i.e., it is not
directly compatible with what you did.
Here is the important part about error recovery. To make the typical
iterations bullet-proof, code them as follows:
opt : // null
| opt WORD { yyErrorFlag = 0; }
| opt error
seq : WORD
| seq WORD { yyErrorFlag = 0; }
| error
| seq error
list : WORD
| list ',' WORD { yyErrorFlag = 0; }
| error
| list error
| list error WORD { yyErrorFlag = 0; }
| list ',' error
i.e., throw in 'error' wherever a token can be. 'yyErrorFlag' need not
be set to zero, but if it is done this way, second errors are caught
earlier. This may introduce s/r conflicts, but they tend to be harmless.
In your case -- the comment concerning error recovery at the beginning
of your compiler jay file -- just adding 'error' to the different
global things won't work. Your example will already have started to
advance in one of the rules and 'error' is then not in the lookahead of
wherever the parse then is. You need to put 'error' into the iteration
above those global things.
|