我正在使用 ANTLR4 来上课,我似乎理解其中的大部分内容,但我不明白“+”的作用。我只能说它通常位于括号中的一组字符之后。
您好,当使用以下输入运行 antlr4 时,我收到以下 显示问题的错误图像
[![图像显示问题[1]](https://i.stack.imgur.com/nxx7o.png)
我一直试图通过在这里和那里进行一些更改来修复它,但似乎只有当我在新行中编写whileLoop 的每个组件时它才有效。
你能告诉我我在这里缺少什么以及为什么问题仍然存在吗?
grammar AM;
COMMENTS :
'{'~[\n|\r]*'}' -> skip
;
body : ('BODY' ' '*) anything | 'BODY' 'BEGIN' anything* 'END' ;
anything : whileLoop | write ;
write : 'WRITE' '(' '"' sentance '"' ')' ;
read : 'READ' '(' '"' sentance '"' ')' ;
whileLoop : 'WHILE' expression 'DO' ;
block : 'BODY' anything 'END';
expression : 'TRUE'|'FALSE' ;
test …Run Code Online (Sandbox Code Playgroud) 我在 ANTLR4 语法中有一个语句,例如:
expression : DEFAULT #primitive_expression
;
Run Code Online (Sandbox Code Playgroud)
我不知道#这里是什么意思。
请考虑以下语法。我在运算符优先级方面遇到问题,例如:res = 2 * a + b具有与res = 2 *(a + b)类似的解析树。我知道问题出在哪里,但是我想到没有相互左递归的“美丽”解决方案。你能帮我一下吗。语法与自定义访问者一起使用。
grammar Math;
expression: expression add=('+'|'-') expression # expressionAddExpression
| expression mult='*' expression # expressionMultExpression
|'(' expression ')' # bracketExpression
| number # numberExpression
;
number: INT #int
| '(' number ')' #bracketNumber
| VARIABLE #var
;
VARIABLE: [A-Za-z][A-Za-z0-9]*;
INT: [0-9]+;
Run Code Online (Sandbox Code Playgroud) 我正在研究词法分析器和解析器语法,并使用 ANTLR 来创建基于 .g4 文件的解析器和词法分析器。但是,我很困惑 pushMode 和 popMode 通常做什么?
OPEN : '[' -> pushMode(BBCODE) ;
TEXT : ~('[')+ ;
mode BBCODE;
CLOSE : ']' -> popMode ;
Run Code Online (Sandbox Code Playgroud)
词法分析器语法中的 OPEN、pushMode、BBCODE、CLOSE 和 popMode 是什么意思?我尝试搜索这些模式,但没有明确的定义和解释。
当一个规则在 antlr4 中匹配,并且您获得该规则的文本时,词法分析器通常会删除空格
WS: [ \n\t\r]+ -> skip;
Run Code Online (Sandbox Code Playgroud)
是否可以在解析树访问者中询问“此规则是否跳过了任何空格?”
例如
WS: [ \n\t\r]+ -> skip;
ALPHA: [a-z];
NUMERIC: [0-9];
myrule: (ALPHA | NUMERIC)+;
Run Code Online (Sandbox Code Playgroud)
然后在访问者中(我使用的是 C++):
antlrcpp::Any MyVisitor::visitMyrule(dlParser::MyruleContext *ctx) {
if (ctx->didSkipSomeWhitespace()) {
/* There was whitespace */
} else {
/* There was no whitespace */
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
所以:
f56fhj => no whitespace
o9f g66ff o => whitespace
Run Code Online (Sandbox Code Playgroud)
我尝试获取标记的开始/停止索引,以便可以将文本长度与进入其中的字符数进行比较,但停止标记并不总是可用,如果是,则值不可用与我期望的索引对齐,并且访问形成令牌的原始输入字符似乎并不简单。
我有9种不同的语法.其中一个将被加载,具体取决于它正在解析的文件的第一行txt.
我正在考虑将词法分析器/解析器派生到sep中.类,然后在我得到匹配时立即实例化它们 - 不确定这是否会减慢我的速度但不会.我想一些基准测试是有序的.
真的,速度绝对是我的目标,但我知道这是丑陋的代码.
现在代码看起来像这样:
sin.mark(0)
site = findsite(txt)
sin.reset()
if ( site == "site1") {
loadlexer1;
loadparser1;
} else if (site == "site2") {
loadlexer2;
loadparser2;
}
.................
} else if (site == "site8") {
loadparser8;
loadparser8;
}
findsite(txt) {
...................
if line.indexOf("site1-identifier") {
site = site1;
} else if(line.indexOf("site2-identifier") {
site = site2;
} else if(line.indexOf("site3-identifier") {
site = site3;
}
.........................
} else if(line.indexOf("site8-identifier") {
site = site8;
}
}
Run Code Online (Sandbox Code Playgroud)
一些澄清
1)是的,我真的有9个不同的语法,我用antlr构建,所以他们将拥有自己的词法分析器/解析器objs.
2)是的,截至目前我们正在比较字符串,并且显然将用某种整数映射替换.我也考虑过将网站标识符粘贴到一个正则表达式中,但是我不认为这会加快任何速度.
3)是的,这是伪代码所以我不会对这里的语义过于挑剔.. …
我想接受0到255之间的十进制数.这是我能想到的最好的:
fragment my_token :
('0'..'9') | // 0 -> 9
('1'..'9' '0'..'9') | // 0 -> 99
('1' '0'..'9' '0'..'9') | // 100 -> 199
('2' '0'..'4' '0'..'9') | // 200 -> 249
('25' '0'..'5'); // 250 -> 255
但我只是一个无知的n00b.Surelry还有更好的方法吗?
我过去几个小时一直在网上搜索,试图学习一个使用ANTLR的简单例子.但是我很难理解这些例子.是否有任何正文可以在Java中输出:
如果我的意见是
printf("Hello World");
输出应该是:
你好,世界
如果我的意见是
inx = 1;
它应该给出一条错误信息.
我正在尝试使用java创建一个c ++编译器(从词汇开始直到语义部分),我真的想知道我应该做什么.
我在Windows和视觉工作室工作,我的目标是尝试定义语法,以识别我遵循本指南的一些短语的部分 https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Getting+Started+与+ ANTLR + V4
一封信,当我这样做的时候
你好r -gui cmd没有显示任何内容,它没有显示任何类型的错误我怎么能解决这个问题?谢谢你们!!!
PS指南告诉添加antlr-4.5-complete.jar和链接下载antlr-4.2-complete,我试着用这个jar和4.4