标签: antlr

Antlr树重写规则

我正在尝试解析一个表达式a IN [3 .. 5[,其中尖括号的方向决定了区间是包含还是排除.我希望将其重写为AST

             NODE-TYPE
                 |
    +------------+-----------+
    |            |           |
 variable  lower-bound  upper-bound
Run Code Online (Sandbox Code Playgroud)

其中NODE-TYPE是BTW_INCLUSIVE,BTW_EXCL_LOWER,BTW_EXCL_UPPER或BTW_EXCL_BOTH之一,具体取决于尖括号的方向.

我有以下解析规则:

interval_expr : expr1=variable IN
                (LBRACKET|RBRACKET)
                expr2=expression DOTDOT expr3=expression
                (LBRACKET|RBRACKET)
                -> ^(BETWEEN $expr1 $expr2 $expr3)
Run Code Online (Sandbox Code Playgroud)

这有效,但它不会创建正确的树节点类型.如何根据匹配的内容选择要创建的节点类型?

parsing antlr

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

JRuby和Jython使用什么解析器来生成JVM字节码?

你们知道JRuby和Jython使用什么解析器来生成JVM字节码吗?是ANTLR还是JavaCC,还是在实现中使用其他解析器?

jvm antlr jython jruby javacc

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

最好的解析器生成器,用于解析C++中的许多小文本?

出于性能原因,我将C#库移植到C++.在正常操作期间,此库需要解析大约150'000个数学表达式(想想excel公式),平均长度小于150个字符.

在C#版本中,我使用GOLD解析器生成解析代码.它可以在一秒钟内解析所有150'000个表达式.

因为我们正在考虑扩展我们的语言,所以我认为转向C++可能是改为ANTLR的好机会.我已将(简单)语法移植到ANTLR并从中生成C代码.解析150'000表达式需要12秒,因为对于每个表达式,我需要创建一个新的ANTL3_INPUT_STREAM,令牌流,词法分析器和解析器 - 至少在版本3.4中,没有办法重用它们.

我很感激有人可以给我一个推荐使用的内容 - GOLD当然是一个选项,虽然生成C++或C代码似乎比C#变种复杂得多.我的语法是LALR和LL(1)兼容.最重要的是解析小输入的性能.

c++ performance antlr parser-generator gold-parser

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

antlr:生成的Lexer源中缺少包声明

我正在为lexer和parser使用一个.g文件.我在语法文件中有以下几行:

@header {
package foo.bar;
}
Run Code Online (Sandbox Code Playgroud)

但是我发现包行只被放入生成的解析器源文件中,并且在FooLexer.java文件中丢失.有谁知道如何处理这个?

java antlr

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

StringTemplate与StringTemplateGroup

我成功使用StringTemplate 4在Visual Studio中进行代码生成.我已经安装了StringTemplate和ANTLR的扩展,它们非常棒.

在测试中,我可以弄清楚如何使用*.st4(StringTemplate)文件,但是如何使用*.stg(StringTemplateGroup)文件逃避了我.它是可以嵌入到另一个StringTemplate中的定义集合吗?如果是这样,那么从*.stg而不是*.st4生成的代码是什么样的?

c# antlr stringtemplate visual-studio

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

ANTLR4解析错误:输入时没有可行的替代方案

我有一个语法显然是错误的,因为解析一个简单的文件会产生奇怪的错误信息.

我尽可能地简化了以下语法而没有改变错误(如果你删除'this'了ANTLRWorks的树gui输出,那么int样本文件的标记会有不同的颜色,尽管结构看起来是相同的).

grammar DepClsJ_no_java_debug;

module   : ( methodDecl )* ;

methodDecl   : pathType Identifier '()' block ;

pathType   : Identifier | 'this' ;

block   : '{'
    ( localDecl ';'  )*
    ( statement  )*
    ( expr  )?
    '}'   ;

localDecl   : pathType Identifier ( '=' expr )?;

statement   : block | expr ';' ;

expr   : dotExpr ( '=' dotExpr  )* ;    dotExpr   : Identifier ( '.' Identifier )* ;

Identifier   : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
Run Code Online (Sandbox Code Playgroud)

演示代码:

void …
Run Code Online (Sandbox Code Playgroud)

grammar antlr parsing-error parse-error antlr4

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

如何制定包含同一令牌的几个出现的规则?

我正在使用ANTLR4来解析一个简单的脚本语言.

此语言对FOR循环使用以下语法:

FOR [I] = 1 to [N]
   instructions
NEXT [I]
Run Code Online (Sandbox Code Playgroud)

为了正确,FOR循环必须在FOR关键字之后和NEXT关键字之后具有完全相同的标记.

例如,这是正确的:

FOR I = 1 TO 10
NEXT I
Run Code Online (Sandbox Code Playgroud)

虽然这是不正确的:

FOR I = 1 TO 10
NEXT J
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有一个看起来像这样的规则:

forloop
    : FOR VARNAME EQUAL INT TO INT instructions NEXT VARNAME
    ;
Run Code Online (Sandbox Code Playgroud)

使用以下相关词法规则(我删除了常量关键字FOR : 'FOR';):

fragment ALPHA : [a-zA-Z_];
fragment ALPHANUM : [a-zA-Z_0-9];
fragment DIGIT : [0-9];
VARNAME : ALPHA ALPHANUM*;
INT : DIGIT+;
Run Code Online (Sandbox Code Playgroud)

但是,此规则将解释为第二个实际上不正确的示例.

如何告诉ANTLR4第二个VARNAME必须与规则中的第一个相同?

grammar antlr antlr4

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

ANTLR4 Lexer getTokens()返回0个令牌

我正在运行代码:https: //github.com/bkiers/antlr4-csv-demo.我想通过添加以下行来查看词法分析器分析的标记:

System.out.println("Number of tokens: " + tokens.getTokens().size())
Run Code Online (Sandbox Code Playgroud)

到Main.java:

public static void main(String[] args) throws Exception {  
    // the input source  
    String source =   
        "aaa,bbb,ccc" + "\n" +   
        "\"d,\"\"d\",eee,fff";  

    // create an instance of the lexer  
    CSVLexer lexer = new CSVLexer(new ANTLRInputStream(source));  

    // wrap a token-stream around the lexer  
    CommonTokenStream tokens = new CommonTokenStream(lexer);  

    // look at tokens analyzed
    System.out.println("Number of tokens: " + tokens.getTokens().size())

    // create the parser  
    CSVParser parser = new CSVParser(tokens);  

    // invoke the …
Run Code Online (Sandbox Code Playgroud)

java antlr antlr4

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

XText正确打开回溯

我在X-Text中有一个很大的语法,它有一些含糊之处.我完全知道这将导致的问题,但我希望能够在我优化它之前测试语法.

我一直试图在X-Text工作流程中打开回溯,似乎无法管理它.我在主项目下的mwe2文件中有以下代码:

language = StandardLanguage {
        fragment=parser.antlr.XtextAntlrGeneratorFragment2 auto-inject{
            options = {
                backtrack= true
            }
        }
        fragment=idea.parser.antlr.XtextAntlrIDEAGeneratorFragment auto-inject{
            options={
                backtrack=true
            }
        }
...
Run Code Online (Sandbox Code Playgroud)

但我仍然在表单中遇到错误:

error(211): ../org.xtext.example.CSPTest/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl.g:1183:2: [fatal] rule ruleAny has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2.  Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
Run Code Online (Sandbox Code Playgroud)

我怎样才能正确打开回溯以防止这种情况发生?

antlr xtext

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

ANTLR如何决定应用哪个词法分析器规则?最长的匹配词法分析器规则获胜?

输入内容:

在此输入图像描述

语法:

grammar test;

p : EOF;

Char : [a-z];

fragment Tab : '\t';
fragment Space : ' ';
T1 : (Tab|Space)+ ->skip;

T2 : '#' T1+ Char+;
Run Code Online (Sandbox Code Playgroud)

匹配结果如下:

[@0,0:6='#   abc',<T2>,1:0]    <<<<<<<< PLACE 1
[@1,7:6='<EOF>',<EOF>,1:7]
line 1:0 extraneous input '#   abc' expecting <EOF>
Run Code Online (Sandbox Code Playgroud)

请忽略最后一行中的错误.我想知道为什么在PLACE 1匹配的令牌是T2.

在语法文件中,T2词法规则去T1词法规则.所以我希望T1首先应用规则.那么为什么# abc不跳过空格呢?

ANTLR是否使用一些贪婪策略来匹配当前字符流和最长的词法分析器规则?

compiler-construction antlr lexer antlr4

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