не компилирует variant
От: JеS Россия  
Дата: 20.01.11 17:38
Оценка:
Никак не хочет компилировать следующий код.

using System;
using System.Console;
using Nemerle.Utility;

module Program
{
  Main() : void
  {
    variant A
    {
     | B
     | C
    }
   
    WriteLine("Hi!");
  }
}


выдает ошибки:
Error: parse error near keyword 'variant': unexpected keyword in expression context
Error: expected ';'
Error: parse error near identifier 'A': unexpected token after expression in sequence

все относится к строке 9 ( variant A )

Компилирую в Nemerle Studio интегрированной в VS 2008 shell

Подскажите чем вызвана ошибка.
Re: не компилирует variant
От: hardcase Пират http://nemerle.org
Дата: 20.01.11 17:40
Оценка:
Здравствуйте, JеS, Вы писали:

JеS>Подскажите чем вызвана ошибка.


Типы нельзя объявлять внутри функций и методов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: не компилирует variant
От: catbert  
Дата: 20.01.11 17:42
Оценка:
Здравствуйте, JеS, Вы писали:

JеS>Подскажите чем вызвана ошибка.


Компилятор ведь жалуется: unexpected keyword in expression context.

Вариант — это вроде как класс. Его нет смысла определять внутри метода. Вынесите определение за код метода:

 using System;
 using System.Console;
 using Nemerle.Utility;

 module Program
 {
  variant A
  {
  | B
  | C
  } 

  Main() : void
   {
     
   
     WriteLine("Hi!");
   }
 }
Re[2]: не компилирует variant
От: JеS Россия  
Дата: 20.01.11 17:49
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Типы нельзя объявлять внутри функций и методов.


Изначально код выглядел так:


using System.Console;

def readInput()
{
  def result = ReadLine();
  
  unless (result == "")
  {
    WriteLine("Вы ввели:");
    WriteLine(result);
    readInput();
  }
}

readInput();

variant Token
{
  | Number
  | Operator
  | Error
}

def lexer(text : string) : list[Token]
{
  mutable index = 0;

  def peek() : char
  {
    if (index >= text.lenght ) '\0' 
      else text[index]
  }

  def read() : char
  {
    def ch = peek();
    
    when(index < text.lenght)
      index++
    ch;
   }
   
   def isDegit(ch) { ch >= '0' && ch <= '9' }
   
   def loop(resultTokens : list[Token]) : list[Token]
   {
     def errror()
     {
       WriteLine(string(' ',index - 1) + "^");
       WriteLine("Errror.You may entered digit or operator!");
       (Token.Error() :: resultTokens).Reverse()
     }
     
     def number(ch : char, accamulator : int = 0) : int
     {
       def hightOrderValue   = accamulator * 10;
       def currentOrderValue = ch - '0' : int;
       def currentValue      = currentOrderValue + hightOrderValue;
       
       if(isDigit(peek()))
         number(read(), currentValue);
       else
         currentValue
     }
       
     def ch = read();
     
     match(ch)
     {
       | ' ' | '\t'            => loop(resultTokens)
       | '+' | '-' | '*' | '/' => loop(Token.Operator(ch.ToString()) :: resultTokens)
       | '\0'                  => resultTokens.Reverse()
       | _ when isDigit(ch)    => loop(Token.Number(number(ch)) :: resultTokens)
       | _                     => error()
     }
   }
   loop([]);
 }


Он взят из RSDN Magazine (2009 год 3 выпуск статья "Язык Nemerle.Часть 2")

ошибки те же самые.
Re[3]: не компилирует variant
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 20.01.11 18:03
Оценка:
Это сокрашённая нотация для метода Main. Так что, ошибки тействительно те же самые. Правильно будет написать:

using System;
using System.Console;
using Nemerle.Utility;

variant A
{
 | B
 | C
}

module Program
{  Main() : void
  {
    WriteLine("Hi!");
  }
}
Ce n'est que pour vous dire ce que je vous dis.
Re[4]: не компилирует variant
От: JеS Россия  
Дата: 20.01.11 18:18
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Это сокрашённая нотация для метода Main. Так что, ошибки тействительно те же самые. Правильно будет написать:


DR>
DR>using System;
DR>using System.Console;
DR>using Nemerle.Utility;

DR>variant A
DR>{
DR> | B
DR> | C
DR>}

DR>module Program
DR>{  Main() : void
DR>  {
DR>    WriteLine("Hi!");
DR>  }
DR>}
DR>



фууух,все разобрался.Работает)

Спасибо всем большое)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.