标签: antlr

为什么 ANTLR 不解析整个输入?

我对 ANTLR 很陌生,所以这可能是一个简单的问题。
我定义了一种简单的语法,它应该包含带有数字和标识符的算术表达式(以字母开头并以一个或多个字母或数字继续的字符串。)

语法如下:

grammar while;

@lexer::header {
  package ConFreeG;
}  

@header {
  package ConFreeG;
  
  import ConFreeG.IR.*;
}

@parser::members {
}

arith:
    term
    | '(' arith ( '-' | '+' | '*' ) arith ')'  
    ;
    
term  returns [AExpr a]:    
    NUM
    {
        int n = Integer.parseInt($NUM.text);
        a = new Num(n);
    }
    | IDENT
    {
        a = new Var($IDENT.text);
    }
    ;

fragment LOWER : ('a'..'z');
fragment UPPER : ('A'..'Z');
fragment NONNULL : ('1'..'9');
fragment NUMBER : ('0' | NONNULL);
IDENT …
Run Code Online (Sandbox Code Playgroud)

parsing antlr context-free-grammar

4
推荐指数
1
解决办法
1309
查看次数

如何捕获antlr3树语法中的标记列表?

我以一种虚拟语言为例:它只接受一个或多个“!”。它的词法分析器和语法规则是:

grammar Ns;

options {
  output=AST;
  ASTLabelType=CommonTree;
}
tokens {
  NOTS;
}

@header { 
  package test;
}
@lexer::header {
  package test;
}

ns : NOT+ EOF -> ^(NOTS NOT+);

NOT : '!';
Run Code Online (Sandbox Code Playgroud)

好的,如您所见,这代表一种接受“!”的语言 或者 '!!!' 或者 '!!!!!'...

我定义了一些有意义的类来构建 AST:

public class Not {
    public static final Not SINGLETON = new Not();

    private Not() {
    }
}



public class Ns {
    private List<Not> nots;

