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