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