Re[19]: Парсер C# на Nemerle
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.10 20:05
Оценка: 46 (1)
Здравствуйте, VladD2, Вы писали:

VD>Парсер прогоняли на куче исходников. От Януса, до исходников дотнета. Вроде пашет.


Кстати, разве в MONO нет юнит-тестов?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[22]: Парсер C# на Nemerle
От: WolfHound  
Дата: 03.11.10 20:48
Оценка:
Здравствуйте, nikov, Вы писали:

H>>Утиллитка подобная у нас есть, но дамп она не делает — она просто сообщает произошел ли разбор, и если он произошел, были ли (и в каких местах) синтаксические ошибки.

N>Ок, давай пока такую попробую. Где взять?
http://code.google.com/p/nemerle/source/browse/#svn/nemerle/trunk/snippets/peg-parser/CSharp/csparser
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[23]: Парсер C# на Nemerle
От: nikov США http://www.linkedin.com/in/nikov
Дата: 03.11.10 21:47
Оценка: 196 (6)
Здравствуйте, WolfHound, Вы писали:

N>>Ок, давай пока такую попробую. Где взять?

WH>http://code.google.com/p/nemerle/source/browse/#svn/nemerle/trunk/snippets/peg-parser/CSharp/csparser

Такой код не распарсился:

1)
class A
{
    int[] x = { };
}


2)
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;
}


Директивы препроцессора вообще не работают (пока не реализованы?)
Re[24]: Парсер C# на Nemerle
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.10 22:12
Оценка:
Здравствуйте, nikov, Вы писали:

N>Такой код не распарсился:

N>На таком упало по OutOfMemoryException:
N>Здесь без ошибок распарсил грамматически некорректный код:
N>Директивы препроцессора вообще не работают (пока не реализованы?)

А теперь товарищи незвери, называем сроки исправления и придерживаемся этих сроков.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[24]: Парсер C# на Nemerle
От: nikov США http://www.linkedin.com/in/nikov
Дата: 03.11.10 22:16
Оценка:
Вот ещё:

class \u1000<[typevar:X]T>
{
    [@return:X]
    void Foo() { }
}


using x = int;
using y = List<int<int>>;
Re[25]: Парсер C# на Nemerle
От: hardcase Пират http://nemerle.org
Дата: 03.11.10 22:17
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, nikov, Вы писали:


N>>Такой код не распарсился:

N>>На таком упало по OutOfMemoryException:
N>>Здесь без ошибок распарсил грамматически некорректный код:
N>>Директивы препроцессора вообще не работают (пока не реализованы?)

A>А теперь товарищи незвери, называем сроки исправления и придерживаемся этих сроков.


Два дня
/* иЗвиНите зА неРовнЫй поЧерК */
Re[24]: Парсер C# на Nemerle
От: hardcase Пират http://nemerle.org
Дата: 03.11.10 22:18
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, WolfHound, Вы писали:


N>>>Ок, давай пока такую попробую. Где взять?

WH>>http://code.google.com/p/nemerle/source/browse/#svn/nemerle/trunk/snippets/peg-parser/CSharp/csparser

N>Такой код не распарсился:


ОК. Посмотрим, что там.

N>На таком упало по OutOfMemoryException:


N>
N>class A
N>{
N>    static void Foo()
N>    {
N>        a:
N>    }
N>}
N>


Забавно.

N>Здесь без ошибок распарсил грамматически некорректный код:


Это известное поведение. Так и должно быть.

N>Директивы препроцессора вообще не работают (пока не реализованы?)


Верно, еще не сделали препроцессор. Для этого нужно генератор парсеров дорабатывать.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[26]: Парсер C# на Nemerle
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.10 22:18
Оценка:
Здравствуйте, hardcase, Вы писали:

A>>А теперь товарищи незвери, называем сроки исправления и придерживаемся этих сроков.

H>Два дня

Пусть будет два рабочих дня и ещё умножим на ва, как поступают менеджеры со сроками программистов. Итого 11го числа баги будут исправлены. Ну-ну.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[25]: Парсер C# на Nemerle
От: hardcase Пират http://nemerle.org
Дата: 03.11.10 22:19
Оценка:
Здравствуйте, nikov, Вы писали:

N>Вот ещё:


N>
N>class \u1000<[typevar:X]T>
N>{
N>    [@return:X]
N>    void Foo() { }
N>}
N>


