首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反for语法迁移工具

反for语法迁移工具
EN

Stack Overflow用户
提问于 2016-11-03 12:53:41
回答 1查看 146关注 0票数 2

假设我有以下简单语法(查询DSL):

代码语言:javascript
复制
grammar TestGrammar;

term : textTerm ;

textTerm : 'Text' '(' T_VALUE '=' STRING+ ')' ;

T_VALUE : 'value' ;
STRING : '"' .+? '"' ;

WS : [ \t\r\n]+ -> skip ;

然后,在某种程度上,我决定需要改变文本术语格式,例如:

代码语言:javascript
复制
Text(value = "123") -> MyText(val = "123")

我应该如何迁移用户用以前版本的语法生成的现有数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-13 19:06:42

假设

让我们通过为TEXT字符串引入令牌'Text'来简化语法。

代码语言:javascript
复制
grammar TestGrammar;

WS : [ \t\r\n]+ -> channel(HIDDEN);  // preserve the whitespaces characters!
T_VALUE : 'value';
STRING : '"' .+? '"';
TEXT : 'Text';

term
    : textTerm;
textTerm
    : TEXT '(' T_VALUE '=' STRING+ ')';

解决方案

现在,我们将利用ANTLRv4工具构建的AST侦听器。这允许我们遍历AST并使用Lucas在注释中已经提到的TokenStreamRewriter类执行令牌替换。

代码语言:javascript
复制
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStreamRewriter;

public class MigrationTask extends TestGrammarBaseListener {
    private TokenStreamRewriter rewriter;

    public MigrationTask(CommonTokenStream stream) {
        this.rewriter = new TokenStreamRewriter(stream);
    }

    @Override
    public void enterTextTerm(TestGrammarParser.TextTermContext ctx) {
        rewriter.replace(ctx.TEXT().getSymbol(), "MyText");
        rewriter.replace(ctx.T_VALUE().getSymbol(), "val");
    }

    public String getMigrationResult() {
        return rewriter.getText();
    }
}

因此,当我们在AST的遍历过程中遇到令牌时,我们就用它的替代代替给定的令牌。

用法

现在,我们可以在给定的MigrationTask上执行ParseTree并检索迁移结果:

代码语言:javascript
复制
(...)
CommonTokenStream tokens = new CommonTokenStream(lexer);
TestGrammarParser parser = new TestGrammarParser(tokens);
ParseTree tree = parser.term();
ParseTreeWalker walker = new ParseTreeWalker();
MigrationTask migrationTask = new MigrationTask(tokens);
walker.walk(migrationTask, tree);
String result = migrationTask.getMigrationResult(); // Here we retrive migration result !
(...)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40402039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档