我正试图在ANTLR 3中充实wiki文本到HTML的翻译,但我一直陷入困境.
你知道一个我可以检查的工作实例吗?我尝试了MediaWiki ANTLR语法和Wiki Creole语法,但是我无法让它们在ANTLR 3中生成词法分析器和解析器.
以下是我尝试使用的两个语法的链接:
我无法获得这两个中的任何一个来生成我的Java Lexer和Parser.(我使用ANTLR3作为Eclipse插件).MediaWiki需要花费很长时间来构建,然后在某些时候抛出OutOfMemory异常.另一个有错误,我不知道如何调试.
编辑:好的,我有一个非常基本的语法:
grammar wikitext;
options {
//output = AST;
//ASTLabelType = CommonTree;
output = template;
language = Java;
}
document: line (NL line?)*;
line: horizontal_line | list | heading | paragraph;
/* horizontal line */
horizontal_line: HRLINE;
/* lists */
list: unordered_list | ordered_list;
unordered_list: '*'+ content;
ordered_list: '#'+ content;
/* Headings */
heading: heading1 | heading2 | heading3 | heading4 | heading5 | heading6;
heading1: H1 …Run Code Online (Sandbox Code Playgroud) 我在StringTemplate 4中生成了一个Javascript数组,但我在跳过最后一个元素之后的尾随昏迷时遇到了麻烦.每个项目都是使用模板生成的,然后我想用comas将它们分开,以便在表单中创建一个数组:
[ item1, item2, item3, item4 ]
Run Code Online (Sandbox Code Playgroud)
目前,我生成此阵列的最佳方法是:
array(elems) ::= <<
[
$first(elems):elem_noComa()$
$rest(elems):elem()$
]
>>
elem_noComa(el) ::= << { ...element generation... } >>
elem(el) ::= <<
, $elem_noComa(el)$
>>
Run Code Online (Sandbox Code Playgroud)
有没有办法更容易/更短的形式?
我正在尝试使用ILMerge将一些可传递引用的程序集内化到我正在引用的程序集中,以消除与我的项目中的那些传递依赖项的冲突.
特别是,我引用了Antlr3.StringTemplate(以下简称AS,可在此处获取:http://www.stringtemplate.org/download.html).它引用了Antlr3.Runtime.Debug(ARD)和Antlr3.Runtime(AR).ARD本身也引用了AR.在ASCII艺术中,那是:
AS ---> ARD
\ |
\ v
\---> AR
Run Code Online (Sandbox Code Playgroud)
因为我正在使用的另一个程序集NHibernate 2.1依赖于不同的,不兼容的AR版本,我想使用ILMerge将AR合并并内化到AS中.从理论上讲,我认为这应该有效; 但是,我在执行理论时遇到了麻烦.
无论我尝试什么样的排列和选项,我最终都会遇到以下形式的错误:
ILMerge.Merge:程序集'Antlr3.Runtime.Debug'未正确合并.它仍然在目标程序集中列为外部引用.
我想用ILMerge完成的是什么?
我会遇到这个问题:给出这个规则
defField: type VAR ( ',' VAR)* SEP ;
VAR : ('a'..'z'|'A'..'Z')+ ;
type: 'Number'|'String' ;
SEP : '\n'|';' ;
Run Code Online (Sandbox Code Playgroud)
我需要做的是将模板与规则"defField"相关联,该规则返回表示字段的xml-schema的字符串,即:
Number a,b,c ;-> "<xs:element name="a" type = "xs:Number"\>" ,also for b and c.
Run Code Online (Sandbox Code Playgroud)
我的问题出现在Kleene的*中,也就是说,如何根据'*'编写模板来执行上面描述的操作?
谢谢!!!
我正在使用StringTemplate 4生成一些Java源文件.
模板非常简单,例如:
QueryHandler(method) ::="
public class Obtenir<method.name>Handler extends QueryHandler\<List\<<method.name>Db>> implements IQueryHandler\<List\<<method.name>>>{
private IQuery\<List\<<method.name>Db>> query;
private <method.name>Converter converter;
@Inject
public Obtenir<method.name>Handler(IQuery\<List\<<method.name>Db>> query, <method.name>Converter converter, IStatisticsCollecter theStatsCollecter){
super(theStatsCollecter);
if(query == null){
throw new IllegalArgumentException(\"The query argument cannot be null\");
}
if(converter == null){
throw new IllegalArgumentException(\"Illegal argument for converter(null)\");
}
this.query = query;
this.converter = converter;
}
public List\<<method.name>> handle(Object... params) throws JdbcException {
final String method = \"obtenir<method.name>\";
DaoQueryStatusCallable status = new DaoQueryStatusCallable();
List\<<method.name>Db> result = invoke(query, status, method);
return …Run Code Online (Sandbox Code Playgroud) 我成功使用StringTemplate 4在Visual Studio中进行代码生成.我已经安装了StringTemplate和ANTLR的扩展,它们非常棒.
在测试中,我可以弄清楚如何使用*.st4(StringTemplate)文件,但是如何使用*.stg(StringTemplateGroup)文件逃避了我.它是可以嵌入到另一个StringTemplate中的定义集合吗?如果是这样,那么从*.stg而不是*.st4生成的代码是什么样的?
我使用StringTemplate生成源代码,我需要渲染一个我想要的语句列表但最后用"; \n"分隔,但格式化最后一个要包装在"返回项目中; \n"我可以实现这个在模板中还是我必须手动进行一些预处理?
$call.stmts:{$it$;} ;separator="\n"$
Run Code Online (Sandbox Code Playgroud)
目前我正在使用上述内容.
StringTemplate insert = new StringTemplate("insert $table$ values($value;separator=\",\"$)");
int testSize = 10000;
for(int i=0;i<testSize;i++) {
insert.setAttribute("table", "aTable");
String[] vs = {"1", "1", "'aaa'", "'bbb'"};
for(int j = 0;j < vs.length;j++){
insert.setAttribute("value", vs[j]);
}
insert.toString();
insert.reset();
}
Run Code Online (Sandbox Code Playgroud)
上面会比普通的StringBuilder慢大约5倍....
int testSize = 10000;
StringBuilder sb= new StringBuilder(100);
for(int i=0; i<testSize; i++) {
sb.append("INSERT ").append("aTable (");
String[] v = {"1", "1", "'aaa'", "'bbb'"};
for(int j=0; j<v.length; j++) {
if(j > 0) {
sb.append(",");
}
sb.append(v[j]);
}
sb.append(")");
sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
关于如何提高StringTemplate效率的任何想法或建议?谢谢!StringTemplate似乎在每个令牌上调用toString(),对吗?
版本3中的StringTemplate实例有一个.reset()方法.
我在for/each循环内部生成并希望在每个循环结束时将实例重置为其默认状态.我搜索了JavaDoc,但无法找到如何重置实例ST以重用它.
ST实例StringTemplate4?