Welcome to mirror list, hosted at ThFree Co, Russian Federation.

NOTES « mcs « mcs - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
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.