如何在ANTLR 4中传递多个字符串不同的解析规则?

时间:2014-05-16 13:26:09

标签: java antlr antlr4

我正在尝试使用ANTLR 4.0开发工具。我是ANTLR和Advance Java的新手。我下载了包antlr-4.2.2-complete.jar。 ANTLER工作正常。 我几乎没有怀疑。

我拿了一个非常基本的语法,给出如下:

grammar test;
start : (aa) | (bb);
aa : A C D;
bb : A C B;
A : 'a';
B : 'b';
C : 'c';
D : 'd';
WS : [ \t\r\n] ->skip;

现在我正在使用命令提示符来解析其中的字符串..

C:\javalib\test>java org.antlr.v4.Tool test.g4
C:\javalib\test>javac test*.java
C:\javalib\test>java org.antlr.v4.runtime.misc.TestRig test start -gui -tree
**acb**
^Z
(start (bb a c b))
解析了

字符串acb,获得的输出为(start (bb a c b))。 现在,我想知道如何解析ANTLR中的manystrings /文件。该文件中的每一行都有不同的启动规则。 例如,我们要解析的文件看起来像(输入文件)

start : acb
bb : acb
aa : acd

我不能接受相应更改语法的建议,这样我就可以获得一个可用于所有字符串的启动规则,因为我工作的语法非常广泛。< / strong>

我可以更改输入字符串的格式,以便我们可以在ANTLR中轻松解析它。我想提出基本的想法,我有很多字符串,每个字符串都有不同的启动规则,我如何在ANTLR中解析它。

2 个答案:

答案 0 :(得分:1)

要使用给定规则解析每一行,您可以执行此操作。

testcase :
     singletest
     ( Linebreak singletest) *
     ;

singletest:
        'ruleA' ':' ruleA 
      | 'ruleB' ':' ruleB 
      |...
      ;


Whitespace: [ \t] -> skip; // no line break!
Linebreak: '\r\n' | '\r' | '\n';

答案 1 :(得分:0)

  

现在,我想知道如何解析ANTLR中的manystrings /文件。

要解析文件input.txt,请执行:

testLexer lexer = new testLexer(new ANTLRFileStream("input.txt"));
testParser parser = new testParser(new CommonTokenStream(lexer));
ParseTree tree = parser.start();
System.out.println(tree.toStringTree());