首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析表达式的示例: atom (加号减号)*

问解析表达式的示例: atom (加号减号)*
EN

Stack Overflow用户
提问于 2022-09-12 16:57:49
回答 1查看 38关注 0票数 0

Calculator.g4

代码语言:javascript
复制
grammar calculator;

expression: atom ((PLUS | MINUS) atom)*;

atom: '1';

PLUS: '+';

MINUS: '-';
WS: [ \r\n\t]+ -> skip;

有例子解释如何解析模式atom ((PLUS | MINUS) atom)*吗?

我搜索了很多博客,教我如何解析访问者和听者模型中的简单语法。但是,它们中没有一个展示了如何像atom ((PLUS | MINUS) atom)*那样解析模式。

我感到困惑的是,正/负是不同的,我可以用AllAtom方法对原子进行量程,但是没有方法可以得到相关的正负。应该有一个加/减的列表,它们可能彼此不一样。

EN

回答 1

Stack Overflow用户

发布于 2022-09-13 00:05:28

你可以通过稍微重写语法来完成它。我把正负提取成一个单独的规则。

代码语言:javascript
复制
grammar Calculator;

expression: atom (sign atom)*;

sign: PLUS | MINUS;

atom: '1';

PLUS: '+';

MINUS: '-';

WS: [ \r\n\t]+ -> skip;

下面是相应的侦听器:

代码语言:javascript
复制
public class Calculator extends CalculatorBaseListener {

    private int accum;
    private char sign;

    @Override
    public void enterAtom(CalculatorParser.AtomContext ctx) {
        int value = Integer.parseInt(ctx.getText());
        switch (sign) {
            case '\0':
                accum = value;
                break;
            case '+':
                accum += value;
                break;
            case '-':
                accum -= value;
                break;
        }
    }

    @Override
    public void enterSign(CalculatorParser.SignContext ctx) {
        sign = ctx.getText().charAt(0);
    }

    @Override
    public void exitExpression(CalculatorParser.ExpressionContext ctx) {
        System.out.println(accum);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73692733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档