标签: antlr3

ANTLR语法:parser和lexer文字

这个语法有什么区别:

...
if_statement : 'if' condition 'then' statement 'else' statement 'end_if';
... 
Run Code Online (Sandbox Code Playgroud)

还有这个:

...
if_statement : IF condition THEN statement ELSE statement END_IF;
...

IF : 'if';
THEN: 'then';
ELSE: 'else';
END_IF: 'end_if';
....
Run Code Online (Sandbox Code Playgroud)

如果有任何差异,因为这会影响性能......谢谢

parsing antlr token lexer antlr3

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

在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依赖项吗?

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 3.2中的C++代码生成准备好了吗?

我正在努力使ANTLR 3.2在C++中生成解析器/词法分析器.它毫无结果.尽管Java和C的事情进展顺利.

我正在使用本教程开始:http://www.ibm.com/developerworks/aix/library/au-c_plusplus_antlr/index.html

当我检查*.stg文件时,我发现:

CPP只有

./tool/src/main/resources/org/antlr/codegen/templates/CPP/CPP.stg
Run Code Online (Sandbox Code Playgroud)

C有这么多文件:

./tool/src/main/resources/org/antlr/codegen/templates/C/AST.stg
./tool/src/main/resources/org/antlr/codegen/templates/C/ASTDbg.stg
./tool/src/main/resources/org/antlr/codegen/templates/C/ASTParser.stg
./tool/src/main/resources/org/antlr/codegen/templates/C/ASTTreeParser.stg
./tool/src/main/resources/org/antlr/codegen/templates/C/C.stg
./tool/src/main/resources/org/antlr/codegen/templates/C/Dbg.stg
Run Code Online (Sandbox Code Playgroud)

等等语言.

我的Cg文件:

grammar C;

options { language='CPP'; }

/** Match things like "call foo;" */
r : 'call' ID ';' {System.out.println("invoke "+$ID.text);} ;
ID: ('a'..'z'|'A'..'Z'|'_')('0'..'9'|'a'..'z'|'A'..'Z'|'_')* ;
WS: (' ' |'\n' |'\r' )+ {$channel=HIDDEN;} ; // ignore whitespace
Run Code Online (Sandbox Code Playgroud)

错误:

error(10):  internal error: group Cpp does not satisfy interface ANTLRCore: missing templates [lexerRuleRefAndListLabel, parameterSetAttributeRef, scopeSetAttributeRef, returnSetAttributeRef, lexerRulePropertyRef_text, lexerRulePropertyRef_type, lexerRulePropertyRef_line, lexerRulePropertyRef_pos, lexerRulePropertyRef_index, lexerRulePropertyRef_channel, lexerRulePropertyRef_start, lexerRulePropertyRef_stop, ruleSetPropertyRef_tree, ruleSetPropertyRef_st] …
Run Code Online (Sandbox Code Playgroud)

c++ parsing code-generation lexer antlr3

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

Antlr规则优先级

首先我知道这个语法没有意义但是它是为了测试ANTLR规则优先级行为而创建的

grammar test;

options 
{

output=AST;
backtrack=true;
memoize=true;

}

rule_list_in_order :
    (
    first_rule
    | second_rule
    | any_left_over_tokens)+
    ;


first_rule
    :
     FIRST_TOKEN
    ;


second_rule:     
    FIRST_TOKEN NEW_LINE SECOND_TOKEN NEW_LINE;


any_left_over_tokens
    :
    NEW_LINE
    | FIRST_TOKEN
    | SECOND_TOKEN;



FIRST_TOKEN
    : 'First token here'
    ;   

SECOND_TOKEN
    : 'Second token here';

NEW_LINE
    : ('\r'?'\n')   ;

WS  : (' '|'\t'|'\u000C')
    {$channel=HIDDEN;}
    ;
Run Code Online (Sandbox Code Playgroud)

当我给这个语法输入'第一个令牌在这里\n第二个令牌在这里'时,它匹配second_rule.

