Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Точнее — парсинг и построение AST
M>Запилил статейку на эту тему со своими практиками, предлагаю обсудить. Но — с конструктивом, а не просто: "ты лошара неграмотная, я тебя на работу не возьму". Хочу понять, как таки это делать правильно и быстро.
Это очень зависит.
Нынешняя практика парсинга опирается на Хомского, дегенераивные грамматики и позиционные языки, похожие на английский.
Я в моей практике (не очень сложных парсеров) пришёл к противоположной методике.
Каждое слово языка имеет тэг. Первый символ (несколько символов) любой переменной — это тэг.
И этот тэг определяет в какой массив и какую структуру AST ты его записываешь.
Таким образом любой парсер пишется вот так:
for( int i=0 ; i<n_Word ; i++ )
{ switch( Word[i][0] )
{
case '$' : AllData.Array1[j1++] = func1( Word[i] ) ; break ;
case '@' : AllData.Array2[j2++] = func2( Word[i] ) ; break ;
case '&' : AllData.Array2[j2].Member[j_Member++] = func3( Word[i] ) ; break ;
}
}
Вместо [j_Mass1++] можешь push_back() писать.
И да, для этого надо иметь возможность самому создавать свой DSL, чтобы самому назначать тэги.
PS.
Вот тут один персонаж (еретик) рассказывает про подобную методику. Только он ещё "иероглифы" (это такие своеобразные тэги) делает:
https://youtu.be/LxMj6ZYfbpU?t=898