Создание нового языка программирования - с чего начать: различия между версиями
Mikst (обсуждение | вклад) |
Mikst (обсуждение | вклад) |
||
Строка 25: | Строка 25: | ||
*! | *! | ||
</source> | </source> | ||
и связанный с ним код правила для простого токена: | и связанный с ним код правила для простого токена (терминального символа): | ||
<source lang="Delphi">tkIf = 'if' !*<token_info>*! | <source lang="Delphi">tkIf = 'if' !*<token_info>*! | ||
</source> | </source> | ||
Строка 31: | Строка 31: | ||
<source lang="Delphi">!<%NAME%> %CODE%</source> | <source lang="Delphi">!<%NAME%> %CODE%</source> | ||
задает вид правой части: <token_info>. В данном случае %NAME%=token_info, %CODE% - пустой | задает вид правой части: <token_info>. В данном случае %NAME%=token_info, %CODE% - пустой | ||
Все терминальные символы подвергаются действию этого шаблона. | |||
В результате в данном случае <token_info> переходит в | |||
token_info _token_info=new token_info(%PARAMS%); | |||
_token_info.source_context=parsertools.GetTokenSourceContext(); | |||
// пусто | |||
return _token_info; |
Версия от 17:38, 1 мая 2010
Мы будем создавать парсер языка - программу, переводящую текст программы на языке программирования, в так называемое синтаксическое дерево. По-существу, парсер является первой частью компилятьра, его front-endом.
Папка с грамматикой
В папке с грамматикой - 2 файла - .grm и .pgt. .grm содержит файл с грамматикой в формате Gold Parser Builder, дополненный шаблонами действий (действия - в стиле Yacc). Шаблоны действий хранятся в виде комментариев Gold Parser Builder, так что на компиляцию им грамматики не влияют.
.pgt - это шаблон для создания скелета парсера, имеется для различных языков, мы используем для C#. Это означает, что сами парсеры
Все остальные файлы, если они есть, - можно убить - они генерируются автоматически.
По .grm файлу Gold Parser Builder автоматически создает .cgt файл - это файл откомпилированной грамматики - пока без правил. Они будут учтены позже.
Шаблоны в .grm файле
Шаблоны создавались Ткачуком для облегчения автоматической генерации кода. Рассмотрим пример:
!<%NAME%> %CODE%
!*
[TERMINALTEMPLATE]
{
%NAME% _%NAME%=new %NAME%(%PARAMS%);
_%NAME%.source_context=parsertools.GetTokenSourceContext();
%CODE%
return _%NAME%;
}
*!
и связанный с ним код правила для простого токена (терминального символа):
tkIf = 'if' !*<token_info>*!
Здесь - первая строка
!<%NAME%> %CODE%
задает вид правой части: <token_info>. В данном случае %NAME%=token_info, %CODE% - пустой
Все терминальные символы подвергаются действию этого шаблона. В результате в данном случае <token_info> переходит в
token_info _token_info=new token_info(%PARAMS%); _token_info.source_context=parsertools.GetTokenSourceContext(); // пусто return _token_info;