我原以为它匹配第一个规则然后是any_left_over_tokens,因为first_rule出现在rule_order_list中作为起点的second_rule之前.谁能解释为什么会这样?

干杯

antlr antlr3

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

如果那么其他条件评估

我有一种语言,基本上是将列映射到数组中的新结构.该语言旨在让产品经理定义映射,而无需了解大量编程细节.我相信这里还有很多需要改进的地方,但这就是我所拥有的.

这种语言主要起作用.我遇到的问题是条件语句.

我的解析器有以下规则:

conditionalexpr :  IF^ LPAREN! (statement) RPAREN! THEN! LCURLY! statement RCURLY! (ELSE! LCURLY! statement RCURLY!)?;
Run Code Online (Sandbox Code Playgroud)

这适用于生成有三个孩子的树.

我的问题是如果条件不允许,则避免评估语句.

天真地我做了:

conditionalexpr returns[Object o]: 
  ^(IF a=statement b=statement (c=statement)?)
  {
    $o = (Boolean)$a.o ? $b.o : $c.o != null ? $c.o : "";
  }
  ;
Run Code Online (Sandbox Code Playgroud)

显然这不起作用.

我一直在玩语法谓词,但我不能让它们正常工作.

语句当前返回一个对象.主要是语言处理字符串,但我需要支持布尔值和数字(整数和小数).

如果我添加{$ ao}之类的东西?=>我在生成的代码中得到$ a.

我已经查看了antlr-interest列表,但这个问题并没有得到很好的回答,很可能是因为它对他们来说似乎很明显.

我愿意发布完整的语法但是已经把它留下来保持这个简短.

java antlr antlr3

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

测试ANTLR语法

所以我一直在使用ANTLR v3.4在Eclipse中制作语法,我已经制作了一个可行的语法,我想确保在编辑它时一切仍然有效.我每次都可以进入解释器,但这似乎是浪费时间.

问题:我已经阅读了关于gunit但是下载gUnit的链接:(http://antlr.org/hudson/job/gUnit/org.antlr $ gunit/lastSuccessfulBuild /)不起作用.我怎样才能获得gUnit.测试语法的最佳方法是什么?它实际上是gUnit还是我应该像jUnit测试一样进行java测试?

java grammar antlr3

7
推荐指数
2
解决办法
5536
查看次数

"FOLLOW_set_in _"...在生成的解析器中未定义

我为类似Java的DSL编写了一个语法.虽然它仍然存在一些问题(它不能像我希望的那样识别所有输入),但最让我担心的是生成的C代码是不可编译的.

我使用AntlrWorks 1.5和Antlr 3.5(Antlr 4显然不支持C目标).

问题在于表达规则.我有规则prio14Expression到prio0Expression,它处理运算符优先级.问题是优先级2,它评估前缀和后缀运算符:

...
prio3Expression: prio2Expression (('*' | '/' | '%') prio2Expression)*;

prio2Expression: ('++' | '--' | '!' | '+' | '-')* prio1Expression ('++' | '--')*;  

prio1Expression:
    prio0Expression (
        ('.' prio0Expression) |
        ('(' (expression (',' expression)*)? ')') |
        ('[' expression (',' expression)* ']')
    )*;

prio0Expression: 
    /*('(') => */('(' expression ')') |
    IDENTIFIER |
    //collectionLiteral |
    coordinateLiteral |
    'true' |
    'false' |
    NUMBER |
    STRING 
    ;
...
Run Code Online (Sandbox Code Playgroud)

表达式是prio14Expression的标签.你可以在这里看到完整的语法.

代码生成本身是成功的(没有任何错误或严重警告).它生成以下代码:

CONSTRUCTEX();
EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
EXCEPTION->name         = (void …
Run Code Online (Sandbox Code Playgroud)

c grammar antlr antlrworks antlr3

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

标签 统计

antlr3 ×10

antlr ×8

java ×3

grammar ×2

lexer ×2

parsing ×2

antlrv3ide ×1

antlrworks ×1

c ×1

c++ ×1

code-generation ×1

eclipse ×1

header ×1

token ×1