ANTLR模板转换器匹配语法的一部分

ANTLR模板转换器匹配语法的一部分,antlr,antlr3,stringtemplate,Antlr,Antlr3,Stringtemplate,我为一种语言写了一个语法,现在我想处理一些语法结构,因为我想写一个模板翻译 问题是我希望我的模板语法只翻译语言的一些结构,其余的保持原样 例如: 我将此作为输入: class Main { int a[10]; } 我想将其转化为: class Main { Array a = new Array(10); } 理想情况下,我想在ANTLR做一些这样的思考 grammer Translator options { output=template;} decl

我为一种语言写了一个语法,现在我想处理一些语法结构,因为我想写一个模板翻译

问题是我希望我的模板语法只翻译语言的一些结构,其余的保持原样

例如:

我将此作为输入:

class Main { 
   int a[10];
}
我想将其转化为:

class Main { 
   Array a = new Array(10);
}
理想情况下,我想在ANTLR做一些这样的思考

grammer Translator
options { output=template;}

    decl 
         : TYPE  ID '[' INT ']' -> template(name = {$ID.text}, size ={$INT.text}) 
              "Array <name> = new Array(<size>);
语法翻译程序 选项{output=template;} 十二月 :TYPE ID'['INT']'->模板(name={$ID.text},size={$INT.text}) “数组=新数组(); 我希望它保留与规则decl不匹配的其余输入


如果不编写语言的完整语法,如何在ANTLR中实现这一点?

我只需在解析器语法中处理这些事情

假设您正在解析器语法中构造AST,我想您将有一个规则来解析输入,如
Array a=new Array(10);
类似于:

decl
:TYPE ID'='expr';'->^(DECL TYPE ID expr)
;
其中
expr
最终与
术语匹配,如下所示:

术语
:号码
|'新的'ID'('(expr(','expr)*)?')'->^('new'ID expr*)
|  ...
;
要解释您的简写声明
inta[10];
,您只需像这样展开
decl

decl
:TYPE ID'='expr';'->^(DECL TYPE ID expr)
|类型ID“['expr']”;“->^(DECL'Array'ID^(新数组expr))
;
这将把输入
int a[10];
重写为以下AST:

这与为输入创建的AST完全相同
Array a=new Array(10);

编辑 下面是一个小的工作演示:

语法T;
选择权{
输出=AST;
}
代币{
根;
DECL;
NEW='NEW';
INT='INT';
ARRAY='ARRAY';
}
作语法分析
:decl+EOF->^(根decl+)
;
十二月
:type ID'='expr';'->^(DECL type ID expr)
|类型ID“['expr']”;”->^(DECL数组ID^(新数组expr))
;
expr
:号码
|新类型“(”(expr(“,”expr)*)?”->^(新ID expr*)
;
类型
:INT
|排列
|身份证
;
ID:('a'..'z'|'a'..'z')+;
编号:'0'..'9'+;
空格:(“”|’\t’|’\r’|’\n’{skip();};
可通过以下类别进行测试:

import org.antlr.runtime.*;
导入org.antlr.runtime.tree.*;
导入org.antlr.stringtemplate.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
String src=“数组a=新数组(10);int a[10];”;
TLexer lexer=new-TLexer(new-ANTLRStringStream(src));
TParser parser=newtparser(newcommontokenstream(lexer));
CommonTree=(CommonTree)parser.parse().getTree();
DOTTreeGenerator gen=新的DOTTreeGenerator();
StringTemplate st=gen.toDOT(树);
系统输出打印LN(st);
}
}

我试过了,但是当我试图在重写规则中传递一个字符串时,它会发出一个错误:引用重写规则中未定义的标记:'Array'和'new'相同实际上语法是token[“literal”],所以我需要做一些类似的事情:TYPE ID'['expr']'”;->^(DECL TYPE[“Array”]ID^(new TYPE[“Array”]expr))@是的,我犯了一个错误:我在重写规则中使用了语法分析器规则中不存在的文字标记。我修复了它,并添加了一个工作示例。@JohnRetallack,是的,做得好,
t['text']
可能也可以工作。