【问题标题】:Antlr Grammar Java CodeAntlr 语法 Java 代码
【发布时间】:2026-01-25 15:45:01
【问题描述】:

我已经使用 Antlr3 定义了一种语法语言。 ANTLRWorks 生成词法分析器和解析器代码。

下面是一个示例语法:

grammar i;

@header {
package com.data;
}

elements    : (value (',' value)*)?;
insert      : 'INSERT INTO table' 'VALUES' '('elements')'';';
WS      : (' '|'\t'|'\f'|'\n'|'\r')+ {skip();}; // handle white space between keywords

上面的语法只是一个例子。我实际上正在为我的公司开发一个大语法。

我已将语法导入项目的 com.data 包中,可以使用生成的 Lexer 和 Parser。我想知道的:

  • Java 代码是否必须在语法中编写?
  • 我更喜欢使用 Lexer 和 Parser,并在另一个类中而不是在语法中编写 Java 代码。

根据以下帖子:ANTLR: Is there a simple example? 它显示了一个简单的示例。但是,在我的情况下,语法很大,并且希望语法被导入和使用。我有很多规则:

例如上面的语法生成这样的代码:

public void insert() throws RecognitionException;

处理此问题的最佳方法是什么?我有很多规则,返回类型为 void。

每条规则在 Java 术语中都有特定的含义。我认为最好的方法不是获取语法然后检查调用我的代码。例如:

String input = "INSERT INTO table VALUES (null);";
if(input.equals("INSERT INTO table VALUES (null);") {
     insertData();
}

public void insertData() {
   // insert data into database
}

检查每个语法并调用我的代码是个好主意吗?

【问题讨论】:

  • 首先,您看过 Scott Stanchfield 的视频教程了吗? javadude.com/articles/antlr3xtut
  • 第二,如果它是一个复杂的语法,你最好使用 AST 而不是嵌入。我正在做的工作相对简单(解析一些奇怪的 IF/THEN 语句)。
  • 我的是一个简单的语法。在我接触 *.com 之前,我已经看到了这一点。由于某些原因,我的视频似乎不起作用。我有一台很旧的笔记本电脑。你能提供以上的答案吗?否则,我必须先修好电脑。我现在没时间。
  • 我建议下载 VLC 媒体播放器并使用它来观看那些可下载的视频。在看他们之前,我一直在无用地翻来覆去。
  • 已经试过了,还是没有解决办法。是否有另一个网站可以指导我,而不是视频,它们将是文本。我真的没有时间修理我的笔记本电脑。

标签: java antlr


【解决方案1】:

两个问题的答案:

  1. 不,Java 代码不必嵌入到语法中。您可以改为生成 AST。我的语法很简单,所以我不会那样做。
  2. 可以使用 Observer/Vistor 模式处理生成的 AST。 Google 应该会为您提供一些信息。

【讨论】: