gpt4 book ai didi

ANTLR4 书,计算器练习

转载 作者:行者123 更新时间:2023-12-02 21:30:39 27 4
gpt4 key购买 nike

我对antlr 的理解停留在非常基础的层面。浏览 Parr 博士的“权威 ANTLR 4 引用”。在第 4.2 节“使用访问者构建计算器”中列出了以下语法:

grammar LabeledExpr; // rename to distinguish from Expr.g4

prog: stat+ ;

stat: expr NEWLINE # printExpr
| ID '=' expr NEWLINE # assign
| NEWLINE # blank
;

expr: expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
| ID # id
| '(' expr ')' # parens
;

MUL : '*' ; // assigns token name to '*' used above in grammar
DIV : '/' ;
ADD : '+' ;
SUB : '-' ;
ID : [a-zA-Z]+ ; // match identifiers
INT : [0-9]+ ; // match integers
NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement signal)
WS : [ \t]+ -> skip ; // toss out whitespace

我正在尝试在上面添加书中的clear语句:

在继续之前,您可能需要花点时间尝试通过添加 clear 语句来扩展此表达式语言。 clear 命令应该清除内存映射,并且您需要在规则stat中使用新的替代方法来识别它。使用 #clear 标记替代方案,然后在语法上运行 ANTLR 以获取增强的访问者界面。

这是我的尝试:

grammar LabeledExpr;

prog: stat+ ;

stat: expr NEWLINE # printExpr
| ID '=' expr NEWLINE # assign
| clear NEWLINE # clearMem
| NEWLINE # blank
;

expr: expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
| ID # id
| '(' expr ')' # parens
;

clear: CLEAR
;

MUL: '*' ; // assigns token name to '*' used above in grammar
DIV: '/' ;
ADD: '+' ;
SUB: '-' ;

ID : [a-zA-Z]+ ;
INT : [0-9]+ ;
NEWLINE: '\r'?'\n' ;
WS : [ \t]+ -> skip ;
CLEAR: 'clear';

但是,visitClearMem 永远不会被调用:

@Override
public Integer visitClearMem(LabeledExprParser.ClearMemContext ctx) {
String text = ctx.getText();
if (text.equalsIgnoreCase("clear")) {
memory.clear();
}
return 0;
}

最佳答案

问题出在词法分析器中 CLEAR 规则的位置。由于输入 clear 与规则 IDCLEAR 均匹配,因此 ANTLR 选择语法中第一个出现的规则。在这种情况下,输入 clear 变为 ID

一般来说,您希望将您语言的所有关键字放置在其他标识符的规则之前,以确保它们正确匹配。

关于ANTLR4 书,计算器练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22386760/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com