【问题标题】:Combining ANTLR and Code Files结合 ANTLR 和代码文件
【发布时间】:2012-07-19 15:03:10
【问题描述】:

我正在为其他人正在编写的 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); } ;

【问题讨论】:

    标签: java antlr


    【解决方案1】:

    您不能导入(这是import,顺便说一句,不是imports)组合语法。请参阅 ANTLR 维基:

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

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

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

    可以做的是:

    文件: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;
       }
     ;
    

    文件: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  = ';'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 2013-10-19
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多