1.690 проблема с Peg
От: Аноним  
Дата: 22.04.12 06:19
Оценка:
Пытаюсь скомпилировать код калькулятора в версии 1.690
(в 1.686 работало)
получаю ошибку на

  [PegGrammar(Options = EmitDebugSources, start, grammar  
        {

Error 18 expected `;' D:\Distr\Docs\NET\Nemerle\Статья 3 Calc\CalcPeg\Calculator.n 25 10 CalcPeg-VS_2008

Error 19 parse error near `{...}' group: unexpected token after expression in sequence (you forget a closing bracket?). D:\Distr\Docs\NET\Nemerle\Статья 3 Calc\CalcPeg\Calculator.n 25 10 CalcPeg-VS_2008



Код калькулятора

namespace Calculator
{
  type LoopTokens = NToken * NToken * int;
  
  [Record] 
  public class ParserFatalError : Exception
  {
    public Pos : int;
  }
  
  /// <summary>
  /// Парсер
  /// </summary>  
  [PegGrammar(Options = EmitDebugSources, start, grammar  
        {
        any                   = ['\u0000'..'\uFFFF']; // распознают любой символ
        digit                 = ['0'..'9']+; // распознает число 
        spaces                = (' ' / '\t')*; // распознает пробельные сивоволы
        
        num                   : int = digit spaces;
        unaryMinus            : int = '-' spaces simplExpr;
        unaryEq               : int = '=' spaces unaryMinus;
        parenthesesExpr       : int = '(' spaces sumOrSub ')' spaces;
        parenthesesExprError  : int = '(' spaces sumOrSub (any / any);
        simplExpr             : int = num / parenthesesExpr / unaryEq 
                                      / parenthesesExprError / simplExprError;
        simplExprError        : int = any;
        inputError            : int = any;
        mulOrDiv              : int = simplExpr (('*' / '/') spaces simplExpr)*;
        sumOrSub              : int = mulOrDiv  (('+' / '-') spaces mulOrDiv )*;
        mainRule              : int = sumOrSub inputError?;
        start                 : int = spaces mainRule !any;
    }
  )]
  public class CalcParser
  {      
    private num(digit : NToken, _ : NToken) : int
    {        
        int.Parse(GetText(digit)); //int.Parse(digit.EndPos);
    }
    
    private unaryEq(_ : NToken, _ : NToken, simplExpr : int) : int
    {
      simplExpr
    }
    
    private unaryMinus(_ : NToken, _ : NToken, simplExpr : int) : int
    {
      - simplExpr
    }
    
    private parenthesesExpr(_ : NToken, _ : NToken, simplExpr : int, 
                            _ : NToken, _ : NToken) : int
    {
      simplExpr
    }
    
    private parenthesesExprError(_ : NToken, _ : NToken, last : int, 
                                 _ : NToken) : int
    {
      throw ParserFatalError("Ожидается закрывающая скобка или "
        + "'+', '-', '*', '/', за которым следует число или выражение",
        last);
    }
    
    private inputError(tok : NToken) : int
    {
      throw ParserFatalError("Ожидается '+', '-', '*', '/', за которым "
        + "следует число или выражение", tok.StartPos);
    }
    
    private simplExprError(tok : NToken) : int
    {
      throw ParserFatalError("Ожидается число или выражение в скобках", 
        tok.StartPos);
    }
    
    private mainRule(expr : int, _ : option[int]) : int
    {
      expr
    }

    private simplExpr(expr : int) : int
    {
      expr
    }
    
    private start(_ : NToken, expr : int) : int
    {
        expr
    }
    
    private mulOrDiv(firstExpr : int, lst : List[LoopTokens]) : int
    {
      DoOpHelper(firstExpr, lst)
    }
    
    private sumOrSub(firstExpr : int, lst : List[LoopTokens]) : int
    { 
      DoOpHelper(firstExpr, lst)
    }
     
    private DoOpHelper(firstExpr : int, lst : List[LoopTokens]) : int
    {
      def doOp(x : int, y : int, op : string) : int
      {
        match (op)
        {
          | "*" => x * y
          | "/" => x / y
          | "+" => x + y
          | "-" => x - y
          | "%" => x % y
          | _   => assert(false);
        }
      }
           
      mutable r = firstExpr;
      
      foreach ((opTok, _, secondTok) in lst)
        r = doOp(r, secondTok, GetText(opTok));
    
      r  
    }
  }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.