标签: antlr

ANTLR:"缺少对规则范围的属性访问"问题

我正在尝试构建一个解析标记句子的ANTLR语法,例如:

DT The NP cat VB ate DT a NP rat
Run Code Online (Sandbox Code Playgroud)

并有语法:

fragment TOKEN  :   (('A'..'Z') | ('a'..'z'))+;
fragment WS :   (' ' | '\t')+;
WSX :   WS;
DTTOK   :   ('DT' WS TOKEN);
NPTOK   :   ('NP' WS TOKEN);
nounPhrase:  (DTTOK WSX NPTOK);
chunker : nounPhrase {System.out.println("chunk found "+"("+$nounPhrase+")");};
Run Code Online (Sandbox Code Playgroud)

语法生成器missing attribute access on rule scope: nounPhrase在最后一行生成" ".

[我仍然是ANTLR的新手,虽然有些语法工作但它仍然是反复试验的.我还经常在运行像这样小的语法时遇到"OutOfMemory"错误 - 欢迎任何帮助.

我正在使用ANTLRWorks 1.3生成代码并在Java 1.6下运行.

java antlr

8
推荐指数
2
解决办法
6843
查看次数

编程语言解析器的来源?

我正在清理我的一个旧项目,它计算了一些关于大型软件项目的简单指标.其中一个指标是文件/类/方法的长度.目前我的代码"猜测"类/方法边界基于一个非常粗略的算法(遍历文件,保持"当前深度"并在遇到不带引号的括号时调整它;当你返回到关卡时,类或方法开始于,考虑退出).但是,这个过程存在许多问题,并且检测深度变化的"简单"方法并不总是有效.

为了使这个结果准确,我需要使用检测函数定义,类定义和深度变化的规范方法(在每种语言中).这相当于编写一个简单的解析器来生成解析树,该解析树至少包含我希望项目适用的每种语言的这些元素.

显然之前已经为所有这些语言编写了解析器,所以看起来我不应该重复这种努力(即使编写解析器很有趣). 是否有一些开源项目为一堆源语言收集即用型解析器库?或者我应该只是使用ANTLR从头开始创建自己的? (注意:我很高兴将项目移植到另一种语言来使用一个很好的现有资源,所以如果你知道一个,那么写入它的语言并不重要.)

parsing antlr code-metrics parser-generator

8
推荐指数
1
解决办法
1004
查看次数

在ANTLR中使用@header

我无法让"@header"或任何其他@规则在ANTLR中工作.使用非常基本的语法,如下所示:

grammar test;

options {
     language = CSharp2;
}

@header {
    using System.Collections.Generic;
}

tokens {
  TEST;
}

something : TEST*;

TEST : '0' .. '9'; 
Run Code Online (Sandbox Code Playgroud)

这似乎遵循ANTLR文档和在线的各种其他示例,但是当我尝试通过ANTLRWorks v1.4或ANTLR jar v3.2生成输出时,我收到以下错误:

无法生成语法,因为:

error(100):[path]\test.g:11:1语法错误:antlr:[path]\test.g:11:1意外令牌:令牌{

哪个我好像无法动摇.我能够在没有语法中包含@header的情况下成功生成词法分析器和解析器.我在Windows上有最新版本的Java:

java版"1.6.0_22"Java(TM)SE运行时环境(版本1.6.0_22-b04)Java HotSpot(TM)客户端VM(版本17.1-b03,混合模式,共享)

我认为这很简单,我只是对它视而不见,所以请提出明显的答案.

antlr header antlr3

8
推荐指数
1
解决办法
2734
查看次数

如何匹配ANTLR 3中固定数量的字符?

我想在我的ANTLR语法中解析ISO 8601日期.

2001-05-03
Run Code Online (Sandbox Code Playgroud)

我的语法文件中有以下条目:

date    : FOUR_DIGIT ('-')? TWO_DIGIT ('-')? TWO_DIGIT ;

FOUR_DIGIT
    : TWO_DIGIT TWO_DIGIT ; 

TWO_DIGIT
    : DIGIT DIGIT ;

DIGIT   : ('0'..'9') ;
Run Code Online (Sandbox Code Playgroud)

我知道我可以匹配一个或多个,DIGIT+零个或多个匹配DIGIT*

虽然这有效,是否有一个更简单的语法来指定我想要完全匹配2 DIGIT

grammar antlr antlr3

8
推荐指数
2
解决办法
3091
查看次数

我可以从生成的代码中删除ANTLR依赖项吗?

ANTLR从语法文件生成java源代码.生成的源依赖于ANTLR类.

我可以使用ANTLR生成"干净"的java源代码,它没有任何antlr依赖性吗?

如果没有,有人可以推荐一些擅长性能的java解析器,并且可以生成干净的java代码吗?

java antlr antlr3

8
推荐指数
1
解决办法
1090
查看次数

Eclipse不会自动生成分析器和Lexer文件

我在Eclipse Indigo上使用了antlr-3.4-complete-no-antlrv2.jar版本的ANTLR.

我已经安装了ANTLR IDE插件以及ZEST和GEF.当我生成组合语法文件并添加标题,词法分析器标头和规则时,Eclipse不会生成Parser和Lexer文件.

如果我使用antlr-3.2.jar就可以了.我可以使用java -classpath antlr-3.4-complete-no-antlrv2.jar org.antlr.Tool Sample.g在Eclipse之外生成Lexer和Parser文件(使用antlr-3.4.*).

有没有办法在Eclipse版本3.4中启用它?

eclipse antlr antlr3 antlrv3ide

8
推荐指数
1
解决办法
2183
查看次数

antlr全局规则范围声明vs @members声明

您希望在哪种情况下声明变量,全局范围或@members声明?在我看来,他们可以为同一目的服务?

这里更新是一个解释我的意思的语法.

grammar GlobalVsScope;

scope global{
  int i;
}
@lexer::header{package org.inanme.antlr;}
@parser::header{package org.inanme.antlr;}

@parser::members {
  int j;
}

start
scope global;
@init{
  System.out.println($global::i);
  System.out.println(j);
}:R EOF;

R:'which one';
Run Code Online (Sandbox Code Playgroud)

antlr antlr3

8
推荐指数
1
解决办法
2848
查看次数

ANTLR和Eclipse(或任何体面的IDE)

我使用ANTLRv3IDE插件已经使用ANTLR和Eclipse一段时间了.虽然它并不完美,而且有点过时,但它的工作做得相当不错.

现在我希望切换到ANTLRv4用于我正在创建的另一个DSL.但是,Eclipse支持似乎非常薄.我决定尝试一个NetBeans插件的ANTLRWorks,但是我无法安装它(它似乎被锁定到特定的日期版本(201302132200,而我有更新的东西,仍然是文档说的7.3)依赖项).

所以,问题是:有没有人设置任何 Java IDE(最好是Eclipse,但我可以被说服切换,如果支持对其他东西有好处)与ANTLR集成?使用集成,我的意思是:代码生成保存/键盘快捷方式和语法着色(至少).代码完成和其他功能当然很好,但我现在可以没有它们.

我很清楚Xtext,我在一些项目中使用它非常成功,但遗憾的是它不适合这里的需求(不需要IDE支持,需要我自己的DSL模型不基于ECore等).

我知道ANTLRWorks可以在没有Java IDE的情况下作为独立应用程序运行,但我认为这是最后的解决方案,因为以这种方式工作非常麻烦(在应用程序之间切换,文件不同步,没有VCS支持等) .我尝试了另一种方法:将Java部件安装到ANTLRworks(它本身就是一个NetBeans发行版)中,但它并没有很好地结束(似乎基本的项目支持等被从ANTLRworks中删除).

eclipse antlr antlrworks antlr4

8
推荐指数
1
解决办法
5242
查看次数

ANTLR解析树修改

我正在使用ANTLR4为我的语法创建一个解析树,我想要做的是修改树中的某些节点.这将包括删除某些节点并插入新节点.这背后的目的是优化我正在编写的语言.我还没有找到解决这个问题的方法.最好的方法是什么?

tree grammar parsing antlr

8
推荐指数
2
解决办法
3345
查看次数

编译ISO SQL-2003 ANTLR语法

我正在尝试从这里编译ISO-SQL 2003语法 http://www.antlr3.org/grammar/1304304798093/SQL2003_Grammar.zip.它的所有三个版本都可以在http://www.antlr3.org/grammar/list.html找到.

这些是我遵循的步骤,

  1. java -jar antlr-3.3-complete.jar -Xmx8G -Xwatchconversion sql2003Lexer.g
  2. java -jar antlr-3.3-complete.jar -Xmx8G -Xwatchconversion sql2003Parser.g
  3. javac ANTLRDemo.java

ANTLRDemo.java文件:

import org.antlr.runtime.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ANTLRDemo {
   static String readFile(String path) throws IOException 
   {
       byte[] encoded = Files.readAllBytes(Paths.get(path));
       return new String(encoded, "UTF-8");
   }

   public static void main(String[] args) throws Exception {
       ANTLRStringStream in = new ANTLRStringStream( readFile(args[0]) );
       sql2003Lexer lexer = new sql2003Lexer(in);
       CommonTokenStream tokens = new CommonTokenStream(lexer);
       sql2003Parser parser = …
Run Code Online (Sandbox Code Playgroud)

java sql parsing antlr

8
推荐指数
1
解决办法
288
查看次数