gpt4 book ai didi

java - 结合 ANTLR 和代码文件

转载 作者:行者123 更新时间:2023-12-01 05:14:13 25 4
gpt4 key购买 nike

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

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

例如,我可以做这样的事情吗:

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

最佳答案

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

Please note that a combined grammar may not import a combined grammar. This may seem to limit the depth of imports but it's not the case. Parser grammars don't need to explicitly import the lexer grammar they rely on, this is done only once in the root composite grammar which "glues" its dependent grammars.

-- 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 = ';'

关于java - 结合 ANTLR 和代码文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11551038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com