Эскейпы в именах \uXXXX не поддерживаются (только в литералах).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[25]: Парсер C# на Nemerle
От: nikov США http://www.linkedin.com/in/nikov
Дата: 03.11.10 22:20
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Так и должно быть.


Почему это?
Re[25]: Парсер C# на Nemerle
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.10 22:20
Оценка: -1
Здравствуйте, hardcase, Вы писали:

N>>Здесь без ошибок распарсил грамматически некорректный код:

H>Это известное поведение. Так и должно быть.

Перекуём баги на фичи? Даже не семшно так рано сливать.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[24]: Парсер C# на Nemerle
От: nikov США http://www.linkedin.com/in/nikov
Дата: 03.11.10 22:22
Оценка:
Ещё:

class A{
    object x = from from in "" select 1;
}
Re[26]: Парсер C# на Nemerle
От: hardcase Пират http://nemerle.org
Дата: 03.11.10 22:24
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, hardcase, Вы писали:


H>>Так и должно быть.


N>Почему это?


Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[27]: Парсер C# на Nemerle
От: nikov США http://www.linkedin.com/in/nikov
Дата: 03.11.10 22:27
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.


А как парсится оператор && без левого аргумента?
Re[27]: Парсер C# на Nemerle
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.10 22:28
Оценка:
Здравствуйте, hardcase, Вы писали:

H>>>Так и должно быть.

N>>Почему это?
H>Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.

Логично выдавать диагностическое сообщение и проводить процедуру восстановления. Текущее поведение никак не коррелирует с общепринятыми методиками восстановления после ошибки.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[28]: Парсер C# на Nemerle
От: hardcase Пират http://nemerle.org
Дата: 03.11.10 22:29
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, hardcase, Вы писали:


H>>Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.


N>А как парсится оператор && без левого аргумента?


Скорее всего там распарсились два последовательных оператора взятия адреса.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[28]: Парсер C# на Nemerle
От: hardcase Пират http://nemerle.org
Дата: 03.11.10 22:30
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, hardcase, Вы писали:


H>>>>Так и должно быть.

N>>>Почему это?
H>>Логично что нужно парсить все что можно распарсить. Что не так пускай думает код, который будет анализировать AST.

A>Логично выдавать диагностическое сообщение и проводить процедуру восстановления. Текущее поведение никак не коррелирует с общепринятыми методиками восстановления после ошибки.


Логичное диагностическое сообщение выдадет типизатор AST.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[29]: Парсер C# на Nemerle
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.10 22:34
Оценка:
Здравствуйте, hardcase, Вы писали:

A>>Логично выдавать диагностическое сообщение и проводить процедуру восстановления. Текущее поведение никак не коррелирует с общепринятыми методиками восстановления после ошибки.

H>Логичное диагностическое сообщение выдадет типизатор AST.

Обработчик AST должен искать семантические ошибки, а не синтаксические. Построение AST для "from from" нельзя объяснить ничем другим, кроме как ограниченностью вашего инструментария. "from from" — это недопустимая последовательность лексем и в AST она попадать не должна.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[29]: Парсер C# на Nemerle
От: nikov США http://www.linkedin.com/in/nikov
Дата: 03.11.10 22:35
Оценка: +2
Здравствуйте, hardcase, Вы писали:

H>Скорее всего там распарсились два последовательных оператора взятия адреса.


Но это ведь даже другой токен. Ну здесь это в любом случае ошибочный код, но ведь есть ситуации, когда убирание пробела между токенами превращает правильный код в ошибочный. Кто в таком случае сообщит об ошибке? Ведь и парсер будет доволен, и дерево получится правильное.
Re[30]: Парсер C# на Nemerle
От: hardcase Пират http://nemerle.org
Дата: 03.11.10 22:37
Оценка:
Здравствуйте, adontz, Вы писали:

A>Обработчик AST должен искать семантические ошибки, а не синтаксические. Построение AST для "from from" нельзя объяснить ничем другим, кроме как ограниченностью вашего инструментария. "from from" — это недопустимая последовательность лексем и в AST она попадать не должна.


Замечательная последовательность лексем. Но, конечно, я посмотрю что там внутри получается.
Дело в том, что генератор парсеров проектируется с расчетом на использование в механизмах автокомплита, так что парсить нужно все что можно распарсить.
/* иЗвиНите зА неРовнЫй поЧерК */
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.