Я работаю над проектом перевода кода с образцом грамматики дерева ANTLR в виде:
start: ^(PROGRAM declaration+) -> program_decl_tmpl();
declaration: class_decl | interface_decl;
class_decl: ^(CLASS ^(ID CLASS_IDENTIFIER))
-> class_decl_tmpl(cid={$CLASS_IDENTIFIER.text});
Файл группового шаблона для него выглядит следующим образом:
group My;
program_decl_tmpl() ::= <<
*WHAT?*
>>
class_decl_tmpl(cid) ::= <<
public class <cid> {}
>>
Исходя из этого,У меня есть следующие вопросы:
- Все отлично работает, кроме того, что я должен выразить в
WHAT?
, чтобы сказать, что программа - это просто список объявлений класса для получения окончательного сгенерированного вывода? - Этот подход в среднем подходит для не очень высокого уровня языка?
- Я также изучил Перевод кода ANTLR со строковыми шаблонами , но, похоже, этот подход использует много преимуществ перемежения кода в древовидной грамматике.Также возможно сделать это как можно больше просто в шаблонах строк?
РЕШЕНИЕ , я добавляю решение на основе того, что предложил Теренс:
start: ^(PROGRAM d+=declaration+) -> program_decl_tmpl(decls={$d});
declaration: cd = class_decl -> decl_tmpl(decl={$cd.st})
| id = interface_decl -> decl_tmpl(decl={$id.st});
class_decl: ^(CLASS ^(ID CLASS_IDENTIFIER))
-> class_decl_tmpl(cid={$CLASS_IDENTIFIER.text});
И шаблоны будут:
group My;
program_decl_tmpl(decls) ::= <<
<decls>
>>
decl_tmpl(decl) ::= <<
<decl>
>>
class_decl_tmpl(cid) ::= <<
public class <cid> {}
>>