Вот такой код вышибает коспилятор в Internal compiler error
using System.IO;
using System.Collections.Generic;
using System.Console;
[Record]
variant Token
{
public pos : int ;
public len : int ;
| Identifier { name : string ; }
| Operator { name : string }
| Semicolon // ;
| Colon // :
| Comma
| BeginBrace // {
| EndBrace // }
| BeginRound // (
| EndRound // )
| End
}
class Lexer
{
public GetTokens(text : string ) : IEnumerable[Token]
{
mutable pos = 0;
def substr(start, e)
{
text.Substring(start, start - e)
}
def end()
{
pos >= text.Length
}
def isSpace(c)
{
c == ' ' || c == '\t' || c == '\n'
}
def skipSpaces()
{
while (!end() && isSpace(text[pos]))
++pos;
}
yield Token.End(pos, 0);
}
}
module Test
{
Main() : void
{
def lexer = Lexer();
using (def file = File.OpenText("test.pcd" ))
{
foreach (token in lexer.GetTokens(file.ReadToEnd()))
{
| Identifier(name) =>
WriteLine(name);
| End => break ;
}
}
}
}
Компилю Bootstrap'ом ревизия 6642
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
30.01.07 18:13: Перенесено модератором из 'Декларативное программирование' — IT
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: [Nemerle] yield глючит
Здравствуйте, WolfHound, Вы писали:
Глянул стэктрэйс, вышибает на одном из замыканий. Выяснил, что вышибает на skipSpaces(). Переписал так:
WH>WH>using System.IO;
WH>using System.Collections.Generic;
WH>using System.Console;
using Nemerle.Imperative;
WH>[Record]
WH>variant Token
WH>{
...
WH>}
WH>class Lexer
WH>{
WH> public GetTokens(text : string ) : IEnumerable[Token]
WH> {
WH> mutable pos = 0;
WH> def substr(start, e)
WH> {
WH> text.Substring(start, start - e)
WH> }
def skipSpaces()
{
def end()
{
pos >= text.Length
}
def isSpace(c)
{
c == ' ' || c == '\t' || c == '\n'
}
while (!end() && isSpace(text[pos]))
++pos;
}
WH> yield Token.End(pos, 0);
WH> }
WH>}
WH>module Test
WH>{
WH> Main() : void
WH> {
WH> def lexer = Lexer();
WH> using (def file = File.OpenText("test.pcd" ))
WH> {
WH> foreach (token in lexer.GetTokens(file.ReadToEnd()))
WH> {
WH> | Identifier(name) =>
WH> WriteLine(name);
WH> | End => break ;
WH> }
WH> }
WH> }
WH>}
WH>
Но баг имеет место быть, надо репортить.
Кстати, что до императива, то я первое время тоже все так и рвался впихнуть куда-нибудь break или return, вроде проходит. Вместо break сделал бы так:
ret :
{
foreach (token in lexer.GetTokens(file.ReadToEnd()))
{
| Identifier(name) =>
WriteLine(name);
| End => ret();
}
()
}
Но это конечно на любителя и используется как правило, если нужно вернуть значение, например:
def val = ret :
{
foreach (p in $[1..10])
{
when (p == 4)
ret(true );
}
false
}
WriteLine($"$val" );
Хотя в твоем случае break, безусловно, наглядней.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re: [Nemerle] yield глючит
Здравствуйте, WolfHound, Вы писали:
WH>Вот такой код вышибает коспилятор в Internal compiler error
Если это не разные баги, то я его отловил чуть ранее:
http://nemerle.org/bugs/view.php?id=756
и он уже исправлен. Твой код вроде бы нормально компилируется но будет ли он работать я не знаю.
Кстати, там не хватает:
using Nemerle.Imperative;
ЗЫ
А зачем тебе лексер?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств,
последняя всегда сильнее .
Re[2]: [Nemerle] yield глючит
От:
chudo19
Дата: 28.09.06 10:00
Оценка:
Здравствуйте, ie, Вы писали:
ie>Здравствуйте, WolfHound, Вы писали:
ie>Кстати, что до императива, то я первое время тоже все так и рвался впихнуть куда-нибудь break или return, вроде проходит. Вместо break сделал бы так:
ie>ie> ret :
ie> {
ie> foreach (token in lexer.GetTokens(file.ReadToEnd()))
ie> {
ie> | Identifier(name) =>
ie> WriteLine(name);
ie> | End => ret();
ie> }
ie> ()
ie> }
ie>
ie>Но это конечно на любителя и используется как правило, если нужно вернуть значение, например:
ie>ie>def val = ret :
ie>{
ie> foreach (p in $[1..10])
ie> {
ie> when (p == 4)
ie> ret(true );
ie> }
ie> false
ie>}
ie>WriteLine($"$val" );
ie>
ie>Хотя в твоем случае break, безусловно, наглядней.
А можно подробней что это за синтаксис
Re[3]: [Nemerle] yield глючит
Здравствуйте, chudo19, Вы писали:
ie>>Но это конечно на любителя и используется как правило, если нужно вернуть значение, например:
ie>>ie>>def val = ret :
ie>>{
ie>> foreach (p in $[1..10])
ie>> {
ie>> when (p == 4)
ie>> ret(true );
ie>> }
ie>> false
ie>>}
ie>>WriteLine($"$val" );
ie>>
ie>>Хотя в твоем случае break, безусловно, наглядней.
C>А можно подробней что это за синтаксис
Можно. ... << RSDN@Home 1.2.0 alpha rev. 655>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[4]: [Nemerle] yield глючит
От:
chudo19
Дата: 28.09.06 12:24
Оценка:
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, chudo19, Вы писали:
ie>>>Но это конечно на любителя и используется как правило, если нужно вернуть значение, например:
ie>>>ie>>>def val = ret :
ie>>>{
ie>>> foreach (p in $[1..10])
ie>>> {
ie>>> when (p == 4)
ie>>> ret(true );
ie>>> }
ie>>> false
ie>>>}
ie>>>WriteLine($"$val" );
ie>>>
ie>>>Хотя в твоем случае break, безусловно, наглядней.
C>>А можно подробней что это за синтаксис
K>Можно.
Ах да , тенкс
Re[2]: [Nemerle] yield глючит
Здравствуйте, VladD2, Вы писали:
VD>и он уже исправлен. Твой код вроде бы нормально компилируется но будет ли он работать я не знаю.
Я все ужу без yield переписал.
Я еще нарвался на другую особенность... попытался написать так
| Identifier as id1 :: Dot :: Identifier as id2 :: tokens =>
и получил кучу ругони от компилятора.
Обошол так
| Identifier as id1 :: Dot :: tokens =>
match (tokens)
{
| Identifier as id2 :: tokens =>
Но это криво.
VD>А зачем тебе лексер?
Потом раскажу если получится.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: [Nemerle] yield глючит
Здравствуйте, WolfHound, Вы писали:
WH>Я еще нарвался на другую особенность... попытался написать так
WH>WH> | Identifier as id1 :: Dot :: Identifier as id2 :: tokens =>
WH>
WH>и получил кучу ругони от компилятора.
Попробуй так:
| (Identifier as id1) :: Dot :: (Identifier as id2) :: tokens =>
Re[3]: [Nemerle] yield глючит
Здравствуйте, chudo19, Вы писали:
C>А можно подробней что это за синтаксис
А можно так безбожно не овреквотить при таких вопросоах? Неужели нельзя ограничиться одним примером или даже его частью?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств,
последняя всегда сильнее .
Re[4]: [Nemerle] yield глючит
Здравствуйте, Vermicious Knid, Вы писали:
VK>Попробуй так:
VK>VK>| (Identifier as id1) :: Dot :: (Identifier as id2) :: tokens =>
VK>
Так работает. Но всеравно на багу смахивает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: [Nemerle] yield глючит
Здравствуйте, WolfHound, Вы писали:
WH>Обошол так
WH>WH> | Identifier as id1 :: Dot :: tokens =>
WH> match (tokens)
WH> {
WH> | Identifier as id2 :: tokens =>
WH>
WH>Но это криво.
Напиши в конфу или добавь баг-репорт.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств,
последняя всегда сильнее .
Re[5]: [Nemerle] yield глючит
Здравствуйте, WolfHound, Вы писали:
VK>>Попробуй так:
VK>>VK>>| (Identifier as id1) :: Dot :: (Identifier as id2) :: tokens =>
VK>>
WH>Так работает. Но всеравно на багу смахивает.
Смахивает на приоритет операторов.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств,
последняя всегда сильнее .
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить