Re: Написание своего DSL
От: alpha21264 СССР  
Дата: 09.09.20 21:18
Оценка: 2 (1)
Здравствуйте, 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

Течёт вода Кубань-реки куда велят большевики.
Отредактировано 09.09.2020 21:27 alpha21264 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.