    public Ns(String nots) {
        this.nots = new ArrayList<Not>();
        for (int i = 0; i < nots.length(); i++) …
Run Code Online (Sandbox Code Playgroud)

antlr antlr3

4
推荐指数
1
解决办法
1351
查看次数

ANTLR 4 中规则中的选项发生了什么变化?

这在 ANTLR 4 中无法编译:

Number options { backtrack=true; }
  : (IntegerLiteral Range)=> IntegerLiteral { $type = IntegerLiteral; }
  | (FloatLiteral)=> FloatLiteral { $type = FloatLiteral; }
  | IntegerLiteral { $type = IntegerLiteral; }
  ;
Run Code Online (Sandbox Code Playgroud)

因为backtrace=true...发生了什么?

除了它之外,我应该在 ANTLR 4 中使用什么?

antlr antlr4

4
推荐指数
1
解决办法
1675
查看次数

C#、ANTLR4 和命名空间

我最近开始玩 ANTLR4 和 C#。我喜欢扩展为 Visual Studio 提供的全面支持。我不喜欢的是,每当我生成 Lexer/Parser 时,它都会进入我项目的默认命名空间 - 这不是我想要的,因为它会自动生成,尝试将其推入项目的默认命名空间是一种无望的活动。手动正确的命名空间。有什么办法可以改变这种情况吗?@parser/lexer::namespace { } 和选项中的名称空间(带或不带指定语言)似乎不起作用。

有什么办法可以做到吗?

谢谢!

c# antlr namespaces antlr4

4
推荐指数
1
解决办法
2513
查看次数

antlr 帕斯卡语法恐慌

我想生成Pascaljava 解析器,然后在我的gradle应用程序中使用它。

因为Pascal我使用了这个语法 https://github.com/antlr/grammars-v4/tree/master/pascal

我的build.gradle样子是这样的 我用了antlr插件。

apply plugin: 'groovy'
apply plugin: 'antlr'

repositories {
    jcenter()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.6'
    compile 'org.antlr:antlr4:4.5.3'

    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
    testCompile 'junit:junit:4.12'
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行任务时generateGrammarSource出现此错误

:generateGrammarSource
L:\app\src\main\antlr\pascal.g4:36:1: unexpected token: grammar
error: Token stream error reading grammar(s):
L:\app\src\main\antlr\pascal.g4:804:8: expecting ''', found '='
L:\app\src\main\antlr\pascal.g4:36:1: unexpected token: grammar
error: Token stream error reading grammar(s):
L:\app\src\main\antlr\pascal.g4:804:8: expecting ''', found '='
L:\app\src\main\antlr\pascal.g4:36:1: rule grammar trapped:
L:\app\src\main\antlr\pascal.g4:36:1: unexpected token: grammar
TokenStreamException: …
Run Code Online (Sandbox Code Playgroud)

java antlr gradle

4
推荐指数
1
解决办法
985
查看次数

如何安装antlr4?

我在 github 上的 antlr4 文档中阅读了很多内容,我有点了解它是如何工作的。问题是我不是专业的java编码员,我正在尝试将antlr4与python一起使用。

无论如何,我在执行此步骤时遇到了死胡同

antlr4 -Dlanguage=Python2 Hello.g4
Run Code Online (Sandbox Code Playgroud)

我下载了antlr4complete.jar,但我不知道如何设置或使用它。有什么帮助吗?

python java antlr python-2.7 antlr4

4
推荐指数
2
解决办法
1万
查看次数

将 ANTLR 解析树转换为 JSON

我有一个有效的语法并实现了一个监听器(在 Java 中)。我可以在控制台中用缩进显示解析树,但是我想将它导出为 JSON 结构,以便它可以在任何通用查看器中使用。

是否有一种已经制作的方法可以做到这一点,或者我是否必须以某种方式完全从头开始创建 json 文件?

谢谢!

PS:我还设法通过 TreeView 类在 Swing 中显示...

java parsing json antlr antlr4

4
推荐指数
1
解决办法
3765
查看次数

如何在ANTLR的访问者模式下检查令牌的替代品?

我想使用 ANTLR 的访问者模式构建一个简单的规则引擎,但是当它带有替代令牌时,我很困惑如何获取哪个替代令牌。谁能帮我吗?(抱歉我的英语不好)

grammar RuleExpression;
expression: '(' Operator arg* ')';
arg: STRING|INTEGER|BOOLEAN|expression;
STRING: '"' .+ '"';
INTEGER: [0-9]+;
BOOLEAN: 'true'|'false';
Operator: [a-zA-Z]+[0-9]*;
WS : [ \t\r\n]+ -> skip;
Run Code Online (Sandbox Code Playgroud)

如何知道 arg 是 STRING、INTEGER、BOOLEAN 或表达式?

java antlr compilation

4
推荐指数
1
解决办法
161
查看次数

ANTLR v3 C#命名空间

希望这是一个非常快的;)我在ANTLR3中编写了一个词法分析器/解析器规范,并且定位于CSharp2目标.生成的代码可以正常工作,但是我无法通过ANTLR将C#输出放入命名空间.

语法文件的相关部分如下:

grammar MyGrammar;

options
{
    language = CSharp2;
    output = AST;
    ASTLabelType = CommonTree;
}
Run Code Online (Sandbox Code Playgroud)

为了生成正确的命名空间,我尝试过:

@namespace { MyNamespace }
Run Code Online (Sandbox Code Playgroud)

@lexer::namespace { MyNamespace }
@parser::namespace { MyNamespace }
Run Code Online (Sandbox Code Playgroud)

但这两个都会产生错误,声称该文件没有规则.

任何帮助表示赞赏.

antlr namespaces

3
推荐指数
1
解决办法
2539
查看次数

在ANTLR中捕获"所有其他"字符

我正在尝试将ANTLR定义的语法集成到NetBeans中,到目前为止,有效的语法工作正常.但是,当前如果输入任何未在某处语言中定义的字符(例如,"?"字符),自定义编辑器会立即崩溃,因为它无法找到该字符的规则.

在没有整个词法分析器崩溃和刻录的情况下,ANTLR中是否有一种方法可以捕获并跳过与规则不匹配的每个字符(并且可能输出错误消息)?我想标记无效字符,跳过它们,然后继续lexing,例如:

//some rules + tokens

invalidCharacter
    :    <<catch all other characters>>
        {System.out.println("undefined character entered!")}
    ;
Run Code Online (Sandbox Code Playgroud)

任何帮助都会被批准.

grammar antlr character lexer

3
推荐指数
1
解决办法
2420
查看次数