这个语法有什么区别:
...
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)
?
如果有任何差异,因为这会影响性能......谢谢
我无法让"@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从语法文件生成java源代码.生成的源依赖于ANTLR类.
我可以使用ANTLR生成"干净"的java源代码,它没有任何antlr依赖性吗?
如果没有,有人可以推荐一些擅长性能的java解析器,并且可以生成干净的java代码吗?
我在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中启用它?
您希望在哪种情况下声明变量,全局范围或@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 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) 首先我知道这个语法没有意义但是它是为了测试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之前.谁能解释为什么会这样?
干杯
我有一种语言,基本上是将列映射到数组中的新结构.该语言旨在让产品经理定义映射,而无需了解大量编程细节.我相信这里还有很多需要改进的地方,但这就是我所拥有的.
这种语言主要起作用.我遇到的问题是条件语句.
我的解析器有以下规则:
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列表,但这个问题并没有得到很好的回答,很可能是因为它对他们来说似乎很明显.
我愿意发布完整的语法但是已经把它留下来保持这个简短.
所以我一直在使用ANTLR v3.4在Eclipse中制作语法,我已经制作了一个可行的语法,我想确保在编辑它时一切仍然有效.我每次都可以进入解释器,但这似乎是浪费时间.
问题:我已经阅读了关于gunit但是下载gUnit的链接:(http://antlr.org/hudson/job/gUnit/org.antlr $ gunit/lastSuccessfulBuild /)不起作用.我怎样才能获得gUnit.测试语法的最佳方法是什么?它实际上是gUnit还是我应该像jUnit测试一样进行java测试?
我为类似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)