结合ANTLR和代码文件

时间:2012-07-18 22:02:28

标签: java antlr

我正在为其他人正在编写的ANTLR语法创建Java分析器。

是否可以组合ANTLR文件,以便我可以通过与原始语法(.g)文件分开的文件将括号内的Java代码添加到ANTLR生成的Java文件中?我已经研究了复合语法,但似乎我不能将现有语法作为组合词法分析器/解析器导入。

例如,我可以这样做:

Grammar.g

grammar Grammar;

statement   : first=WORD ';' ;
WORD        : ('A'..'z')* ;

JavaGrammar.g

grammar JavaGrammar;
imports Grammar;

@header {
    package pkg;
    import Container;
}

@lexer::header {
    package pkg;
}

@members{
    Container c = null;
    public void setContainer(Container c) { this.c = c; }

    @Override
    protected Object recoverFromMismatchedToken(IntStream input, int ttype, BitSet follow) throws RecognitionException {
      throw new MismatchedTokenException(ttype, input);
    }

    @Override
    public Object recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow) throws RecognitionException {
      throw e;
    }
}

@rulecatch {
    catch (RecognitionException e) {
        throw e;
    }
}

jStatement: statement { if(c!=null) c.add($first.text); } ;

1 个答案:

答案 0 :(得分:0)

你不能导入(它是import,顺便说一句,而不是imports)一个组合语法。参见ANTLR Wiki:

  

请注意,组合语法可能无法导入组合语法。这似乎限制了进口的深度,但事实并非如此。解析器语法不需要显式导入它们所依赖的词法分析器语法,这只在根复合语法中进行一次“粘合”其依赖语法。

     

- http://www.antlr.org/wiki/display/ANTLR3/Composite+Grammars

并且您不能在其存在的规则之外使用标签(first规则中的statement)。

可以做的是:

档案:L.g

lexer grammar L;

WORD : ('A'..'z')* ;
SCOL : ';';

档案:P.g

parser grammar P;

statement returns[String first, String last]
 : WORD SCOL
   {
     $first = $WORD.text;
     $last = $SCOL.text;
   }
 ;

file:JavaGrammar.g

grammar JavaGrammar;

import P, L;

@parser::members {
  public static void main(String[] args) throws Exception {
    L lexer = new L(new ANTLRStringStream("SO;"));
    JavaGrammarParser parser = new JavaGrammarParser(new CommonTokenStream(lexer));
    parser.jStatement(); 
  }
}

jStatement
 : statement 
   {
     System.out.println("statement       = '" + $statement.text + "'\n" + 
                        "statement.first = '" + $statement.first + "'\n" + 
                        "statement.last  = '" + $statement.last + "'");
   } 
 ;

使用main方法运行该类:

java -cp antlr-3.3-complete.jar org.antlr.Tool *.g
javac -cp antlr-3.3-complete.jar *.java
java -cp .:antlr-3.3-complete.jar JavaGrammarParser

你会看到以下内容被打印到控制台:

statement       = 'SO;'
statement.first = 'SO'
statement.last  = ';'