Re: N2 – языковый фрeймворк
От: Aleх  
Дата: 08.01.15 17:04
Оценка:
Здравствуйте, Чистяков Владислав Юрьевич, Вы писали:

ЧВЮ>Статья:

ЧВЮ>N2 – языковый фрeймворк
Автор(ы): Чистяков Владислав Юрьевич
Дата: 15.05.2012
В данной статье рассказывается о новом проекте языкового фрэймворка – N2


ЧВЮ>Авторы:

ЧВЮ> Чистяков Владислав Юрьевич

ЧВЮ>Аннотация:

ЧВЮ>В данной статье рассказывается о новом проекте языкового фрэймворка – N2

>Разрешение неоднозначностей при парсинге обеспечивается выбором более длинной последовательности в сочетании с выбором более длинных лексем. Этот алгоритм обеспечивает разбор, соответствующий правилам современных «лексерных» языков программирования.


Всё-таки в результате парсинга получается одно синтаксическое дерево и все неоднозначности решаются этой эвристикой? Или же, как было написано где-то в сообщениях на форуме, парсинг может быть неоднозначным и конфликты разрешаются на стадии типизации. Происходит ли типизация строго после парсинга или же она происходит в процессе? В C++ типизация, включающая в себя инстанциирование шаблонов, должна происходить в процессе синтаксического анализа. В противном случае в результате парсинга получится, нечто малополезное, что потребует нового, но уже ручного разбора на стадии типизации. Грубо говоря получится только разметить (определить местоположение и имя) классы и функции. Но именно такая задача решается довольно простой грамматикой и это очень малая часть синтаксического анализа.

>Реальная информация о метаданных будет вычислена только в момент обращения к этим самым метаданным. Когда это произойдет, зависит от языка программирования. Так, для C++ это может случиться еще при парсинге (при разрешении неоднозначности), что не проблематично для C++, так как в этом языке все типы должны быть объявлены (или предекларированны) выше (заранее).


Проблематично. В методах внутри классов можно использовать типы объявленные далее по коду программы.
struct MyClass
{
    int foo()
    {
        InnerClass inner;

        inner.bar();
    }

    struct InnerClass
    {
        void bar()
        { }
    };
};


В процессе разбора тела методов пропускаются (в простейшем случае можно просто считать скобки) и их полный разбор происходит на следующих стадиях.
В исходниках компиляторов clang и gcc это называется tentative parsing. Кроме отложенного разбора методов классов, может понадобиться предварительный парсинг частей выражения для most vexing parse.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.