Древовидная грамматика ANTLR и перевод кода StringTemplate - PullRequest
3 голосов
/ 21 декабря 2010

Я работаю над проектом перевода кода с образцом грамматики дерева 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> {}
>>

1 Ответ

4 голосов
/ 21 декабря 2010

Попробуйте

start: ^(PROGRAM d+=declaration+) -> program_decl_tmpl(decls=$d)

WHAT? = <decls>
...