Antlr4 混合两种语言

Antlr4 混合两种语言,antlr4,Antlr4,我正在为一种小型元语言编写语法。该语言应包括另一种语言(例如JavaScrip、C等)的代码块。我想把这些代码块当作打印出来的普通字符串。我的语言是基于c/Java语法的,使用{}表示代码块。但是,我还想对嵌入式语言的代码块使用“{”}”。下面是一些示例代码: // my language modul Abc { input x: string; otherLang { // this is now a code block from the second /

我正在为一种小型元语言编写语法。该语言应包括另一种语言(例如JavaScrip、C等)的代码块。我想把这些代码块当作打印出来的普通字符串。我的语言是基于c/Java语法的,使用{}表示代码块。但是,我还想对嵌入式语言的代码块使用“{”}”。下面是一些示例代码:

// my language
modul Abc {
   input x: string;
   otherLang {
      // this is now a code block from the second
      // language, which I do not want to analyze
      // It might itself contain { } like
      if (something) {
          abc = "string";
      }
   }
}

如何在不将它们与嵌入式语言的用法混淆的情况下,为这些不同的用法重新使用
{
}
。ANTLR在内部维护一个模式堆栈

尽管有点冗长,递归模式提供了处理诸如注释和转义字符之类的东西的可能性,否则可能会抛出嵌套

需要注意的一点是,具有
more
属性的规则将其匹配的内容连接到由以下第一个非
more
ed规则生成的令牌中。下面的示例使用虚拟令牌
OTHER\u END
提供语义清晰性,并避免与
RPAREN
令牌混淆

tokens {
    OTHER_END
}

otherLang : OTHER_BEG OTHER_END+ ; // multiple 'end's dependent on nesting

OTHER_BEG : 'otherLang' LPAREN -> pushMode(Other) ;
LPAREN    : LParen ;
RPAREN    : RParen ;
WS        : [ \t\r\n] -> skip;

mode Other ;
    // handle special cases here 
    O_RPAREN : RParen -> type(OTHER_END), popMode() ;
    O_LPAREN : LParen -> more, pushMode(Other) ;
    O_STUFF  : .      -> more ;

fragment LParen : '{' ;
fragment RParen : '}' ;