Здравствуйте, 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")
ошибки те же самые.