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();
}
}