Java ANTLR:解析配置文件
我缺少一些基本知识。今天开始玩ATLR缺少任何告诉我如何执行以下操作的来源: 我想解析一个配置文件,我的一个程序目前以一种非常丑陋的方式读取。基本上它看起来像:Java ANTLR:解析配置文件,java,antlr,Java,Antlr,我缺少一些基本知识。今天开始玩ATLR缺少任何告诉我如何执行以下操作的来源: 我想解析一个配置文件,我的一个程序目前以一种非常丑陋的方式读取。基本上它看起来像: A [Data] [Data] B [Data] [Data] [Data] 其中A/B/。。。以下是对象及其关联数据(动态量,仅为简单数字)。 语法应该没那么难,但是现在如何使用ANTLR呢 A/B是代币,我要他读的代币。如何询问此问题以及如何检测格式错误的输入 词法分析器和语法分析器:A/B是语法分析器规则和。。。如何知道解析器
A [Data] [Data]
B [Data] [Data] [Data]
其中A/B/。。。以下是对象及其关联数据(动态量,仅为简单数字)。
语法应该没那么难,但是现在如何使用ANTLR呢
- A/B是代币,我要他读的代币。如何询问此问题以及如何检测格式错误的输入
- 词法分析器和语法分析器:A/B是语法分析器规则和。。。如何知道解析器成功处理了A/B?同一个对象可以多次出现在文件中,我需要考虑每一个对象。这更像是在配置文件中列出实例
我的问题不是语法,而是如何让解析器/词法分析器知道他们实际发现/解析了什么?最好的方法是:在识别递归下降之类的规则时调用函数语法应该是这样的(它是伪代码而不是ANTLR):
语法应该是这样的(它是伪代码而不是ANTLR):
如果您正在寻找在解析某些内容时执行代码的方法,则应使用操作或AST(在文档中查找)。如果您正在寻找在解析某些内容时执行代码的方法,则应使用操作或AST(在文档中查找)。ANTLR生产规则可以具有返回值您可以使用获取配置文件的内容 下面是一个快速演示:
grammar T;
parse returns [java.util.Map<String, List<Integer>> map]
@init{$map = new java.util.HashMap<String, List<Integer>>();}
: (line {$map.put($line.key, $line.values);} )+ EOF
;
line returns [String key, List<Integer> values]
: Id numbers (NL | EOF)
{
$key = $Id.text;
$values = $numbers.list;
}
;
numbers returns [List<Integer> list]
@init{$list = new ArrayList<Integer>();}
: (Num {$list.add(Integer.parseInt($Num.text));} )+
;
Num : '0'..'9'+;
Id : ('a'..'z' | 'A'..'Z')+;
NL : '\r'? '\n' | '\r';
Space : (' ' | '\t')+ {skip();};
语法T;
解析返回[java.util.Map]
@init{$map=new java.util.HashMap();}
:(行{$map.put($line.key,$line.values);})+EOF
;
行返回[字符串键,列表值]
:身份证号码(NL | EOF)
{
$key=$Id.text;
$values=$numbers.list;
}
;
数字返回[列表]
@init{$list=newArrayList();}
:(Num{$list.add(Integer.parseInt($Num.text));})+
;
数字:“0”…“9”+;
Id:('a'..'z'|'a'..'z')+;
NL:“\r”?”\n'|'\r';
空格:(''|'\t')+{skip();};
如果您运行以下类:
import org.antlr.runtime.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
String input = "A 12 34\n" +
"B 5 6 7 8\n" +
"C 9";
TLexer lexer = new TLexer(new ANTLRStringStream(input));
TParser parser = new TParser(new CommonTokenStream(lexer));
Map<String, List<Integer>> values = parser.parse();
System.out.println(values);
}
}
import org.antlr.runtime.*;
导入java.util.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串输入=“A 12 34\n”+
“B 5 6 7 8\n”+
“C 9”;
TLexer lexer=新的TLexer(新的AntlStringStream(输入));
TParser parser=newtparser(newcommontokenstream(lexer));
Map values=parser.parse();
System.out.println(值);
}
}
以下内容将打印到控制台:
{A=[12, 34], B=[5, 6, 7, 8], C=[9]}
{A=[12,34],B=[5,6,7,8],C=[9]}ANTLR生产规则可以有返回值,您可以使用这些返回值来获取配置文件的内容 下面是一个快速演示:
grammar T;
parse returns [java.util.Map<String, List<Integer>> map]
@init{$map = new java.util.HashMap<String, List<Integer>>();}
: (line {$map.put($line.key, $line.values);} )+ EOF
;
line returns [String key, List<Integer> values]
: Id numbers (NL | EOF)
{
$key = $Id.text;
$values = $numbers.list;
}
;
numbers returns [List<Integer> list]
@init{$list = new ArrayList<Integer>();}
: (Num {$list.add(Integer.parseInt($Num.text));} )+
;
Num : '0'..'9'+;
Id : ('a'..'z' | 'A'..'Z')+;
NL : '\r'? '\n' | '\r';
Space : (' ' | '\t')+ {skip();};
语法T;
解析返回[java.util.Map]
@init{$map=new java.util.HashMap();}
:(行{$map.put($line.key,$line.values);})+EOF
;
行返回[字符串键,列表值]
:身份证号码(NL | EOF)
{
$key=$Id.text;
$values=$numbers.list;
}
;
数字返回[列表]
@init{$list=newArrayList();}
:(Num{$list.add(Integer.parseInt($Num.text));})+
;
数字:“0”…“9”+;
Id:('a'..'z'|'a'..'z')+;
NL:“\r”?”\n'|'\r';
空格:(''|'\t')+{skip();};
如果您运行以下类:
import org.antlr.runtime.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
String input = "A 12 34\n" +
"B 5 6 7 8\n" +
"C 9";
TLexer lexer = new TLexer(new ANTLRStringStream(input));
TParser parser = new TParser(new CommonTokenStream(lexer));
Map<String, List<Integer>> values = parser.parse();
System.out.println(values);
}
}
import org.antlr.runtime.*;
导入java.util.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串输入=“A 12 34\n”+
“B 5 6 7 8\n”+
“C 9”;
TLexer lexer=新的TLexer(新的AntlStringStream(输入));
TParser parser=newtparser(newcommontokenstream(lexer));
Map values=parser.parse();
System.out.println(值);
}
}
以下内容将打印到控制台:
{A=[12, 34], B=[5, 6, 7, 8], C=[9]}
{A=[12,34],B=[5,6,7,8],C=[9]}我的问题不在于语法,而在于如何让解析器/词法分析器知道他们实际发现/解析了什么?最好的方法是:在识别递归描述之类的规则时调用函数。我的问题不是语法,而是如何让解析器/词法分析器知道他们实际发现/解析了什么?最好的方法是:在识别类似递归下降的规则时调用函数