Здравствуйте, Чистяков Владислав Юрьевич, Вы писали:
ЧВЮ>Статья:
ЧВЮ>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.