gpt4 book ai didi

templates - Antlr中StringTemplate的使用

转载 作者:行者123 更新时间:2023-12-02 01:20:03 27 4
gpt4 key购买 nike

我会遇到这个问题:鉴于此规则

   defField: type VAR ( ',' VAR)* SEP ;  

VAR : ('a'..'z'|'A'..'Z')+ ;

type: 'Number'|'String' ;

SEP : '\n'|';' ;

我要做的是将模板与规则“defField”关联起来,该规则返回表示该字段的 xml 架构的字符串,即:

   Number a,b,c ;-> "<xs:element name="a" type = "xs:Number"\>" ,also for b and c.

我的问题是在Kleene的*中,也就是说,我如何根据'*'编写模板来完成我上面描述的事情??

谢谢你!!!

最佳答案

使用 += 运算符收集 java.util.List 中的所有 VAR 标记:

defField
: t=type v+=VAR (',' v+=VAR)* SEP
;

现在 v(列表)包含所有 VAR

然后将 tv 作为参数传递给 StringTemplateGroup 中的方法:

defField
: t=type v+=VAR (',' v+=VAR)* SEP -> defFieldSchema(type={$t.text}, vars={$v})
;

其中 defFieldSchema(...) 必须在 StringTemplateGroup 中声明,可能类似于(文件:T.stg):

group T;

defFieldSchema(type, vars) ::= <<
<vars:{ v | \<xs:element name="<v.text>" type="xs:<type>"\>
}>
>>

迭代集合的语法如下:

<COLLECTION:{ EACH_ITEM_IN_COLLECTION | TEXT_TO_EMIT }>

Ans,因为vars是一个包含CommonTokensList,所以我捕获了它的.text属性而不是依赖于其 toString() 方法。

演示

采用以下语法(文件T.g):

grammar T;

options {
output=template;
}

defField
: t=type v+=VAR (',' v+=VAR)* SEP -> defFieldSchema(type={$t.text}, vars={$v})
;

type
: NUMBER
| STRING
;

NUMBER
: 'Number'
;

STRING
: 'String'
;

VAR
: ('a'..'z'|'A'..'Z')+
;

SEP
: '\n'
| ';'
;

SPACE
: ' ' {skip();}
;

可以使用以下类进行测试(文件:Main.java):

import org.antlr.runtime.*;
import org.antlr.stringtemplate.*;
import java.io.*;

public class Main {
public static void main(String[] args) throws Exception {
StringTemplateGroup group = new StringTemplateGroup(new FileReader("T.stg"));
ANTLRStringStream in = new ANTLRStringStream("Number a,b,c;");
TLexer lexer = new TLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
TParser parser = new TParser(tokens);
parser.setTemplateLib(group);
TParser.defField_return returnValue = parser.defField();
StringTemplate st = (StringTemplate)returnValue.getTemplate();
System.out.println(st.toString());
}
}

正如您在运行此类时所看到的,它会解析输入“Number a,b,c;”并生成以下输出:

<xs:element name="a" type="xs:Number">
<xs:element name="b" type="xs:Number">
<xs:element name="c" type="xs:Number">

编辑

要运行演示,请确保同一目录中具有以下所有文件:

  • T.g(组合语法文件)
  • T.stg(StringTemplateGroup 文件)
  • antlr-3.3.jar(撰写本文时最新的稳定 ANTLR 版本)
  • Main.java(测试类)

然后从操作系统的 shell/提示符(从所有文件所在的同一目录)执行以下命令:

java -cp antlr-3.3.jar org.antlr.Tool T.g  # generate the lexer & parserjavac -cp antlr-3.3.jar *.java             # compile all .java source filesjava -cp .:antlr-3.3.jar Main              # run the main class (*nix)                                           # orjava -cp .;antlr-3.3.jar Main              # run the main class (Windows)         

可能没有必要提及,但包含其后文本的 # 不应成为命令的一部分:这些只是说明这些命令用途的注释。

关于templates - Antlr中StringTemplate的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6088834/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com