ANTLR4。使用操作访问上下文对象

ANTLR4。使用操作访问上下文对象,antlr,antlr4,Antlr,Antlr4,解析大小大于计算机内存的输入文件需要三个步骤: 无缓冲字符和令牌流的使用 从滑动缓冲区复制文本并存储在令牌中 要求解析器不要创建解析树 目标是简化语法来解析由多行组成的文件,每行由多个单词组成 考虑到这一要求,下面的代码使用@members操作并对ANTLR生成的解析器进行子分类 方法printPagesAndWords接收LineContext对象的列表 它打印总行数(使用LineContext提供的start方法),但无法使用LineContext对象提供的WORD()方法访问每行的字数 这

解析大小大于计算机内存的输入文件需要三个步骤:

  • 无缓冲字符和令牌流的使用
  • 从滑动缓冲区复制文本并存储在令牌中
  • 要求解析器不要创建解析树
  • 目标是简化语法来解析由多行组成的文件,每行由多个单词组成

    考虑到这一要求,下面的代码使用
    @members
    操作并对ANTLR生成的解析器进行子分类

    方法
    printPagesAndWords
    接收
    LineContext
    对象的列表

    它打印总行数(使用
    LineContext
    提供的start方法),但无法使用
    LineContext
    对象提供的
    WORD()
    方法访问每行的字数

    这是获得的输出:

    Number of lines in page:    3
    
    Line start token:           word1
    Number of words in line:    0
    
    Line start token:           2323
    Number of words in line:    0
    
    Line start token:           554545
    Number of words in line:    0
    
    此外,如果我试图把单词排在一行中,例如改变行

    System.out.println("Number of words in line:\t"+row.WORD().size()+"\n");
    
    按部就班

    System.out.println("Number of words in line:\t"+row.WORD(1).getText()+"\n");
    
    将引发以下异常:

    Exception in thread "main" java.lang.NullPointerException
        at TestContext.printPagesAndWords(TestContext.java:11)
        at ContextParser.read(ContextParser.java:130)
        at Main.main(Main.java:11)
    
    以下是完整的文件集:

    ContextLexer.g4

    lexer grammar ContextLexer;
    NL
     : '\r'? '\n'
     ;
    WORD
     : ~[ \t\n\r]+
     ;
    SPACE
     : [ \t] -> skip
     ;
    
    ContextParser.g4

    parser grammar ContextParser;
    
    options {
      tokenVocab=ContextLexer;
    }
    @members{
    void printPagesAndWords(List<LineContext> rows){};
    }
    read
     : dataLine+=line*  {printPagesAndWords($dataLine);}
     ;
    line
     : WORD* NL
     ;
    
    parser语法上下文parser;
    选择权{
    tokenVocab=上下文转换器;
    }
    @成员{
    无效打印页面和文字(列表行){};
    }
    阅读
    :dataLine+=line*{printPagesAndWords($dataLine);}
    ;
    线
    :WORD*NL
    ;
    
    扩展ContextParser的TestContext

    import org.antlr.v4.runtime.TokenStream;
    导入java.util.List;
    公共类TestContext扩展了ContextParser{
    公共测试上下文(令牌流输入){
    超级(输入);
    }
    作废打印页和文字(列出行){
    System.out.println(“页面中的行数:\t”+行数.size()+”\n”);
    用于(LineContext行:行){
    System.out.println(“行开始标记:\t\t\t”+row.start.getText());
    System.out.println(“行中的字数:\t”+行.字().size()+”\n”);
    }
    };
    }
    
    主要类别:

    import org.antlr.v4.runtime.*;
    导入java.io.IOException;
    公共班机{
    公共静态void main(字符串[]args)引发IOException{
    String source=“word1 word2 number另一个号码\n 2323 55r\n554545 lll 545\n”;
    ContextLexer lexer=新的ContextLexer(CharStreams.fromString(source));
    lexer.setTokenFactory(新的CommonTokenFactory(true));
    TokenStream tokens=新的无缓冲TokenStream(lexer);
    TestContext解析器=新的TestContext(令牌);
    setBuildParseTree(false);
    parser.read();
    }
    }