标签: antlr4

标签x分配给不是一组的块

尝试升级antlr4,我在语法中有2行产生错误信息:

分配给不是一组的块的标签tok

特别是对于如下所示的语法行:

contextRadius: tok=('radius' 'change-authorize-nas-ip') (IP4_ADDRESS|IP6_ADDRESS) 'encrypted' 'key' ID 'port' INT_TOK 'event-timestamp-window' INT_TOK 'no-reverse-path-forward-check'
    ;
Run Code Online (Sandbox Code Playgroud)

这究竟意味着什么 - 成为一个"未设置的块"并且是否有一般解决方案?

antlr4

13
推荐指数
1
解决办法
2755
查看次数

我如何获得antlr4-maven-plugin的帮助

antlr4-maven-plugin似乎不是Antlr4网站上的文档.

antlr4

13
推荐指数
3
解决办法
5618
查看次数

如何定义在ANTLR4中可以出现在多种词法模式中的标记?

我正在学习ANTLR4并尝试使用词法模式.如何在多个词法模式中出现相同的标记?作为一个非常简单的例子,假设我的语法有两种模式,我想在这两种模式中匹配空格和行尾,我怎么能这样做而不以WS_MODE1和WS_MODE2为结尾.有没有办法在两种情况下重用相同的定义?我希望在输出流中获得所有空白区域的WS令牌,而不管模式如何.这同样适用于EOL和其他可在两种模式下出现的关键字.

lexer antlr4

13
推荐指数
1
解决办法
1578
查看次数

在ANTLR4语法中对第一个解析器规则进行返回声明的麻烦

我正在使用我的解析器规则的返回,它适用于除第一个之外的所有解析器规则.如果我的语法中的第一个解析器规则使用返回声明ANTLR4抱怨如下:

在匹配规则时期待ARG_ACTION

如果我添加另一个不使用"返回"的解析器规则,ANTLR不会抱怨.

在这里你有一个语法简化问题:

grammar FirstParserRuleReturnIssue;
ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
aRule returns [String s]: ID { $s = $ID.text; };
Run Code Online (Sandbox Code Playgroud)

我搜索了第一条规则的特殊角色,它可以解释行为,但没有找到任何东西.这是一个错误吗?我错过了一些理解吗?

antlr4

13
推荐指数
1
解决办法
2005
查看次数

获取所有Antlr解析错误作为字符串列表

  • 如何在字符串列表中获取Antlr的所有解析错误?

我用antlr如下:

ANTLRInputStream input = new ANTLRInputStream(System.in);
grLexer lexer = new grLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
grParser parser = new grParser(tokens);
ParseTree tree = parser.formula();
System.out.println(tree.toStringTree(parser));
Run Code Online (Sandbox Code Playgroud)

例如

line 1:0 token recognition error at: '('
line 1:1 token recognition error at: ')'
line 1:2 token recognition error at: '('
Run Code Online (Sandbox Code Playgroud)
  • 如何才能发现解析是在没有错误的情况下执行的?如果只有一个解析错误,我会停止.

例如

if(tree.hasError()) // FOR EXAMPLE
   return;
Run Code Online (Sandbox Code Playgroud)

java parsing jvm antlr4

13
推荐指数
2
解决办法
4715
查看次数

使用ANTLR嵌套的布尔表达式解析器

我正在尝试解析嵌套的布尔表达式并分别获取表达式中的各个条件.例如,如果输入字符串是:

(A = a OR B = b OR C = c AND((D = d AND E = e)OR(F = f AND G = g)))

我想以正确的顺序获得条件.即

D = d AND E = e OR F = f AND G = g AND A = a OR B = b OR C = c

我正在使用ANTLR 4来解析输入文本,这是我的语法:

grammar SimpleBoolean;

rule_set : nestedCondition* EOF;

AND : 'AND' ;
OR  : 'OR' ;
NOT : 'NOT';

TRUE  : 'TRUE' ;
FALSE : 'FALSE' ; …
Run Code Online (Sandbox Code Playgroud)

java parsing antlr antlr3 antlr4

