1

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

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

例如,我可以这样做:

语法.g

grammar Grammar;

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

Java语法.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); } ;
4

1 回答 1

0

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

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

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

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

可以做的是:

档案:LG

lexer grammar L;

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

档案:PG

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  = ';'
于 2012-07-19T07:03:10.207 回答