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  
    }
  }
}
Re: 1.690 проблема с Peg
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.12 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пытаюсь скомпилировать код калькулятора в версии 1.690

А>(в 1.686 работало)
А>получаю ошибку

Проверил на текущих искходниках. Все — ОК. Пример собрался.

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


Судя по всему макрос не подключен. Это может быть из-за:

1. Отсутствия:
using Nemerle.Peg;


2. Из-за того, что к проекту не подключены ссылки на сборки: Nemerle.Peg и Nemerle.Peg.Macros.

3. Указанные в пункте 2 сборки имеют версии не совместимые с текущей версией компилятора. Проверь, что эти сборки лежат в %ProgramFiles%\Nemerle\Net-4.0\ и, что ссылки в проекте указывают на этот каталог.

А>Код калькулятора...


На будущее, код надо приводить полностью (с юсингами и т.п.), так чтобы его можно было скопипастить в файл и сокмпилировать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: 1.690 проблема с Peg
От: Аноним  
Дата: 22.04.12 12:21
Оценка:
Здравствуйте, VladD2, все удалось скомпилировать. На всякий случай отключил из referances все библиотеки Nemerle и подключил их заново. Проблема решилась. Я хотел уточнить поведение VS2008 SP1 в ситуации переустановки Nemerle (через msi) — при открытии старого проекта она выдает сообщение о необходимости пересобрать проект, я это делаю, но в ситуации с макросом Peg пересборка не завершается успешно — пришлось вручную сначала удалить ссылки на Nemerle.Peg и Nemerle.Peg.Macros, а потом добавить их. Такой алгоритм действий должен быть при каждой переустановке Nemerle?
Re[3]: 1.690 проблема с Peg
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.12 15:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, VladD2, все удалось скомпилировать. На всякий случай отключил из referances все библиотеки Nemerle и подключил их заново. Проблема решилась. Я хотел уточнить поведение VS2008 SP1 в ситуации переустановки Nemerle (через msi) — при открытии старого проекта она выдает сообщение о необходимости пересобрать проект, я это делаю, но в ситуации с макросом Peg пересборка не завершается успешно — пришлось вручную сначала удалить ссылки на Nemerle.Peg и Nemerle.Peg.Macros, а потом добавить их. Такой алгоритм действий должен быть при каждой переустановке Nemerle?


Видимо в исходном проекте ссылки на сборки были добавлены с полным указанием версий сборок (это поведение версии 1.0). Надо зайти в свойства сборок и переключить там свойство отвечающее за игнорирование версии сборки. Но это есть только в 1.1.

Для 1.0 придется залезть в файл проекта руками и удалить информацию о версии сборок.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.