簡體   English   中英

ANTLR4 TokenStream,getText方法

[英]ANTLR4 TokenStream, getText method

我正在嘗試理解ANTLR4令牌,我有一個關於令牌字符串表示的問題。 考慮以下簡單語法:

grammar Test;

init: integer IDENTIFIER; 

integer: INT;

IDENTIFIER: [a-zA-Z]+;
INT: [0-9]+;

生成的解析器得到了這個:

public static class InitContext extends ParserRuleContext {
    public IntegerContext integer() {
        return getRuleContext(IntegerContext.class,0);
    }
    public TerminalNode IDENTIFIER() { return getToken(TestParser.IDENTIFIER, 0); }
    public InitContext(ParserRuleContext parent, int invokingState) {
        super(parent, invokingState);
    }
    @Override public int getRuleIndex() { return RULE_init; }
    @Override
    public void enterRule(ParseTreeListener listener) {
        if ( listener instanceof TestListener ) ((TestListener)listener).enterInit(this);
    }
    @Override
    public void exitRule(ParseTreeListener listener) {
        if ( listener instanceof TestListener ) ((TestListener)listener).exitInit(this);
    }
}

現在,在生成的偵聽器中,如果我們將它作為參數傳遞給構造函數,我們可以使用解析器本身,如下所示:

public class TestListener extneds TestBaseListener{

    private final TestParser parser;

    public TestListener(TestParser parser){
        this.parser = parser;
    }

    @Override 
    public void enterInit(TestParser.InitContext ctx) { 
         TokenStrem stream = parser.getTokenStream();
         String str = stream.getText(ctx.init());
         //do some with str
    }
}

問題可能是愚蠢的,但我沒有看到使用TokenStream::getText(RuleContext)方法的任何TokenStream::getText(RuleContext) 我們可以做同樣的事情,而不會引入對解析器的依賴。 只需調用ctx.init().getText()

難道你不能解釋為什么引入這種方法。 目前,我沒有看到使用它的任何有用的后果。

參與parser.getTokenStream()然后調用stream.getText(ctx.init())只是為了提高性能。 與解析器關聯的令牌流是緩存,並直接記住InitContext的文本。 然而,通過ctx.init().getText()這是從所有后代建立文本,如下面所示inplementation

@Override
public String getText() {
    if (getChildCount() == 0) {
        return "";
    }

    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < getChildCount(); i++) {
        builder.append(getChild(i).getText());
    }

    return builder.toString();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM