using System;
unsafe class C
{
int* x = (int*) -1;
}
3)
class A
{
static void Main()
{
object[] p = null;
var q = from x in p
where x is int?
select x;
}
}
4)
using System;
class C : IDisposable
{
public void Dispose() {}
public static C operator *(C x, C y)
{
using (x * y * y)
{
return x;
}
}
}
5)
class P
{
static void Main()
{
using (C? x = new C() + from y in new[] { 1 }
join z in new[] { 1 } on y equals z
let s = y + z
select s is int ? "" : null) { }
}
}
На таком упало по OutOfMemoryException:
class A
{
static void Foo()
{
a:
}
}
Здесь без ошибок распарсил грамматически некорректный код:
1)
class A
{
object x = List<List<>>.Foo;
}
2)
class A
{
object x = &&1;
}
3)
class C
{
bool? b = i is int?? true : false;
}
Директивы препроцессора вообще не работают (пока не реализованы?)
Здравствуйте, nikov, Вы писали:
N>Такой код не распарсился: N>На таком упало по OutOfMemoryException: N>Здесь без ошибок распарсил грамматически некорректный код: N>Директивы препроцессора вообще не работают (пока не реализованы?)
А теперь товарищи незвери, называем сроки исправления и придерживаемся этих сроков.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, nikov, Вы писали:
N>>Такой код не распарсился: N>>На таком упало по OutOfMemoryException: N>>Здесь без ошибок распарсил грамматически некорректный код: N>>Директивы препроцессора вообще не работают (пока не реализованы?)
A>А теперь товарищи незвери, называем сроки исправления и придерживаемся этих сроков.
Здравствуйте, hardcase, Вы писали:
H>Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.
Здравствуйте, hardcase, Вы писали:
H>>>Так и должно быть. N>>Почему это? H>Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.
Логично выдавать диагностическое сообщение и проводить процедуру восстановления. Текущее поведение никак не коррелирует с общепринятыми методиками восстановления после ошибки.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, hardcase, Вы писали:
H>>Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.
N>А как парсится оператор && без левого аргумента?
Скорее всего там распарсились два последовательных оператора взятия адреса.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, hardcase, Вы писали:
H>>>>Так и должно быть. N>>>Почему это? H>>Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.
A>Логично выдавать диагностическое сообщение и проводить процедуру восстановления. Текущее поведение никак не коррелирует с общепринятыми методиками восстановления после ошибки.
Логичное диагностическое сообщение выдадет типизатор AST.
Здравствуйте, hardcase, Вы писали:
A>>Логично выдавать диагностическое сообщение и проводить процедуру восстановления. Текущее поведение никак не коррелирует с общепринятыми методиками восстановления после ошибки. H>Логичное диагностическое сообщение выдадет типизатор AST.
Обработчик AST должен искать семантические ошибки, а не синтаксические. Построение AST для "from from" нельзя объяснить ничем другим, кроме как ограниченностью вашего инструментария. "from from" — это недопустимая последовательность лексем и в AST она попадать не должна.
Здравствуйте, hardcase, Вы писали:
H>Скорее всего там распарсились два последовательных оператора взятия адреса.
Но это ведь даже другой токен. Ну здесь это в любом случае ошибочный код, но ведь есть ситуации, когда убирание пробела между токенами превращает правильный код в ошибочный. Кто в таком случае сообщит об ошибке? Ведь и парсер будет доволен, и дерево получится правильное.
Здравствуйте, adontz, Вы писали:
A>Обработчик AST должен искать семантические ошибки, а не синтаксические. Построение AST для "from from" нельзя объяснить ничем другим, кроме как ограниченностью вашего инструментария. "from from" — это недопустимая последовательность лексем и в AST она попадать не должна.
Замечательная последовательность лексем. Но, конечно, я посмотрю что там внутри получается.
Дело в том, что генератор парсеров проектируется с расчетом на использование в механизмах автокомплита, так что парсить нужно все что можно распарсить.