我正在为其他人正在编写的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); } ;
答案 0 :(得分:0)
你不能导入(它是import
,顺便说一句,而不是imports
)一个组合语法。参见ANTLR Wiki:
请注意,组合语法可能无法导入组合语法。这似乎限制了进口的深度,但事实并非如此。解析器语法不需要显式导入它们所依赖的词法分析器语法,这只在根复合语法中进行一次“粘合”其依赖语法。
- http://www.antlr.org/wiki/display/ANTLR3/Composite+Grammars
并且您不能在其存在的规则之外使用标签(first
规则中的statement
)。
可以做的是:
lexer grammar L;
WORD : ('A'..'z')* ;
SCOL : ';';
parser grammar P;
statement returns[String first, String last]
: WORD SCOL
{
$first = $WORD.text;
$last = $SCOL.text;
}
;
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 = ';'