我已经获得了一个称为静态Java编译器的Java编译器子集的ANTLR语法.我正在尝试扩展语法以包含更多Java的功能,例如,我刚刚为For Loops添加了语法.
使用Eclipse和ANTLR插件,然后我做了"编译ANTLR语法".而不是编译它在第一个代码位上产生了两个错误:
grammar ExtendedStaticJava;
options { backtrack=true; memoize=true; }
@header
{
package sjc.parser.extended;
import java.math.BigInteger;
/**
* Extended StaticJava parser.
* @author <myname>
*/
}
// the rest of the grammar has been excluded.
Run Code Online (Sandbox Code Playgroud)
第一个错误在第1行:'Unexpected Token:grammar'第二个错误在第5行:'意外的char:@'
为什么它不能识别这种基本的ANTLR语法?我的第一个想法是我在类路径中遗漏了一些东西,但是我去了项目的属性,并确保在库下包含以下JAR :
任何想法或建议?
我有以下ANTLR语法:
grammar mygrammar;
ASSIGNMENT
: ID '=' INT
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INT : '0'..'9'+
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
Run Code Online (Sandbox Code Playgroud)
只有ASSIGNMENT规则实际上是我的,其余的是ANTLRWorks 1.4.3添加的默认值.
当我在解释器中尝试语法时,诸如"a = 5"之类的字符串成功,但是诸如"b [space] = [space] 6"之类的字符串失败:由于空格,我得到MismatchedTokenException:

从阅读ANTLR网站,和
Ignore rules: WS和
{$channel=HIDDEN} 文本/语法规则,似乎应该忽略空格,但事实并非如此.
我究竟做错了什么?
我写过这个语法:
expr : multExpr ( ('+' | '-') multExpr )*;
multExpr : atom ( ('*' | '/') atom )*;
atom : INT | FLOAT | ID | '(' expr ')';
condition : cond ('or' cond)*;
cond : c1 ('and' c1)*;
c1 : ('not')? c2;
c2 : '(' condition ')' | boolean;
boolean : expr (relop expr | ²) | 'true' | 'false';
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';
Run Code Online (Sandbox Code Playgroud)
我已经省略了INT,FLOAT,ID的词法规则,因为很明显.
问题是c2规则,它是模棱两可的,因为'(',我找不到解决方案,你能给我一个解决方案吗?
这是我第一次与ANTLR合作在伦敦帝国理工学院开展项目,直到现在它才非常有用.我已经定义了一个简单的递归语法如下
grammar Hello;
execution: workflow;
workflow : Task
| workflow OPERATOR workflow
|'(' workflow OPERATOR workflow ')'
|'(' workflow OPERATOR workflow ')' (OPERATOR workflow)*
;
Task : 'T' ('0'..'9')+ | 'WF' ('0'..'9')+;
OPERATOR: 'AND' | 'OR' | 'XOR' |';' ;
WS : [ \t\n\r]+ -> channel(HIDDEN) ;
Run Code Online (Sandbox Code Playgroud)
评估字符串,如:
T6 ; (T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND T5 OR T11
Run Code Online (Sandbox Code Playgroud)
并且它完美地运行,当我尝试评估不正确的字符串时,我的问题就出现了
T6 ; (T4 AND T7) ; T5 ; ( …Run Code Online (Sandbox Code Playgroud) 在ANTLR4中使用显式令牌定义有什么好处和缺点?我发现单个括号中的文本比创建单独的标记更具描述性且更易于使用,并使用它来代替文本.
例如:
grammar SimpleTest;
top: library | module ;
library: 'library' library_name ';' ;
library_name: IDENTIFIER;
module: MODULE module_name ';' ;
module_name: IDENTIFIER;
MODULE: 'module' ;
IDENTIFIER: [a-zA-Z0-9]+;
Run Code Online (Sandbox Code Playgroud)
生成的令牌是:
T__0=1
T__1=2
MODULE=3
IDENTIFIER=4
'library'=1
';'=2
'module'=3
Run Code Online (Sandbox Code Playgroud)
如果我对'library'"令牌" 不感兴趣,因为规则已经确定了我所匹配的内容,而且无论如何我都会跳过它,用LIBRARY令牌声明替换它是否有意义?(然后令牌的数量会增加.)为什么这是ANTLRWorks中的警告?
我必须定义一个文件的语法,如下所示.
//示例文件
NameCount = 4
Name = a
Name = b
Name = c
Name = d
//文件结尾
现在我可以为NameCount和Name定义标记.但我必须定义文件结构,包括令牌名称的有效实例数,这是NameCount之后的值.我将值解析并转换为整数并存储在语法的全局范围内的变量中(例如在变量nc中).
如何在语法中定义Name应该重复nc次?
我正在玩ANTLR,并希望创建一个这样的函数:
MOVE x y z pitch roll
Run Code Online (Sandbox Code Playgroud)
这会产生以下AST:
MOVE
|---x
|---y
|---z
|---pitch
|---roll
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试过没有运气,并且我不断让AST将参数作为兄弟姐妹,而不是孩子.
代码到目前为止:
C#:
class Program
{
const string CRLF = "\r\n";
static void Main(string[] args)
{
string filename = "Script.txt";
var reader = new StreamReader(filename);
var input = new ANTLRReaderStream(reader);
var lexer = new ScorBotScriptLexer(input);
var tokens = new CommonTokenStream(lexer);
var parser = new ScorBotScriptParser(tokens);
var result = parser.program();
var tree = result.Tree as CommonTree;
Print(tree, "");
Console.Read();
}
static void Print(CommonTree tree, string indent)
{ …Run Code Online (Sandbox Code Playgroud) 我最近开始学习Antlr并下载AntlrWorks 1.4,据说包括Antlr 3.2.现在,3.2应该支持像' - >'这样的重写规则语法,但是我甚至无法得到基于Lexer或Parser规则构建的最简单的情况:
grammar TestRewrite;
ab : a b -> a;
a : A;
b : B;
A : 'a';
B : 'b';
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到错误:
[11:26:29] error(100): TestRewrite.g:3:13: syntax error: antlr: TestRewrite.g:3:13: unexpected token: a
Run Code Online (Sandbox Code Playgroud)
为什么是这样.结构看起来很简单:ab应该生成一棵树,其中只捕获一个节点.不是你怎么做的?我无法使用rooting('^')或忽略('!').我很困惑.
我使用ANTLRWorks来获得简单的语法:
grammar boolean;
// [...]
lowercase_string
: ('a'..'z')+ ;
Run Code Online (Sandbox Code Playgroud)
但是,根据口译员的lowercase_string不符foobar(MismatchedSetException(10!={}).想法?
我肯定错过了什么.下载AntlrWorks2后,我找到了可执行文件bin/antlrworks2.exe和bin/antlrworks264.exe.这些应该是该工具的独立版本吗?对我来说都不适用; 在NetBeans启动画面之后,我第一次收到丢失包的错误消息; 经过几次我选择继续下去,但现在(仍然在最初的spash屏幕之后)根本没有任何事情发生.
我找不到任何教程或手册详细说明如何独立运行AntlrWorks,所以非常感谢任何帮助.
我对编译器,解析器和解析器生成器感兴趣,但我对它们知之甚少.
在阅读了这个问题的答案之后,我尝试制作一个"非常"简单的LaTeX解析器.
这是代码:
grammar Latex;
latex : ITEM*;
ITEM : CMD|LAWTEXT;
CMD : CHEAD ARGS;
CHEAD : '\\' LETTER(LETTER|DIGIT)*;
LETTER : 'A'..'Z'|'a'..'z';
DIGIT : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
ARGS : '{' ITEM* '}';
LAWTEXT : (LETTER|DIGIT|WHITESPACE|PUNC)*;
WHITESPACE
: ' '|'\t'|'\n'|'\r';
PUNC : '!'|'^';
Run Code Online (Sandbox Code Playgroud)
(PUNC中只有两个字符用于测试目的)
这是错误消息:
[18:39:09] warning(200): C:\Users\***\Documents\Latex.g:9:12: Decision can match input such as "{'\t'..'\n', '\r', ' '..'!', '0'..'9', 'A'..'Z', '\\', '^', 'a'..'z', '}'}" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[18:39:09] error(201): …Run Code Online (Sandbox Code Playgroud) 我正在通过我的自定义语法处理我的输入文件并提取令牌并将其返回到HashMap.在ANTLR 3中,我能够通过rule()在解析器上调用方法并获取HashMap类似的东西来解析文件parser.record.
这似乎在ANTLR 4中不起作用.我参考了这本书,看来我必须调用parser.init()才能开始解析但我在解析器中看不到任何方法.
我使用ANTLRWorks 2生成我的词法分析器和解析器文件.我没有生成监听器类.