13
推荐指数
1
解决办法
8760
查看次数

IntelliJ IDEA Gradle项目无法识别/定位Antlr生成的源

我在一个简单的Kotlin/Gradle项目中使用Antlr,而我的Gradle构建生成Antlr源,它们无法导入到项目中.

如您所见(左侧),正在生成类(Lexer/Parser等).我还将此generated-src/antlr/main目录配置为源根目录.我看到的大多数问题都将此列为解决方案,但我已经完成了.

多次重建(在IDEA和CLI上)并且遵循所有常见的"无效缓存和重新启动"问题后,问题仍然存在.

此外,导入问题在CLI上的Gradle构建中列出,因此它似乎与IDEA无关.

我在这里错过了什么?

在此输入图像描述

这是build.gradle我最初创建项目时IDEA生成的文件,以及IDEA用于项目/工作区同步的文件.

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.50'
}

group 'com.craigotis'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

apply plugin: 'antlr'

dependencies {
    antlr "org.antlr:antlr4:4.5"
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
Run Code Online (Sandbox Code Playgroud)

java intellij-idea gradle kotlin antlr4

13
推荐指数
1
解决办法
1317
查看次数

ANTLR4中的语义谓词?

你如何将ANTLR 3中编写的这部分代码翻译成ANTLR 4?

expr: (Identifier '.')=> (refIdentifier)
  | (Identifier '!')=> (refIdentifier)
  | (Identifier '=>')=> (lambdaExpression);
Run Code Online (Sandbox Code Playgroud)

我的意思是这种语义谓词现在似乎不存在.我可以用什么呢?

antlr antlr4

12
推荐指数
1
解决办法
6409
查看次数

如何使用ANTLR 4转义转义字符?

许多语言都使用某种引号绑定了一个字符串,如下所示:

"Rob Malda is smart."

ANTLR 4可以将这样的字符串与词法分析器规则匹配,如下所示:

QuotedString : '"' .*? '"';

要使用字符串中的某些字符,必须对它们进行转义,可能是这样的:

"Rob \"Commander Taco\" Malda is smart."

ANTLR 4也可以匹配这个字符串;

EscapedString : '"' ('\\"|.)*? '"';

(取自最终ANTLR 4参考文献的第96页)

这是我的问题:假设转义的字符与字符串分隔符是相同的字符.例如:

"Rob ""Commander Taco"" Malda is smart."

(这在Powershell中完全合法.)

lexer规则会匹配什么?我认为这会奏效:

EscapedString : '"' ('""'|.)*? '"';

但事实并非如此.词法分析器将转义字符标记"为字符串分隔符的结尾.

quotes antlr escaping antlr4

12
推荐指数
1
解决办法
5184
查看次数

使用有用的消息中止解析错误

我有一个ANTLR 4语法,并从中构建了一个词法分析器和解析器.现在我试图以这样的方式实例化该解析器,它将解析直到遇到错误.如果遇到错误,则不应继续解析,但应提供有关问题的有用信息; 理想情况下是机器可读的位置和人类可读的消息.

这就是我现在所拥有的:

grammar Toy;

@parser::members {

    public static void main(String[] args) {
        for (String arg: args)
            System.out.println(arg + " => " + parse(arg));
    }

    public static String parse(String code) {
        ErrorListener errorListener = new ErrorListener();
        CharStream cstream = new ANTLRInputStream(code);
        ToyLexer lexer = new ToyLexer(cstream);
        lexer.removeErrorListeners();
        lexer.addErrorListener(errorListener);
        TokenStream tstream = new CommonTokenStream(lexer);
        ToyParser parser = new ToyParser(tstream);
        parser.removeErrorListeners();
        parser.addErrorListener(errorListener);
        parser.setErrorHandler(new BailErrorStrategy());
        try {
            String res = parser.top().str;
            if (errorListener.message != null)
                return "Parsed, but " + errorListener.toString();
            return …
Run Code Online (Sandbox Code Playgroud)

java parsing antlr error-reporting antlr4

12
推荐指数
1
解决办法
1345
查看次数