gpt4 book ai didi

java - 如何使自动生成的解析器类实现 ANTLR4 中的接口(interface)?

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:34 25 4
gpt4 key购买 nike

我正在使用 ANTLR 4 创建一个解析器,并且我已经完成了我的语法。我需要将一些 Java 代码注入(inject)到 ANTLR 自动为我生成的解析器文件中。

如果我想在生成的解析器中包含一个方法,我可以将其添加到 ANTLR 语法中:

@parser::members
{
@Override
public CGrammarParser.CSnippetContext call()
{
return cSnippet();
}
}

如果我想包含一些导入语句,我可以将其添加到语法中:

@header
{
import java.lang.Thread;
import java.lang.InterruptedException;
import java.util.concurrent.Callable;
}

如果我想修改类声明以便它实现一个接口(interface),我该怎么做?换句话说,这是 ANTLR 自动生成的:

public class CGrammarParser extends Parser 
{
...
}

但这是我希望它生成的:

public class CGrammarParser extends Parser implements Callable<CGrammarParser.CSnippetContext> 
{
...
}

最佳答案

不,不像你描述的那样(通过接口(interface))。但是,您可以定义一个您的解析器应该扩展的父类(super class)。这个父类(super class)当然应该扩展 ANTLR 的 Parser 类。然后在您自己的(抽象)解析器类中,定义要实现的接口(interface)。

这是它的工作原理:

可调用解析器

import java.util.concurrent.Callable;
import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.TokenStream;

public abstract class CallableParser extends Parser implements Callable<CGrammarParser.CSnippetContext>
{
public CallableParser(TokenStream input)
{
super(input);
}
}

C语法.g4

grammar CGrammar;

options
{
superClass = CallableParser;
}

@header
{
import java.lang.Thread;
import java.lang.InterruptedException;
import java.util.concurrent.Callable;
}

@parser::members
{
@Override
public CGrammarParser.CSnippetContext call()
{
return cSnippet();
}
}

cSnippet
: ANY*? EOF
;

ANY
: .
;

关于java - 如何使自动生成的解析器类实现 ANTLR4 中的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34680230/

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