簡體   English   中英

調試Python ANTLR4語法

[英]Debugging Python ANTLR4 Grammar

我的ANTLR4語法有問題,無法正確解析字符串。 與解決特定問題相比,我對學習如何解決問題更感興趣。 如何生成任何類型的調試信息? 我想知道解析器在解析字符串時在“思考”什么。

可以在這里找到語法: https : //github.com/Metrink/metrink-fe/blob/master/metrink.g4

我正在使用簡單的測試字符串: -1d metric('blah', 'blah', 'blah')

我收到以下錯誤: 1:2 missing TIME_INDICATOR at 'd'

語法將TIME_INDICATOR定義為[shmd]所以我不確定當字符d是可能的標記之一時,它如何在字符d上缺少TIME_INDICATOR 我在這里想念什么?

我正在使用從ANTLR4生成的Python3。

我通常要做的是先轉儲令牌,以查看是否創建了解析器期望的實際令牌。

您可以使用像這樣的小型測試類來做到這一點(輕松移植到Python):

public class Main {

    static void test(String input) {

        metrinkLexer lexer = new metrinkLexer(new ANTLRInputStream(input));
        CommonTokenStream tokenStream = new CommonTokenStream(lexer);
        tokenStream.fill();

        System.out.printf("input: `%s`\n", input);

        for (Token token : tokenStream.getTokens()) {
            if (token.getType() != TLexer.EOF) {
                System.out.printf("  %-20s %s\n", metrinkLexer.VOCABULARY.getSymbolicName(token.getType()), token.getText());
            }
        }

        System.out.println();
    }

    public static void main(String[] args) throws Exception {
        test("-1d metric('blah', 'blah', 'blah')");
    }
}

如果運行上面的代碼,則以下內容將打印到控制台:

input: `-1d metric('blah', 'blah', 'blah')`
  MINUS                -
  INTEGER_LITERAL      1
  IDENTIFIER           d
  METRIC               metric
  LPAREN               (
  STRING_LITERAL       'blah'
  COMMA                ,
  STRING_LITERAL       'blah'
  COMMA                ,
  STRING_LITERAL       'blah'
  RPAREN               )

如您所見, d被標記為IDENTIFIER而不是TIME_INDICATOR 這是因為IDENTIFIER規則是在TIME_INDICATOR規則之前定義的。 詞法分析器不會“偵聽”解析器可能需要的內容,它只會匹配盡可能多的字符,如果兩個或多個規則匹配相同數量的字符,則定義的規則將首先“獲勝”。

因此, d可以標記為TIME_INDICATORIDENTIFIER 如果這取決於上下文,建議您將其標記為IDENTIFIER (並刪除TIME_INDICATOR ),然后創建一個解析器規則,如下所示:

relative_time_literal:
    MINUS? INTEGER_LITERAL time_indicator;

time_indicator:
    {_input.LT(1)getText().matches("[shmd]")}? IDENTIFIER;

{ ... }? 被稱為謂語: ANTLR4中的語義謂語?

同樣, FALSETRUE將需要放在IDENTIFIER規則之前。

暫無
暫無

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

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