Combinator Parser修改错误处理方法

Combinator Parser修改错误处理方法
    在实验了 CMinus语法分析器的错误处理之后发现一个问题, Combinator Parser返回的错误是最上级的错误,而不是最底层的错误。譬如下面的例子:
 1  void  BubbleSort( int *  Input ,  int  Count)
 2  {
 3     int  i = 0 ;
 4     while (i < Count - 1 )
 5    {
 6       int  j = Count - 2 ;
 7       while (j >== i)
 8      {
 9         if (Input[j] > Input[j + 1 ])
10        {
11           int  Temp = Input[j];
12          Input[j] = Input[j + 1 ];
13          Input[j + 1 ] = Temp;
14        }
15        j -= 1 ;
16      }
17      i += 1 ;
18    }
19  }
    第七行的j>==1多了一个等于号,因此语法分析的时候错误应该指向这一行。但是现在有了Bug,变成了在第一行出错,因为这个时候一个declaration都没被分析完!于是我想了一个办法,就是无论有没有有效错误,我都将错误以及它的位置记录下来。如果新的错误比旧的错误远,那么使用新的错误。支持歧义的语法分析器也只需要一个错误,所以可以这么做。

    于是现在 CMinus语法分析器终于给出了所期望的结果:
Combinator Parser修改错误处理方法_第1张图片

    相应的 分析器代码也需要修改一点点地方,主要是输出错误信息的那部分:
 1  try
 2  {
 3      VL_CpLexer::_Result LexResult = Lexer.Parse(Code.Buffer());
 4       if (LexResult.Second.First)
 5      {
 6          Error.Info.Line = LexResult.Second.Second;
 7          Error.Message = L " 遇到不可识别的记号。 " ;
 8      }
 9       else
10      {
11           return  Parser.Parse(LexResult.First.Head).Head -> Data.First;
12      }
13  }
14  catch ( const  VL_CpException < VL_CpTokenNodePtr >&  e)
15  {
16       if (e.Input)
17      {
18          Error.Info.Line = e.Input -> Data.Line;
19          Error.Info.Token = VUnicodeString(e.Input -> Data.Start,e.Input -> Data.Length);
20          Error.Message = L " 记号附近发生语法错误。 " ;
21      }
22       else
23      {
24          Error.Info.Line =- 1 ;
25          Error.Message = L " 意外的文件结束。 " ;
26      }
27  }

你可能感兴趣的:(Combinator Parser修改错误处理方法)