Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ANTLR:解析配置文件_Java_Antlr - Fatal编程技术网

Java ANTLR:解析配置文件

Java ANTLR:解析配置文件,java,antlr,Java,Antlr,我缺少一些基本知识。今天开始玩ATLR缺少任何告诉我如何执行以下操作的来源: 我想解析一个配置文件,我的一个程序目前以一种非常丑陋的方式读取。基本上它看起来像: A [Data] [Data] B [Data] [Data] [Data] 其中A/B/。。。以下是对象及其关联数据(动态量,仅为简单数字)。 语法应该没那么难,但是现在如何使用ANTLR呢 A/B是代币,我要他读的代币。如何询问此问题以及如何检测格式错误的输入 词法分析器和语法分析器:A/B是语法分析器规则和。。。如何知道解析器

我缺少一些基本知识。今天开始玩ATLR缺少任何告诉我如何执行以下操作的来源:

我想解析一个配置文件,我的一个程序目前以一种非常丑陋的方式读取。基本上它看起来像:

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]}我的问题不在于语法,而在于如何让解析器/词法分析器知道他们实际发现/解析了什么?最好的方法是:在识别递归描述之类的规则时调用函数。我的问题不是语法,而是如何让解析器/词法分析器知道他们实际发现/解析了什么?最好的方法是:在识别类似递归下降的规则时调用函数